switch Cyclone to submodule on it's own git repo
[picodrive.git] / cpu / mz80 / mz80.c
1 #include "driver.h"
2
3 /* Multi-Z80 32 Bit emulator */
4
5 /* Copyright 1996-2000 Neil Bradley, All rights reserved
6  *
7  * License agreement:
8  *
9  * (MZ80 Refers to both the assembly code emitted by makeZ80.c and makeZ80.c
10  * itself)
11  *
12  * MZ80 May be distributed in unmodified form to any medium.
13  *
14  * MZ80 May not be sold, or sold as a part of a commercial package without
15  * the express written permission of Neil Bradley (neil@synthcom.com). This
16  * includes shareware.
17  *
18  * Modified versions of MZ80 may not be publicly redistributed without author
19  * approval (neil@synthcom.com). This includes distributing via a publicly
20  * accessible LAN. You may make your own source modifications and distribute
21  * MZ80 in source or object form, but if you make modifications to MZ80
22  * then it should be noted in the top as a comment in makeZ80.c.
23  *
24  * MZ80 Licensing for commercial applications is available. Please email
25  * neil@synthcom.com for details.
26  *
27  * Synthcom Systems, Inc, and Neil Bradley will not be held responsible for
28  * any damage done by the use of MZ80. It is purely "as-is".
29  *
30  * If you use MZ80 in a freeware application, credit in the following text:
31  *
32  * "Multi-Z80 CPU emulator by Neil Bradley (neil@synthcom.com)"
33  *
34  * must accompany the freeware application within the application itself or
35  * in the documentation.
36  *
37  * Legal stuff aside:
38  *
39  * If you find problems with MZ80, please email the author so they can get
40  * resolved. If you find a bug and fix it, please also email the author so
41  * that those bug fixes can be propogated to the installed base of MZ80
42  * users. If you find performance improvements or problems with MZ80, please
43  * email the author with your changes/suggestions and they will be rolled in
44  * with subsequent releases of MZ80.
45  *
46  * The whole idea of this emulator is to have the fastest available 32 bit
47  * Multi-Z80 emulator for the PC, giving maximum performance. 
48  */
49
50 #include <stdio.h>
51 #include <stdlib.h>
52 #include <string.h>
53 #include "mz80.h"
54 UINT32 z80intAddr;
55 UINT32 z80pc;
56
57
58 /* Modular global variables go here*/
59
60 static CONTEXTMZ80 cpu; /* CPU Context */
61 static UINT8 *pbPC;                     /* Program counter normalized */
62 static UINT8 *pbSP;                     /* Stack pointer normalized */
63 static struct MemoryReadByte *psMemRead; /* Read memory structure */
64 static struct MemoryWriteByte *psMemWrite; /* Write memory structure */
65 static struct z80PortRead *psIoRead; /* Read I/O structure */
66 static struct z80PortWrite *psIoWrite; /* Write memory structure */
67 static INT32 sdwCyclesRemaining; /* Used as a countdown */
68 static UINT32 dwReturnCode; /* Return code from exec() */
69 static UINT32 dwOriginalCycles; /* How many cycles did we start with? */
70 static UINT32 dwElapsedTicks;   /* How many ticks did we elapse? */
71 static INT32 sdwAddr;           /* Temporary address storage */
72 static UINT32 dwAddr;           /* Temporary stack address */
73 static UINT8 *pbAddAdcTable;    /* Pointer to add/adc flag table */
74 static UINT8 *pbSubSbcTable;    /* Pointer to sub/sbc flag table */
75 static UINT32 dwTemp;                   /* Temporary value */
76
77 static UINT8 bTemp;                     /* Temporary value */
78
79 static UINT8 bTemp2;            /* Temporary value */
80
81 /* Precomputed flag tables */
82
83 static UINT8 bPostIncFlags[0x100] = 
84 {
85         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
86         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
87         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
88         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
89         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
90         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
91         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
92         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,
93         0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x90,
94         0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x90,
95         0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x90,
96         0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x90,
97         0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x90,
98         0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x90,
99         0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x90,
100         0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x50
101 };
102
103 static UINT8 bPostDecFlags[0x100] = 
104 {
105         0x92,0x42,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
106         0x12,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
107         0x12,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
108         0x12,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
109         0x12,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
110         0x12,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
111         0x12,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
112         0x12,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
113         0x16,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
114         0x92,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
115         0x92,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
116         0x92,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
117         0x92,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
118         0x92,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
119         0x92,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
120         0x92,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82
121 };
122
123 static UINT8 bPostORFlags[0x100] = 
124 {
125         0x44,0x00,0x00,0x04,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,
126         0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00,
127         0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00,
128         0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,
129         0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00,
130         0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,
131         0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,
132         0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00,
133         0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,
134         0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,
135         0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,
136         0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,
137         0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,
138         0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,
139         0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,
140         0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84
141 };
142
143 static UINT8 bPostANDFlags[0x100] = 
144 {
145         0x54,0x10,0x10,0x14,0x10,0x14,0x14,0x10,0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,
146         0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,0x14,0x10,0x10,0x14,0x10,0x14,0x14,0x10,
147         0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,0x14,0x10,0x10,0x14,0x10,0x14,0x14,0x10,
148         0x14,0x10,0x10,0x14,0x10,0x14,0x14,0x10,0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,
149         0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,0x14,0x10,0x10,0x14,0x10,0x14,0x14,0x10,
150         0x14,0x10,0x10,0x14,0x10,0x14,0x14,0x10,0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,
151         0x14,0x10,0x10,0x14,0x10,0x14,0x14,0x10,0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,
152         0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,0x14,0x10,0x10,0x14,0x10,0x14,0x14,0x10,
153         0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94,0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,
154         0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94,
155         0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94,
156         0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94,0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,
157         0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94,
158         0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94,0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,
159         0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94,0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,
160         0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94
161 };
162
163 static UINT16 wDAATable[0x800] = 
164 {
165         0x5400,0x1001,0x1002,0x1403,0x1004,0x1405,0x1406,0x1007,
166         0x1008,0x1409,0x1010,0x1411,0x1412,0x1013,0x1414,0x1015,
167         0x1010,0x1411,0x1412,0x1013,0x1414,0x1015,0x1016,0x1417,
168         0x1418,0x1019,0x1020,0x1421,0x1422,0x1023,0x1424,0x1025,
169         0x1020,0x1421,0x1422,0x1023,0x1424,0x1025,0x1026,0x1427,
170         0x1428,0x1029,0x1430,0x1031,0x1032,0x1433,0x1034,0x1435,
171         0x1430,0x1031,0x1032,0x1433,0x1034,0x1435,0x1436,0x1037,
172         0x1038,0x1439,0x1040,0x1441,0x1442,0x1043,0x1444,0x1045,
173         0x1040,0x1441,0x1442,0x1043,0x1444,0x1045,0x1046,0x1447,
174         0x1448,0x1049,0x1450,0x1051,0x1052,0x1453,0x1054,0x1455,
175         0x1450,0x1051,0x1052,0x1453,0x1054,0x1455,0x1456,0x1057,
176         0x1058,0x1459,0x1460,0x1061,0x1062,0x1463,0x1064,0x1465,
177         0x1460,0x1061,0x1062,0x1463,0x1064,0x1465,0x1466,0x1067,
178         0x1068,0x1469,0x1070,0x1471,0x1472,0x1073,0x1474,0x1075,
179         0x1070,0x1471,0x1472,0x1073,0x1474,0x1075,0x1076,0x1477,
180         0x1478,0x1079,0x9080,0x9481,0x9482,0x9083,0x9484,0x9085,
181         0x9080,0x9481,0x9482,0x9083,0x9484,0x9085,0x9086,0x9487,
182         0x9488,0x9089,0x9490,0x9091,0x9092,0x9493,0x9094,0x9495,
183         0x9490,0x9091,0x9092,0x9493,0x9094,0x9495,0x9496,0x9097,
184         0x9098,0x9499,0x5500,0x1101,0x1102,0x1503,0x1104,0x1505,
185         0x5500,0x1101,0x1102,0x1503,0x1104,0x1505,0x1506,0x1107,
186         0x1108,0x1509,0x1110,0x1511,0x1512,0x1113,0x1514,0x1115,
187         0x1110,0x1511,0x1512,0x1113,0x1514,0x1115,0x1116,0x1517,
188         0x1518,0x1119,0x1120,0x1521,0x1522,0x1123,0x1524,0x1125,
189         0x1120,0x1521,0x1522,0x1123,0x1524,0x1125,0x1126,0x1527,
190         0x1528,0x1129,0x1530,0x1131,0x1132,0x1533,0x1134,0x1535,
191         0x1530,0x1131,0x1132,0x1533,0x1134,0x1535,0x1536,0x1137,
192         0x1138,0x1539,0x1140,0x1541,0x1542,0x1143,0x1544,0x1145,
193         0x1140,0x1541,0x1542,0x1143,0x1544,0x1145,0x1146,0x1547,
194         0x1548,0x1149,0x1550,0x1151,0x1152,0x1553,0x1154,0x1555,
195         0x1550,0x1151,0x1152,0x1553,0x1154,0x1555,0x1556,0x1157,
196         0x1158,0x1559,0x1560,0x1161,0x1162,0x1563,0x1164,0x1565,
197         0x1560,0x1161,0x1162,0x1563,0x1164,0x1565,0x1566,0x1167,
198         0x1168,0x1569,0x1170,0x1571,0x1572,0x1173,0x1574,0x1175,
199         0x1170,0x1571,0x1572,0x1173,0x1574,0x1175,0x1176,0x1577,
200         0x1578,0x1179,0x9180,0x9581,0x9582,0x9183,0x9584,0x9185,
201         0x9180,0x9581,0x9582,0x9183,0x9584,0x9185,0x9186,0x9587,
202         0x9588,0x9189,0x9590,0x9191,0x9192,0x9593,0x9194,0x9595,
203         0x9590,0x9191,0x9192,0x9593,0x9194,0x9595,0x9596,0x9197,
204         0x9198,0x9599,0x95a0,0x91a1,0x91a2,0x95a3,0x91a4,0x95a5,
205         0x95a0,0x91a1,0x91a2,0x95a3,0x91a4,0x95a5,0x95a6,0x91a7,
206         0x91a8,0x95a9,0x91b0,0x95b1,0x95b2,0x91b3,0x95b4,0x91b5,
207         0x91b0,0x95b1,0x95b2,0x91b3,0x95b4,0x91b5,0x91b6,0x95b7,
208         0x95b8,0x91b9,0x95c0,0x91c1,0x91c2,0x95c3,0x91c4,0x95c5,
209         0x95c0,0x91c1,0x91c2,0x95c3,0x91c4,0x95c5,0x95c6,0x91c7,
210         0x91c8,0x95c9,0x91d0,0x95d1,0x95d2,0x91d3,0x95d4,0x91d5,
211         0x91d0,0x95d1,0x95d2,0x91d3,0x95d4,0x91d5,0x91d6,0x95d7,
212         0x95d8,0x91d9,0x91e0,0x95e1,0x95e2,0x91e3,0x95e4,0x91e5,
213         0x91e0,0x95e1,0x95e2,0x91e3,0x95e4,0x91e5,0x91e6,0x95e7,
214         0x95e8,0x91e9,0x95f0,0x91f1,0x91f2,0x95f3,0x91f4,0x95f5,
215         0x95f0,0x91f1,0x91f2,0x95f3,0x91f4,0x95f5,0x95f6,0x91f7,
216         0x91f8,0x95f9,0x5500,0x1101,0x1102,0x1503,0x1104,0x1505,
217         0x5500,0x1101,0x1102,0x1503,0x1104,0x1505,0x1506,0x1107,
218         0x1108,0x1509,0x1110,0x1511,0x1512,0x1113,0x1514,0x1115,
219         0x1110,0x1511,0x1512,0x1113,0x1514,0x1115,0x1116,0x1517,
220         0x1518,0x1119,0x1120,0x1521,0x1522,0x1123,0x1524,0x1125,
221         0x1120,0x1521,0x1522,0x1123,0x1524,0x1125,0x1126,0x1527,
222         0x1528,0x1129,0x1530,0x1131,0x1132,0x1533,0x1134,0x1535,
223         0x1530,0x1131,0x1132,0x1533,0x1134,0x1535,0x1536,0x1137,
224         0x1138,0x1539,0x1140,0x1541,0x1542,0x1143,0x1544,0x1145,
225         0x1140,0x1541,0x1542,0x1143,0x1544,0x1145,0x1146,0x1547,
226         0x1548,0x1149,0x1550,0x1151,0x1152,0x1553,0x1154,0x1555,
227         0x1550,0x1151,0x1152,0x1553,0x1154,0x1555,0x1556,0x1157,
228         0x1158,0x1559,0x1560,0x1161,0x1162,0x1563,0x1164,0x1565,
229         0x1406,0x1007,0x1008,0x1409,0x140a,0x100b,0x140c,0x100d,
230         0x100e,0x140f,0x1010,0x1411,0x1412,0x1013,0x1414,0x1015,
231         0x1016,0x1417,0x1418,0x1019,0x101a,0x141b,0x101c,0x141d,
232         0x141e,0x101f,0x1020,0x1421,0x1422,0x1023,0x1424,0x1025,
233         0x1026,0x1427,0x1428,0x1029,0x102a,0x142b,0x102c,0x142d,
234         0x142e,0x102f,0x1430,0x1031,0x1032,0x1433,0x1034,0x1435,
235         0x1436,0x1037,0x1038,0x1439,0x143a,0x103b,0x143c,0x103d,
236         0x103e,0x143f,0x1040,0x1441,0x1442,0x1043,0x1444,0x1045,
237         0x1046,0x1447,0x1448,0x1049,0x104a,0x144b,0x104c,0x144d,
238         0x144e,0x104f,0x1450,0x1051,0x1052,0x1453,0x1054,0x1455,
239         0x1456,0x1057,0x1058,0x1459,0x145a,0x105b,0x145c,0x105d,
240         0x105e,0x145f,0x1460,0x1061,0x1062,0x1463,0x1064,0x1465,
241         0x1466,0x1067,0x1068,0x1469,0x146a,0x106b,0x146c,0x106d,
242         0x106e,0x146f,0x1070,0x1471,0x1472,0x1073,0x1474,0x1075,
243         0x1076,0x1477,0x1478,0x1079,0x107a,0x147b,0x107c,0x147d,
244         0x147e,0x107f,0x9080,0x9481,0x9482,0x9083,0x9484,0x9085,
245         0x9086,0x9487,0x9488,0x9089,0x908a,0x948b,0x908c,0x948d,
246         0x948e,0x908f,0x9490,0x9091,0x9092,0x9493,0x9094,0x9495,
247         0x9496,0x9097,0x9098,0x9499,0x949a,0x909b,0x949c,0x909d,
248         0x909e,0x949f,0x5500,0x1101,0x1102,0x1503,0x1104,0x1505,
249         0x1506,0x1107,0x1108,0x1509,0x150a,0x110b,0x150c,0x110d,
250         0x110e,0x150f,0x1110,0x1511,0x1512,0x1113,0x1514,0x1115,
251         0x1116,0x1517,0x1518,0x1119,0x111a,0x151b,0x111c,0x151d,
252         0x151e,0x111f,0x1120,0x1521,0x1522,0x1123,0x1524,0x1125,
253         0x1126,0x1527,0x1528,0x1129,0x112a,0x152b,0x112c,0x152d,
254         0x152e,0x112f,0x1530,0x1131,0x1132,0x1533,0x1134,0x1535,
255         0x1536,0x1137,0x1138,0x1539,0x153a,0x113b,0x153c,0x113d,
256         0x113e,0x153f,0x1140,0x1541,0x1542,0x1143,0x1544,0x1145,
257         0x1146,0x1547,0x1548,0x1149,0x114a,0x154b,0x114c,0x154d,
258         0x154e,0x114f,0x1550,0x1151,0x1152,0x1553,0x1154,0x1555,
259         0x1556,0x1157,0x1158,0x1559,0x155a,0x115b,0x155c,0x115d,
260         0x115e,0x155f,0x1560,0x1161,0x1162,0x1563,0x1164,0x1565,
261         0x1566,0x1167,0x1168,0x1569,0x156a,0x116b,0x156c,0x116d,
262         0x116e,0x156f,0x1170,0x1571,0x1572,0x1173,0x1574,0x1175,
263         0x1176,0x1577,0x1578,0x1179,0x117a,0x157b,0x117c,0x157d,
264         0x157e,0x117f,0x9180,0x9581,0x9582,0x9183,0x9584,0x9185,
265         0x9186,0x9587,0x9588,0x9189,0x918a,0x958b,0x918c,0x958d,
266         0x958e,0x918f,0x9590,0x9191,0x9192,0x9593,0x9194,0x9595,
267         0x9596,0x9197,0x9198,0x9599,0x959a,0x919b,0x959c,0x919d,
268         0x919e,0x959f,0x95a0,0x91a1,0x91a2,0x95a3,0x91a4,0x95a5,
269         0x95a6,0x91a7,0x91a8,0x95a9,0x95aa,0x91ab,0x95ac,0x91ad,
270         0x91ae,0x95af,0x91b0,0x95b1,0x95b2,0x91b3,0x95b4,0x91b5,
271         0x91b6,0x95b7,0x95b8,0x91b9,0x91ba,0x95bb,0x91bc,0x95bd,
272         0x95be,0x91bf,0x95c0,0x91c1,0x91c2,0x95c3,0x91c4,0x95c5,
273         0x95c6,0x91c7,0x91c8,0x95c9,0x95ca,0x91cb,0x95cc,0x91cd,
274         0x91ce,0x95cf,0x91d0,0x95d1,0x95d2,0x91d3,0x95d4,0x91d5,
275         0x91d6,0x95d7,0x95d8,0x91d9,0x91da,0x95db,0x91dc,0x95dd,
276         0x95de,0x91df,0x91e0,0x95e1,0x95e2,0x91e3,0x95e4,0x91e5,
277         0x91e6,0x95e7,0x95e8,0x91e9,0x91ea,0x95eb,0x91ec,0x95ed,
278         0x95ee,0x91ef,0x95f0,0x91f1,0x91f2,0x95f3,0x91f4,0x95f5,
279         0x95f6,0x91f7,0x91f8,0x95f9,0x95fa,0x91fb,0x95fc,0x91fd,
280         0x91fe,0x95ff,0x5500,0x1101,0x1102,0x1503,0x1104,0x1505,
281         0x1506,0x1107,0x1108,0x1509,0x150a,0x110b,0x150c,0x110d,
282         0x110e,0x150f,0x1110,0x1511,0x1512,0x1113,0x1514,0x1115,
283         0x1116,0x1517,0x1518,0x1119,0x111a,0x151b,0x111c,0x151d,
284         0x151e,0x111f,0x1120,0x1521,0x1522,0x1123,0x1524,0x1125,
285         0x1126,0x1527,0x1528,0x1129,0x112a,0x152b,0x112c,0x152d,
286         0x152e,0x112f,0x1530,0x1131,0x1132,0x1533,0x1134,0x1535,
287         0x1536,0x1137,0x1138,0x1539,0x153a,0x113b,0x153c,0x113d,
288         0x113e,0x153f,0x1140,0x1541,0x1542,0x1143,0x1544,0x1145,
289         0x1146,0x1547,0x1548,0x1149,0x114a,0x154b,0x114c,0x154d,
290         0x154e,0x114f,0x1550,0x1151,0x1152,0x1553,0x1154,0x1555,
291         0x1556,0x1157,0x1158,0x1559,0x155a,0x115b,0x155c,0x115d,
292         0x115e,0x155f,0x1560,0x1161,0x1162,0x1563,0x1164,0x1565,
293         0x5600,0x1201,0x1202,0x1603,0x1204,0x1605,0x1606,0x1207,
294         0x1208,0x1609,0x1204,0x1605,0x1606,0x1207,0x1208,0x1609,
295         0x1210,0x1611,0x1612,0x1213,0x1614,0x1215,0x1216,0x1617,
296         0x1618,0x1219,0x1614,0x1215,0x1216,0x1617,0x1618,0x1219,
297         0x1220,0x1621,0x1622,0x1223,0x1624,0x1225,0x1226,0x1627,
298         0x1628,0x1229,0x1624,0x1225,0x1226,0x1627,0x1628,0x1229,
299         0x1630,0x1231,0x1232,0x1633,0x1234,0x1635,0x1636,0x1237,
300         0x1238,0x1639,0x1234,0x1635,0x1636,0x1237,0x1238,0x1639,
301         0x1240,0x1641,0x1642,0x1243,0x1644,0x1245,0x1246,0x1647,
302         0x1648,0x1249,0x1644,0x1245,0x1246,0x1647,0x1648,0x1249,
303         0x1650,0x1251,0x1252,0x1653,0x1254,0x1655,0x1656,0x1257,
304         0x1258,0x1659,0x1254,0x1655,0x1656,0x1257,0x1258,0x1659,
305         0x1660,0x1261,0x1262,0x1663,0x1264,0x1665,0x1666,0x1267,
306         0x1268,0x1669,0x1264,0x1665,0x1666,0x1267,0x1268,0x1669,
307         0x1270,0x1671,0x1672,0x1273,0x1674,0x1275,0x1276,0x1677,
308         0x1678,0x1279,0x1674,0x1275,0x1276,0x1677,0x1678,0x1279,
309         0x9280,0x9681,0x9682,0x9283,0x9684,0x9285,0x9286,0x9687,
310         0x9688,0x9289,0x9684,0x9285,0x9286,0x9687,0x9688,0x9289,
311         0x9690,0x9291,0x9292,0x9693,0x9294,0x9695,0x9696,0x9297,
312         0x9298,0x9699,0x1334,0x1735,0x1736,0x1337,0x1338,0x1739,
313         0x1340,0x1741,0x1742,0x1343,0x1744,0x1345,0x1346,0x1747,
314         0x1748,0x1349,0x1744,0x1345,0x1346,0x1747,0x1748,0x1349,
315         0x1750,0x1351,0x1352,0x1753,0x1354,0x1755,0x1756,0x1357,
316         0x1358,0x1759,0x1354,0x1755,0x1756,0x1357,0x1358,0x1759,
317         0x1760,0x1361,0x1362,0x1763,0x1364,0x1765,0x1766,0x1367,
318         0x1368,0x1769,0x1364,0x1765,0x1766,0x1367,0x1368,0x1769,
319         0x1370,0x1771,0x1772,0x1373,0x1774,0x1375,0x1376,0x1777,
320         0x1778,0x1379,0x1774,0x1375,0x1376,0x1777,0x1778,0x1379,
321         0x9380,0x9781,0x9782,0x9383,0x9784,0x9385,0x9386,0x9787,
322         0x9788,0x9389,0x9784,0x9385,0x9386,0x9787,0x9788,0x9389,
323         0x9790,0x9391,0x9392,0x9793,0x9394,0x9795,0x9796,0x9397,
324         0x9398,0x9799,0x9394,0x9795,0x9796,0x9397,0x9398,0x9799,
325         0x97a0,0x93a1,0x93a2,0x97a3,0x93a4,0x97a5,0x97a6,0x93a7,
326         0x93a8,0x97a9,0x93a4,0x97a5,0x97a6,0x93a7,0x93a8,0x97a9,
327         0x93b0,0x97b1,0x97b2,0x93b3,0x97b4,0x93b5,0x93b6,0x97b7,
328         0x97b8,0x93b9,0x97b4,0x93b5,0x93b6,0x97b7,0x97b8,0x93b9,
329         0x97c0,0x93c1,0x93c2,0x97c3,0x93c4,0x97c5,0x97c6,0x93c7,
330         0x93c8,0x97c9,0x93c4,0x97c5,0x97c6,0x93c7,0x93c8,0x97c9,
331         0x93d0,0x97d1,0x97d2,0x93d3,0x97d4,0x93d5,0x93d6,0x97d7,
332         0x97d8,0x93d9,0x97d4,0x93d5,0x93d6,0x97d7,0x97d8,0x93d9,
333         0x93e0,0x97e1,0x97e2,0x93e3,0x97e4,0x93e5,0x93e6,0x97e7,
334         0x97e8,0x93e9,0x97e4,0x93e5,0x93e6,0x97e7,0x97e8,0x93e9,
335         0x97f0,0x93f1,0x93f2,0x97f3,0x93f4,0x97f5,0x97f6,0x93f7,
336         0x93f8,0x97f9,0x93f4,0x97f5,0x97f6,0x93f7,0x93f8,0x97f9,
337         0x5700,0x1301,0x1302,0x1703,0x1304,0x1705,0x1706,0x1307,
338         0x1308,0x1709,0x1304,0x1705,0x1706,0x1307,0x1308,0x1709,
339         0x1310,0x1711,0x1712,0x1313,0x1714,0x1315,0x1316,0x1717,
340         0x1718,0x1319,0x1714,0x1315,0x1316,0x1717,0x1718,0x1319,
341         0x1320,0x1721,0x1722,0x1323,0x1724,0x1325,0x1326,0x1727,
342         0x1728,0x1329,0x1724,0x1325,0x1326,0x1727,0x1728,0x1329,
343         0x1730,0x1331,0x1332,0x1733,0x1334,0x1735,0x1736,0x1337,
344         0x1338,0x1739,0x1334,0x1735,0x1736,0x1337,0x1338,0x1739,
345         0x1340,0x1741,0x1742,0x1343,0x1744,0x1345,0x1346,0x1747,
346         0x1748,0x1349,0x1744,0x1345,0x1346,0x1747,0x1748,0x1349,
347         0x1750,0x1351,0x1352,0x1753,0x1354,0x1755,0x1756,0x1357,
348         0x1358,0x1759,0x1354,0x1755,0x1756,0x1357,0x1358,0x1759,
349         0x1760,0x1361,0x1362,0x1763,0x1364,0x1765,0x1766,0x1367,
350         0x1368,0x1769,0x1364,0x1765,0x1766,0x1367,0x1368,0x1769,
351         0x1370,0x1771,0x1772,0x1373,0x1774,0x1375,0x1376,0x1777,
352         0x1778,0x1379,0x1774,0x1375,0x1376,0x1777,0x1778,0x1379,
353         0x9380,0x9781,0x9782,0x9383,0x9784,0x9385,0x9386,0x9787,
354         0x9788,0x9389,0x9784,0x9385,0x9386,0x9787,0x9788,0x9389,
355         0x9790,0x9391,0x9392,0x9793,0x9394,0x9795,0x9796,0x9397,
356         0x9398,0x9799,0x9394,0x9795,0x9796,0x9397,0x9398,0x9799,
357         0x97fa,0x93fb,0x97fc,0x93fd,0x93fe,0x97ff,0x5600,0x1201,
358         0x1202,0x1603,0x1204,0x1605,0x1606,0x1207,0x1208,0x1609,
359         0x160a,0x120b,0x160c,0x120d,0x120e,0x160f,0x1210,0x1611,
360         0x1612,0x1213,0x1614,0x1215,0x1216,0x1617,0x1618,0x1219,
361         0x121a,0x161b,0x121c,0x161d,0x161e,0x121f,0x1220,0x1621,
362         0x1622,0x1223,0x1624,0x1225,0x1226,0x1627,0x1628,0x1229,
363         0x122a,0x162b,0x122c,0x162d,0x162e,0x122f,0x1630,0x1231,
364         0x1232,0x1633,0x1234,0x1635,0x1636,0x1237,0x1238,0x1639,
365         0x163a,0x123b,0x163c,0x123d,0x123e,0x163f,0x1240,0x1641,
366         0x1642,0x1243,0x1644,0x1245,0x1246,0x1647,0x1648,0x1249,
367         0x124a,0x164b,0x124c,0x164d,0x164e,0x124f,0x1650,0x1251,
368         0x1252,0x1653,0x1254,0x1655,0x1656,0x1257,0x1258,0x1659,
369         0x165a,0x125b,0x165c,0x125d,0x125e,0x165f,0x1660,0x1261,
370         0x1262,0x1663,0x1264,0x1665,0x1666,0x1267,0x1268,0x1669,
371         0x166a,0x126b,0x166c,0x126d,0x126e,0x166f,0x1270,0x1671,
372         0x1672,0x1273,0x1674,0x1275,0x1276,0x1677,0x1678,0x1279,
373         0x127a,0x167b,0x127c,0x167d,0x167e,0x127f,0x9280,0x9681,
374         0x9682,0x9283,0x9684,0x9285,0x9286,0x9687,0x9688,0x9289,
375         0x928a,0x968b,0x928c,0x968d,0x968e,0x928f,0x9690,0x9291,
376         0x9292,0x9693,0x1334,0x1735,0x1736,0x1337,0x1338,0x1739,
377         0x173a,0x133b,0x173c,0x133d,0x133e,0x173f,0x1340,0x1741,
378         0x1742,0x1343,0x1744,0x1345,0x1346,0x1747,0x1748,0x1349,
379         0x134a,0x174b,0x134c,0x174d,0x174e,0x134f,0x1750,0x1351,
380         0x1352,0x1753,0x1354,0x1755,0x1756,0x1357,0x1358,0x1759,
381         0x175a,0x135b,0x175c,0x135d,0x135e,0x175f,0x1760,0x1361,
382         0x1362,0x1763,0x1364,0x1765,0x1766,0x1367,0x1368,0x1769,
383         0x176a,0x136b,0x176c,0x136d,0x136e,0x176f,0x1370,0x1771,
384         0x1772,0x1373,0x1774,0x1375,0x1376,0x1777,0x1778,0x1379,
385         0x137a,0x177b,0x137c,0x177d,0x177e,0x137f,0x9380,0x9781,
386         0x9782,0x9383,0x9784,0x9385,0x9386,0x9787,0x9788,0x9389,
387         0x938a,0x978b,0x938c,0x978d,0x978e,0x938f,0x9790,0x9391,
388         0x9392,0x9793,0x9394,0x9795,0x9796,0x9397,0x9398,0x9799,
389         0x979a,0x939b,0x979c,0x939d,0x939e,0x979f,0x97a0,0x93a1,
390         0x93a2,0x97a3,0x93a4,0x97a5,0x97a6,0x93a7,0x93a8,0x97a9,
391         0x97aa,0x93ab,0x97ac,0x93ad,0x93ae,0x97af,0x93b0,0x97b1,
392         0x97b2,0x93b3,0x97b4,0x93b5,0x93b6,0x97b7,0x97b8,0x93b9,
393         0x93ba,0x97bb,0x93bc,0x97bd,0x97be,0x93bf,0x97c0,0x93c1,
394         0x93c2,0x97c3,0x93c4,0x97c5,0x97c6,0x93c7,0x93c8,0x97c9,
395         0x97ca,0x93cb,0x97cc,0x93cd,0x93ce,0x97cf,0x93d0,0x97d1,
396         0x97d2,0x93d3,0x97d4,0x93d5,0x93d6,0x97d7,0x97d8,0x93d9,
397         0x93da,0x97db,0x93dc,0x97dd,0x97de,0x93df,0x93e0,0x97e1,
398         0x97e2,0x93e3,0x97e4,0x93e5,0x93e6,0x97e7,0x97e8,0x93e9,
399         0x93ea,0x97eb,0x93ec,0x97ed,0x97ee,0x93ef,0x97f0,0x93f1,
400         0x93f2,0x97f3,0x93f4,0x97f5,0x97f6,0x93f7,0x93f8,0x97f9,
401         0x97fa,0x93fb,0x97fc,0x93fd,0x93fe,0x97ff,0x5700,0x1301,
402         0x1302,0x1703,0x1304,0x1705,0x1706,0x1307,0x1308,0x1709,
403         0x170a,0x130b,0x170c,0x130d,0x130e,0x170f,0x1310,0x1711,
404         0x1712,0x1313,0x1714,0x1315,0x1316,0x1717,0x1718,0x1319,
405         0x131a,0x171b,0x131c,0x171d,0x171e,0x131f,0x1320,0x1721,
406         0x1722,0x1323,0x1724,0x1325,0x1326,0x1727,0x1728,0x1329,
407         0x132a,0x172b,0x132c,0x172d,0x172e,0x132f,0x1730,0x1331,
408         0x1332,0x1733,0x1334,0x1735,0x1736,0x1337,0x1338,0x1739,
409         0x173a,0x133b,0x173c,0x133d,0x133e,0x173f,0x1340,0x1741,
410         0x1742,0x1343,0x1744,0x1345,0x1346,0x1747,0x1748,0x1349,
411         0x134a,0x174b,0x134c,0x174d,0x174e,0x134f,0x1750,0x1351,
412         0x1352,0x1753,0x1354,0x1755,0x1756,0x1357,0x1358,0x1759,
413         0x175a,0x135b,0x175c,0x135d,0x135e,0x175f,0x1760,0x1361,
414         0x1362,0x1763,0x1364,0x1765,0x1766,0x1367,0x1368,0x1769,
415         0x176a,0x136b,0x176c,0x136d,0x136e,0x176f,0x1370,0x1771,
416         0x1772,0x1373,0x1774,0x1375,0x1376,0x1777,0x1778,0x1379,
417         0x137a,0x177b,0x137c,0x177d,0x177e,0x137f,0x9380,0x9781,
418         0x9782,0x9383,0x9784,0x9385,0x9386,0x9787,0x9788,0x9389,
419         0x938a,0x978b,0x938c,0x978d,0x978e,0x938f,0x9790,0x9391,
420         0x9392,0x9793,0x9394,0x9795,0x9796,0x9397,0x9398,0x9799 
421 };
422
423 void DDFDCBHandler(UINT32 dwWhich);
424
425
426 static void InvalidInstruction(UINT32 dwCount)
427 {
428         pbPC -= dwCount; /* Invalid instruction - back up */
429         dwReturnCode = (UINT32) pbPC - (UINT32) cpu.z80Base;
430         dwOriginalCycles -= sdwCyclesRemaining;
431         sdwCyclesRemaining = 0;
432 }
433
434 void CBHandler(void)
435 {
436         switch (*pbPC++)
437         {
438                 case 0x00:
439                 {
440                         sdwCyclesRemaining -= 8;
441                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
442                                 bTemp2 = (cpu.z80B >> 7);
443                                 cpu.z80B = (cpu.z80B << 1) | bTemp2;
444                                 cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80B];
445                         break;
446                 }
447                 case 0x01:
448                 {
449                         sdwCyclesRemaining -= 8;
450                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
451                                 bTemp2 = (cpu.z80C >> 7);
452                                 cpu.z80C = (cpu.z80C << 1) | bTemp2;
453                                 cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80C];
454                         break;
455                 }
456                 case 0x02:
457                 {
458                         sdwCyclesRemaining -= 8;
459                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
460                                 bTemp2 = (cpu.z80D >> 7);
461                                 cpu.z80D = (cpu.z80D << 1) | bTemp2;
462                                 cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80D];
463                         break;
464                 }
465                 case 0x03:
466                 {
467                         sdwCyclesRemaining -= 8;
468                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
469                                 bTemp2 = (cpu.z80E >> 7);
470                                 cpu.z80E = (cpu.z80E << 1) | bTemp2;
471                                 cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80E];
472                         break;
473                 }
474                 case 0x04:
475                 {
476                         sdwCyclesRemaining -= 8;
477                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
478                                 bTemp2 = (cpu.z80H >> 7);
479                                 cpu.z80H = (cpu.z80H << 1) | bTemp2;
480                                 cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80H];
481                         break;
482                 }
483                 case 0x05:
484                 {
485                         sdwCyclesRemaining -= 8;
486                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
487                                 bTemp2 = (cpu.z80L >> 7);
488                                 cpu.z80L = (cpu.z80L << 1) | bTemp2;
489                                 cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80L];
490                         break;
491                 }
492                 case 0x06:
493                 {
494                         sdwCyclesRemaining -= 15;
495                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
496                                 while (psMemRead->lowAddr != 0xffffffff)
497                                 {
498                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
499                                         {
500                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
501                                                 if (psMemRead->memoryCall)
502                                                 {
503                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
504                                                 }
505                                                 else
506                                                 {
507                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
508                                                 }
509                                                 psMemRead = NULL;
510                                                 break;
511                                         }
512                                         ++psMemRead;
513                                 }
514
515                                 if (psMemRead)
516                                 {
517                                         bTemp = cpu.z80Base[cpu.z80HL];
518                                 }
519
520                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
521                                 bTemp2 = (bTemp >> 7);
522                                 bTemp = (bTemp << 1) | bTemp2;
523                                 cpu.z80F |= bTemp2 | bPostORFlags[bTemp];
524                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
525                                 while (psMemWrite->lowAddr != 0xffffffff)
526                                 {
527                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
528                                         {
529                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
530                                                 if (psMemWrite->memoryCall)
531                                                 {
532                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
533                                                 }
534                                                 else
535                                                 {
536                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
537                                                 }
538                                                 psMemWrite = NULL;
539                                                 break;
540                                         }
541                                         ++psMemWrite;
542                                 }
543
544                                 if (psMemWrite)
545                                 {
546                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
547                                 }
548
549                         break;
550                 }
551                 case 0x07:
552                 {
553                         sdwCyclesRemaining -= 8;
554                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
555                                 bTemp2 = (cpu.z80A >> 7);
556                                 cpu.z80A = (cpu.z80A << 1) | bTemp2;
557                                 cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80A];
558                         break;
559                 }
560                 case 0x08:
561                 {
562                         sdwCyclesRemaining -= 8;
563                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
564                                 cpu.z80F |= (cpu.z80B & Z80_FLAG_CARRY);
565                                 cpu.z80B = (cpu.z80B >> 1) | (cpu.z80B << 7);
566                                 cpu.z80F |= bPostORFlags[cpu.z80B];
567                         break;
568                 }
569                 case 0x09:
570                 {
571                         sdwCyclesRemaining -= 8;
572                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
573                                 cpu.z80F |= (cpu.z80C & Z80_FLAG_CARRY);
574                                 cpu.z80C = (cpu.z80C >> 1) | (cpu.z80C << 7);
575                                 cpu.z80F |= bPostORFlags[cpu.z80C];
576                         break;
577                 }
578                 case 0x0a:
579                 {
580                         sdwCyclesRemaining -= 8;
581                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
582                                 cpu.z80F |= (cpu.z80D & Z80_FLAG_CARRY);
583                                 cpu.z80D = (cpu.z80D >> 1) | (cpu.z80D << 7);
584                                 cpu.z80F |= bPostORFlags[cpu.z80D];
585                         break;
586                 }
587                 case 0x0b:
588                 {
589                         sdwCyclesRemaining -= 8;
590                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
591                                 cpu.z80F |= (cpu.z80E & Z80_FLAG_CARRY);
592                                 cpu.z80E = (cpu.z80E >> 1) | (cpu.z80E << 7);
593                                 cpu.z80F |= bPostORFlags[cpu.z80E];
594                         break;
595                 }
596                 case 0x0c:
597                 {
598                         sdwCyclesRemaining -= 8;
599                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
600                                 cpu.z80F |= (cpu.z80H & Z80_FLAG_CARRY);
601                                 cpu.z80H = (cpu.z80H >> 1) | (cpu.z80H << 7);
602                                 cpu.z80F |= bPostORFlags[cpu.z80H];
603                         break;
604                 }
605                 case 0x0d:
606                 {
607                         sdwCyclesRemaining -= 8;
608                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
609                                 cpu.z80F |= (cpu.z80L & Z80_FLAG_CARRY);
610                                 cpu.z80L = (cpu.z80L >> 1) | (cpu.z80L << 7);
611                                 cpu.z80F |= bPostORFlags[cpu.z80L];
612                         break;
613                 }
614                 case 0x0e:
615                 {
616                         sdwCyclesRemaining -= 15;
617                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
618                                 while (psMemRead->lowAddr != 0xffffffff)
619                                 {
620                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
621                                         {
622                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
623                                                 if (psMemRead->memoryCall)
624                                                 {
625                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
626                                                 }
627                                                 else
628                                                 {
629                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
630                                                 }
631                                                 psMemRead = NULL;
632                                                 break;
633                                         }
634                                         ++psMemRead;
635                                 }
636
637                                 if (psMemRead)
638                                 {
639                                         bTemp = cpu.z80Base[cpu.z80HL];
640                                 }
641
642                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
643                                 cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
644                                 bTemp = (bTemp >> 1) | (bTemp << 7);
645                                 cpu.z80F |= bPostORFlags[bTemp];
646                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
647                                 while (psMemWrite->lowAddr != 0xffffffff)
648                                 {
649                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
650                                         {
651                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
652                                                 if (psMemWrite->memoryCall)
653                                                 {
654                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
655                                                 }
656                                                 else
657                                                 {
658                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
659                                                 }
660                                                 psMemWrite = NULL;
661                                                 break;
662                                         }
663                                         ++psMemWrite;
664                                 }
665
666                                 if (psMemWrite)
667                                 {
668                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
669                                 }
670
671                         break;
672                 }
673                 case 0x0f:
674                 {
675                         sdwCyclesRemaining -= 8;
676                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
677                                 cpu.z80F |= (cpu.z80A & Z80_FLAG_CARRY);
678                                 cpu.z80A = (cpu.z80A >> 1) | (cpu.z80A << 7);
679                                 cpu.z80F |= bPostORFlags[cpu.z80A];
680                         break;
681                 }
682                 case 0x10:
683                 {
684                         sdwCyclesRemaining -= 8;
685                                 bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
686                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
687                                 cpu.z80F |= (cpu.z80B >> 7);
688                                 cpu.z80B = (cpu.z80B << 1) | bTemp2;
689                                 cpu.z80F |= bPostORFlags[cpu.z80B];
690                         break;
691                 }
692                 case 0x11:
693                 {
694                         sdwCyclesRemaining -= 8;
695                                 bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
696                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
697                                 cpu.z80F |= (cpu.z80C >> 7);
698                                 cpu.z80C = (cpu.z80C << 1) | bTemp2;
699                                 cpu.z80F |= bPostORFlags[cpu.z80C];
700                         break;
701                 }
702                 case 0x12:
703                 {
704                         sdwCyclesRemaining -= 8;
705                                 bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
706                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
707                                 cpu.z80F |= (cpu.z80D >> 7);
708                                 cpu.z80D = (cpu.z80D << 1) | bTemp2;
709                                 cpu.z80F |= bPostORFlags[cpu.z80D];
710                         break;
711                 }
712                 case 0x13:
713                 {
714                         sdwCyclesRemaining -= 8;
715                                 bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
716                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
717                                 cpu.z80F |= (cpu.z80E >> 7);
718                                 cpu.z80E = (cpu.z80E << 1) | bTemp2;
719                                 cpu.z80F |= bPostORFlags[cpu.z80E];
720                         break;
721                 }
722                 case 0x14:
723                 {
724                         sdwCyclesRemaining -= 8;
725                                 bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
726                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
727                                 cpu.z80F |= (cpu.z80H >> 7);
728                                 cpu.z80H = (cpu.z80H << 1) | bTemp2;
729                                 cpu.z80F |= bPostORFlags[cpu.z80H];
730                         break;
731                 }
732                 case 0x15:
733                 {
734                         sdwCyclesRemaining -= 8;
735                                 bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
736                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
737                                 cpu.z80F |= (cpu.z80L >> 7);
738                                 cpu.z80L = (cpu.z80L << 1) | bTemp2;
739                                 cpu.z80F |= bPostORFlags[cpu.z80L];
740                         break;
741                 }
742                 case 0x16:
743                 {
744                         sdwCyclesRemaining -= 15;
745                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
746                                 while (psMemRead->lowAddr != 0xffffffff)
747                                 {
748                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
749                                         {
750                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
751                                                 if (psMemRead->memoryCall)
752                                                 {
753                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
754                                                 }
755                                                 else
756                                                 {
757                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
758                                                 }
759                                                 psMemRead = NULL;
760                                                 break;
761                                         }
762                                         ++psMemRead;
763                                 }
764
765                                 if (psMemRead)
766                                 {
767                                         bTemp = cpu.z80Base[cpu.z80HL];
768                                 }
769
770                                 bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
771                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
772                                 cpu.z80F |= (bTemp >> 7);
773                                 bTemp = (bTemp << 1) | bTemp2;
774                                 cpu.z80F |= bPostORFlags[bTemp];
775                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
776                                 while (psMemWrite->lowAddr != 0xffffffff)
777                                 {
778                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
779                                         {
780                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
781                                                 if (psMemWrite->memoryCall)
782                                                 {
783                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
784                                                 }
785                                                 else
786                                                 {
787                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
788                                                 }
789                                                 psMemWrite = NULL;
790                                                 break;
791                                         }
792                                         ++psMemWrite;
793                                 }
794
795                                 if (psMemWrite)
796                                 {
797                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
798                                 }
799
800                         break;
801                 }
802                 case 0x17:
803                 {
804                         sdwCyclesRemaining -= 8;
805                                 bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
806                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
807                                 cpu.z80F |= (cpu.z80A >> 7);
808                                 cpu.z80A = (cpu.z80A << 1) | bTemp2;
809                                 cpu.z80F |= bPostORFlags[cpu.z80A];
810                         break;
811                 }
812                 case 0x18:
813                 {
814                         sdwCyclesRemaining -= 8;
815                                 bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
816                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
817                                 cpu.z80F |= (cpu.z80B & Z80_FLAG_CARRY);
818                                 cpu.z80B = (cpu.z80B >> 1) | bTemp2;
819                                 cpu.z80F |= bPostORFlags[cpu.z80B];
820                         break;
821                 }
822                 case 0x19:
823                 {
824                         sdwCyclesRemaining -= 8;
825                                 bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
826                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
827                                 cpu.z80F |= (cpu.z80C & Z80_FLAG_CARRY);
828                                 cpu.z80C = (cpu.z80C >> 1) | bTemp2;
829                                 cpu.z80F |= bPostORFlags[cpu.z80C];
830                         break;
831                 }
832                 case 0x1a:
833                 {
834                         sdwCyclesRemaining -= 8;
835                                 bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
836                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
837                                 cpu.z80F |= (cpu.z80D & Z80_FLAG_CARRY);
838                                 cpu.z80D = (cpu.z80D >> 1) | bTemp2;
839                                 cpu.z80F |= bPostORFlags[cpu.z80D];
840                         break;
841                 }
842                 case 0x1b:
843                 {
844                         sdwCyclesRemaining -= 8;
845                                 bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
846                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
847                                 cpu.z80F |= (cpu.z80E & Z80_FLAG_CARRY);
848                                 cpu.z80E = (cpu.z80E >> 1) | bTemp2;
849                                 cpu.z80F |= bPostORFlags[cpu.z80E];
850                         break;
851                 }
852                 case 0x1c:
853                 {
854                         sdwCyclesRemaining -= 8;
855                                 bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
856                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
857                                 cpu.z80F |= (cpu.z80H & Z80_FLAG_CARRY);
858                                 cpu.z80H = (cpu.z80H >> 1) | bTemp2;
859                                 cpu.z80F |= bPostORFlags[cpu.z80H];
860                         break;
861                 }
862                 case 0x1d:
863                 {
864                         sdwCyclesRemaining -= 8;
865                                 bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
866                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
867                                 cpu.z80F |= (cpu.z80L & Z80_FLAG_CARRY);
868                                 cpu.z80L = (cpu.z80L >> 1) | bTemp2;
869                                 cpu.z80F |= bPostORFlags[cpu.z80L];
870                         break;
871                 }
872                 case 0x1e:
873                 {
874                         sdwCyclesRemaining -= 15;
875                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
876                                 while (psMemRead->lowAddr != 0xffffffff)
877                                 {
878                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
879                                         {
880                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
881                                                 if (psMemRead->memoryCall)
882                                                 {
883                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
884                                                 }
885                                                 else
886                                                 {
887                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
888                                                 }
889                                                 psMemRead = NULL;
890                                                 break;
891                                         }
892                                         ++psMemRead;
893                                 }
894
895                                 if (psMemRead)
896                                 {
897                                         bTemp = cpu.z80Base[cpu.z80HL];
898                                 }
899
900                                 bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
901                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
902                                 cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
903                                 bTemp = (bTemp >> 1) | bTemp2;
904                                 cpu.z80F |= bPostORFlags[bTemp];
905                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
906                                 while (psMemWrite->lowAddr != 0xffffffff)
907                                 {
908                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
909                                         {
910                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
911                                                 if (psMemWrite->memoryCall)
912                                                 {
913                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
914                                                 }
915                                                 else
916                                                 {
917                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
918                                                 }
919                                                 psMemWrite = NULL;
920                                                 break;
921                                         }
922                                         ++psMemWrite;
923                                 }
924
925                                 if (psMemWrite)
926                                 {
927                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
928                                 }
929
930                         break;
931                 }
932                 case 0x1f:
933                 {
934                         sdwCyclesRemaining -= 8;
935                                 bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
936                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
937                                 cpu.z80F |= (cpu.z80A & Z80_FLAG_CARRY);
938                                 cpu.z80A = (cpu.z80A >> 1) | bTemp2;
939                                 cpu.z80F |= bPostORFlags[cpu.z80A];
940                         break;
941                 }
942                 case 0x20:
943                 {
944                         sdwCyclesRemaining -= 8;
945                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
946                                 cpu.z80F |= (cpu.z80B >> 7);
947                                 cpu.z80B = (cpu.z80B << 1);
948                                 cpu.z80F |= bPostORFlags[cpu.z80B];
949                         break;
950                 }
951                 case 0x21:
952                 {
953                         sdwCyclesRemaining -= 8;
954                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
955                                 cpu.z80F |= (cpu.z80C >> 7);
956                                 cpu.z80C = (cpu.z80C << 1);
957                                 cpu.z80F |= bPostORFlags[cpu.z80C];
958                         break;
959                 }
960                 case 0x22:
961                 {
962                         sdwCyclesRemaining -= 8;
963                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
964                                 cpu.z80F |= (cpu.z80D >> 7);
965                                 cpu.z80D = (cpu.z80D << 1);
966                                 cpu.z80F |= bPostORFlags[cpu.z80D];
967                         break;
968                 }
969                 case 0x23:
970                 {
971                         sdwCyclesRemaining -= 8;
972                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
973                                 cpu.z80F |= (cpu.z80E >> 7);
974                                 cpu.z80E = (cpu.z80E << 1);
975                                 cpu.z80F |= bPostORFlags[cpu.z80E];
976                         break;
977                 }
978                 case 0x24:
979                 {
980                         sdwCyclesRemaining -= 8;
981                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
982                                 cpu.z80F |= (cpu.z80H >> 7);
983                                 cpu.z80H = (cpu.z80H << 1);
984                                 cpu.z80F |= bPostORFlags[cpu.z80H];
985                         break;
986                 }
987                 case 0x25:
988                 {
989                         sdwCyclesRemaining -= 8;
990                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
991                                 cpu.z80F |= (cpu.z80L >> 7);
992                                 cpu.z80L = (cpu.z80L << 1);
993                                 cpu.z80F |= bPostORFlags[cpu.z80L];
994                         break;
995                 }
996                 case 0x26:
997                 {
998                         sdwCyclesRemaining -= 15;
999                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
1000                                 while (psMemRead->lowAddr != 0xffffffff)
1001                                 {
1002                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
1003                                         {
1004                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1005                                                 if (psMemRead->memoryCall)
1006                                                 {
1007                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
1008                                                 }
1009                                                 else
1010                                                 {
1011                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
1012                                                 }
1013                                                 psMemRead = NULL;
1014                                                 break;
1015                                         }
1016                                         ++psMemRead;
1017                                 }
1018
1019                                 if (psMemRead)
1020                                 {
1021                                         bTemp = cpu.z80Base[cpu.z80HL];
1022                                 }
1023
1024                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1025                                 cpu.z80F |= (bTemp >> 7);
1026                                 bTemp = (bTemp << 1);
1027                                 cpu.z80F |= bPostORFlags[bTemp];
1028                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
1029                                 while (psMemWrite->lowAddr != 0xffffffff)
1030                                 {
1031                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
1032                                         {
1033                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1034                                                 if (psMemWrite->memoryCall)
1035                                                 {
1036                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
1037                                                 }
1038                                                 else
1039                                                 {
1040                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
1041                                                 }
1042                                                 psMemWrite = NULL;
1043                                                 break;
1044                                         }
1045                                         ++psMemWrite;
1046                                 }
1047
1048                                 if (psMemWrite)
1049                                 {
1050                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
1051                                 }
1052
1053                         break;
1054                 }
1055                 case 0x27:
1056                 {
1057                         sdwCyclesRemaining -= 8;
1058                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1059                                 cpu.z80F |= (cpu.z80A >> 7);
1060                                 cpu.z80A = (cpu.z80A << 1);
1061                                 cpu.z80F |= bPostORFlags[cpu.z80A];
1062                         break;
1063                 }
1064                 case 0x28:
1065                 {
1066                         sdwCyclesRemaining -= 8;
1067                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1068                                 cpu.z80F |= (cpu.z80B & Z80_FLAG_CARRY);
1069                                 cpu.z80B = (cpu.z80B >> 1) | (cpu.z80B & 0x80);
1070                                 cpu.z80F |= bPostORFlags[cpu.z80B];
1071                         break;
1072                 }
1073                 case 0x29:
1074                 {
1075                         sdwCyclesRemaining -= 8;
1076                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1077                                 cpu.z80F |= (cpu.z80C & Z80_FLAG_CARRY);
1078                                 cpu.z80C = (cpu.z80C >> 1) | (cpu.z80C & 0x80);
1079                                 cpu.z80F |= bPostORFlags[cpu.z80C];
1080                         break;
1081                 }
1082                 case 0x2a:
1083                 {
1084                         sdwCyclesRemaining -= 8;
1085                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1086                                 cpu.z80F |= (cpu.z80D & Z80_FLAG_CARRY);
1087                                 cpu.z80D = (cpu.z80D >> 1) | (cpu.z80D & 0x80);
1088                                 cpu.z80F |= bPostORFlags[cpu.z80D];
1089                         break;
1090                 }
1091                 case 0x2b:
1092                 {
1093                         sdwCyclesRemaining -= 8;
1094                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1095                                 cpu.z80F |= (cpu.z80E & Z80_FLAG_CARRY);
1096                                 cpu.z80E = (cpu.z80E >> 1) | (cpu.z80E & 0x80);
1097                                 cpu.z80F |= bPostORFlags[cpu.z80E];
1098                         break;
1099                 }
1100                 case 0x2c:
1101                 {
1102                         sdwCyclesRemaining -= 8;
1103                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1104                                 cpu.z80F |= (cpu.z80H & Z80_FLAG_CARRY);
1105                                 cpu.z80H = (cpu.z80H >> 1) | (cpu.z80H & 0x80);
1106                                 cpu.z80F |= bPostORFlags[cpu.z80H];
1107                         break;
1108                 }
1109                 case 0x2d:
1110                 {
1111                         sdwCyclesRemaining -= 8;
1112                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1113                                 cpu.z80F |= (cpu.z80L & Z80_FLAG_CARRY);
1114                                 cpu.z80L = (cpu.z80L >> 1) | (cpu.z80L & 0x80);
1115                                 cpu.z80F |= bPostORFlags[cpu.z80L];
1116                         break;
1117                 }
1118                 case 0x2e:
1119                 {
1120                         sdwCyclesRemaining -= 15;
1121                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
1122                                 while (psMemRead->lowAddr != 0xffffffff)
1123                                 {
1124                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
1125                                         {
1126                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1127                                                 if (psMemRead->memoryCall)
1128                                                 {
1129                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
1130                                                 }
1131                                                 else
1132                                                 {
1133                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
1134                                                 }
1135                                                 psMemRead = NULL;
1136                                                 break;
1137                                         }
1138                                         ++psMemRead;
1139                                 }
1140
1141                                 if (psMemRead)
1142                                 {
1143                                         bTemp = cpu.z80Base[cpu.z80HL];
1144                                 }
1145
1146                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1147                                 cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
1148                                 bTemp = (bTemp >> 1) | (bTemp & 0x80);
1149                                 cpu.z80F |= bPostORFlags[bTemp];
1150                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
1151                                 while (psMemWrite->lowAddr != 0xffffffff)
1152                                 {
1153                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
1154                                         {
1155                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1156                                                 if (psMemWrite->memoryCall)
1157                                                 {
1158                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
1159                                                 }
1160                                                 else
1161                                                 {
1162                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
1163                                                 }
1164                                                 psMemWrite = NULL;
1165                                                 break;
1166                                         }
1167                                         ++psMemWrite;
1168                                 }
1169
1170                                 if (psMemWrite)
1171                                 {
1172                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
1173                                 }
1174
1175                         break;
1176                 }
1177                 case 0x2f:
1178                 {
1179                         sdwCyclesRemaining -= 8;
1180                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1181                                 cpu.z80F |= (cpu.z80A & Z80_FLAG_CARRY);
1182                                 cpu.z80A = (cpu.z80A >> 1) | (cpu.z80A & 0x80);
1183                                 cpu.z80F |= bPostORFlags[cpu.z80A];
1184                         break;
1185                 }
1186                 case 0x30:
1187                 {
1188                         sdwCyclesRemaining -= 8;
1189                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1190                                 cpu.z80F |= (cpu.z80B >> 7);
1191                                 cpu.z80B = (cpu.z80B << 1);
1192                                 cpu.z80F |= bPostORFlags[cpu.z80B];
1193                         break;
1194                 }
1195                 case 0x31:
1196                 {
1197                         sdwCyclesRemaining -= 8;
1198                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1199                                 cpu.z80F |= (cpu.z80C >> 7);
1200                                 cpu.z80C = (cpu.z80C << 1);
1201                                 cpu.z80F |= bPostORFlags[cpu.z80C];
1202                         break;
1203                 }
1204                 case 0x32:
1205                 {
1206                         sdwCyclesRemaining -= 8;
1207                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1208                                 cpu.z80F |= (cpu.z80D >> 7);
1209                                 cpu.z80D = (cpu.z80D << 1);
1210                                 cpu.z80F |= bPostORFlags[cpu.z80D];
1211                         break;
1212                 }
1213                 case 0x33:
1214                 {
1215                         sdwCyclesRemaining -= 8;
1216                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1217                                 cpu.z80F |= (cpu.z80E >> 7);
1218                                 cpu.z80E = (cpu.z80E << 1);
1219                                 cpu.z80F |= bPostORFlags[cpu.z80E];
1220                         break;
1221                 }
1222                 case 0x34:
1223                 {
1224                         sdwCyclesRemaining -= 8;
1225                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1226                                 cpu.z80F |= (cpu.z80H >> 7);
1227                                 cpu.z80H = (cpu.z80H << 1);
1228                                 cpu.z80F |= bPostORFlags[cpu.z80H];
1229                         break;
1230                 }
1231                 case 0x35:
1232                 {
1233                         sdwCyclesRemaining -= 8;
1234                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1235                                 cpu.z80F |= (cpu.z80L >> 7);
1236                                 cpu.z80L = (cpu.z80L << 1);
1237                                 cpu.z80F |= bPostORFlags[cpu.z80L];
1238                         break;
1239                 }
1240                 case 0x36:
1241                 {
1242                         sdwCyclesRemaining -= 15;
1243                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
1244                                 while (psMemRead->lowAddr != 0xffffffff)
1245                                 {
1246                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
1247                                         {
1248                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1249                                                 if (psMemRead->memoryCall)
1250                                                 {
1251                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
1252                                                 }
1253                                                 else
1254                                                 {
1255                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
1256                                                 }
1257                                                 psMemRead = NULL;
1258                                                 break;
1259                                         }
1260                                         ++psMemRead;
1261                                 }
1262
1263                                 if (psMemRead)
1264                                 {
1265                                         bTemp = cpu.z80Base[cpu.z80HL];
1266                                 }
1267
1268                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1269                                 cpu.z80F |= (bTemp >> 7);
1270                                 bTemp = (bTemp << 1);
1271                                 cpu.z80F |= bPostORFlags[bTemp];
1272                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
1273                                 while (psMemWrite->lowAddr != 0xffffffff)
1274                                 {
1275                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
1276                                         {
1277                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1278                                                 if (psMemWrite->memoryCall)
1279                                                 {
1280                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
1281                                                 }
1282                                                 else
1283                                                 {
1284                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
1285                                                 }
1286                                                 psMemWrite = NULL;
1287                                                 break;
1288                                         }
1289                                         ++psMemWrite;
1290                                 }
1291
1292                                 if (psMemWrite)
1293                                 {
1294                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
1295                                 }
1296
1297                         break;
1298                 }
1299                 case 0x37:
1300                 {
1301                         sdwCyclesRemaining -= 8;
1302                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1303                                 cpu.z80F |= (cpu.z80A >> 7);
1304                                 cpu.z80A = (cpu.z80A << 1);
1305                                 cpu.z80F |= bPostORFlags[cpu.z80A];
1306                         break;
1307                 }
1308                 case 0x38:
1309                 {
1310                         sdwCyclesRemaining -= 8;
1311                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1312                                 cpu.z80F |= (cpu.z80B & Z80_FLAG_CARRY);
1313                                 cpu.z80B = (cpu.z80B >> 1);
1314                                 cpu.z80F |= bPostORFlags[cpu.z80B];
1315                         break;
1316                 }
1317                 case 0x39:
1318                 {
1319                         sdwCyclesRemaining -= 8;
1320                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1321                                 cpu.z80F |= (cpu.z80C & Z80_FLAG_CARRY);
1322                                 cpu.z80C = (cpu.z80C >> 1);
1323                                 cpu.z80F |= bPostORFlags[cpu.z80C];
1324                         break;
1325                 }
1326                 case 0x3a:
1327                 {
1328                         sdwCyclesRemaining -= 8;
1329                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1330                                 cpu.z80F |= (cpu.z80D & Z80_FLAG_CARRY);
1331                                 cpu.z80D = (cpu.z80D >> 1);
1332                                 cpu.z80F |= bPostORFlags[cpu.z80D];
1333                         break;
1334                 }
1335                 case 0x3b:
1336                 {
1337                         sdwCyclesRemaining -= 8;
1338                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1339                                 cpu.z80F |= (cpu.z80E & Z80_FLAG_CARRY);
1340                                 cpu.z80E = (cpu.z80E >> 1);
1341                                 cpu.z80F |= bPostORFlags[cpu.z80E];
1342                         break;
1343                 }
1344                 case 0x3c:
1345                 {
1346                         sdwCyclesRemaining -= 8;
1347                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1348                                 cpu.z80F |= (cpu.z80H & Z80_FLAG_CARRY);
1349                                 cpu.z80H = (cpu.z80H >> 1);
1350                                 cpu.z80F |= bPostORFlags[cpu.z80H];
1351                         break;
1352                 }
1353                 case 0x3d:
1354                 {
1355                         sdwCyclesRemaining -= 8;
1356                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1357                                 cpu.z80F |= (cpu.z80L & Z80_FLAG_CARRY);
1358                                 cpu.z80L = (cpu.z80L >> 1);
1359                                 cpu.z80F |= bPostORFlags[cpu.z80L];
1360                         break;
1361                 }
1362                 case 0x3e:
1363                 {
1364                         sdwCyclesRemaining -= 15;
1365                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
1366                                 while (psMemRead->lowAddr != 0xffffffff)
1367                                 {
1368                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
1369                                         {
1370                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1371                                                 if (psMemRead->memoryCall)
1372                                                 {
1373                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
1374                                                 }
1375                                                 else
1376                                                 {
1377                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
1378                                                 }
1379                                                 psMemRead = NULL;
1380                                                 break;
1381                                         }
1382                                         ++psMemRead;
1383                                 }
1384
1385                                 if (psMemRead)
1386                                 {
1387                                         bTemp = cpu.z80Base[cpu.z80HL];
1388                                 }
1389
1390                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1391                                 cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
1392                                 bTemp = (bTemp >> 1);
1393                                 cpu.z80F |= bPostORFlags[bTemp];
1394                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
1395                                 while (psMemWrite->lowAddr != 0xffffffff)
1396                                 {
1397                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
1398                                         {
1399                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1400                                                 if (psMemWrite->memoryCall)
1401                                                 {
1402                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
1403                                                 }
1404                                                 else
1405                                                 {
1406                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
1407                                                 }
1408                                                 psMemWrite = NULL;
1409                                                 break;
1410                                         }
1411                                         ++psMemWrite;
1412                                 }
1413
1414                                 if (psMemWrite)
1415                                 {
1416                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
1417                                 }
1418
1419                         break;
1420                 }
1421                 case 0x3f:
1422                 {
1423                         sdwCyclesRemaining -= 8;
1424                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1425                                 cpu.z80F |= (cpu.z80A & Z80_FLAG_CARRY);
1426                                 cpu.z80A = (cpu.z80A >> 1);
1427                                 cpu.z80F |= bPostORFlags[cpu.z80A];
1428                         break;
1429                 }
1430                 case 0x40:
1431                 {
1432                         sdwCyclesRemaining -= 8;
1433                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1434                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1435                                 if (!(cpu.z80B & 0x01))
1436                                 {
1437                                         cpu.z80F |= Z80_FLAG_ZERO;
1438                                 }
1439                         break;
1440                 }
1441                 case 0x41:
1442                 {
1443                         sdwCyclesRemaining -= 8;
1444                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1445                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1446                                 if (!(cpu.z80C & 0x01))
1447                                 {
1448                                         cpu.z80F |= Z80_FLAG_ZERO;
1449                                 }
1450                         break;
1451                 }
1452                 case 0x42:
1453                 {
1454                         sdwCyclesRemaining -= 8;
1455                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1456                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1457                                 if (!(cpu.z80D & 0x01))
1458                                 {
1459                                         cpu.z80F |= Z80_FLAG_ZERO;
1460                                 }
1461                         break;
1462                 }
1463                 case 0x43:
1464                 {
1465                         sdwCyclesRemaining -= 8;
1466                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1467                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1468                                 if (!(cpu.z80E & 0x01))
1469                                 {
1470                                         cpu.z80F |= Z80_FLAG_ZERO;
1471                                 }
1472                         break;
1473                 }
1474                 case 0x44:
1475                 {
1476                         sdwCyclesRemaining -= 8;
1477                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1478                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1479                                 if (!(cpu.z80H & 0x01))
1480                                 {
1481                                         cpu.z80F |= Z80_FLAG_ZERO;
1482                                 }
1483                         break;
1484                 }
1485                 case 0x45:
1486                 {
1487                         sdwCyclesRemaining -= 8;
1488                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1489                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1490                                 if (!(cpu.z80L & 0x01))
1491                                 {
1492                                         cpu.z80F |= Z80_FLAG_ZERO;
1493                                 }
1494                         break;
1495                 }
1496                 case 0x46:
1497                 {
1498                         sdwCyclesRemaining -= 12;
1499                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
1500                                 while (psMemRead->lowAddr != 0xffffffff)
1501                                 {
1502                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
1503                                         {
1504                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1505                                                 if (psMemRead->memoryCall)
1506                                                 {
1507                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
1508                                                 }
1509                                                 else
1510                                                 {
1511                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
1512                                                 }
1513                                                 psMemRead = NULL;
1514                                                 break;
1515                                         }
1516                                         ++psMemRead;
1517                                 }
1518
1519                                 if (psMemRead)
1520                                 {
1521                                         bTemp = cpu.z80Base[cpu.z80HL];
1522                                 }
1523
1524                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1525                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1526                                 if (!(bTemp & 0x01))
1527                                 {
1528                                         cpu.z80F |= Z80_FLAG_ZERO;
1529                                 }
1530                         break;
1531                 }
1532                 case 0x47:
1533                 {
1534                         sdwCyclesRemaining -= 8;
1535                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1536                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1537                                 if (!(cpu.z80A & 0x01))
1538                                 {
1539                                         cpu.z80F |= Z80_FLAG_ZERO;
1540                                 }
1541                         break;
1542                 }
1543                 case 0x48:
1544                 {
1545                         sdwCyclesRemaining -= 8;
1546                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1547                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1548                                 if (!(cpu.z80B & 0x02))
1549                                 {
1550                                         cpu.z80F |= Z80_FLAG_ZERO;
1551                                 }
1552                         break;
1553                 }
1554                 case 0x49:
1555                 {
1556                         sdwCyclesRemaining -= 8;
1557                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1558                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1559                                 if (!(cpu.z80C & 0x02))
1560                                 {
1561                                         cpu.z80F |= Z80_FLAG_ZERO;
1562                                 }
1563                         break;
1564                 }
1565                 case 0x4a:
1566                 {
1567                         sdwCyclesRemaining -= 8;
1568                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1569                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1570                                 if (!(cpu.z80D & 0x02))
1571                                 {
1572                                         cpu.z80F |= Z80_FLAG_ZERO;
1573                                 }
1574                         break;
1575                 }
1576                 case 0x4b:
1577                 {
1578                         sdwCyclesRemaining -= 8;
1579                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1580                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1581                                 if (!(cpu.z80E & 0x02))
1582                                 {
1583                                         cpu.z80F |= Z80_FLAG_ZERO;
1584                                 }
1585                         break;
1586                 }
1587                 case 0x4c:
1588                 {
1589                         sdwCyclesRemaining -= 8;
1590                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1591                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1592                                 if (!(cpu.z80H & 0x02))
1593                                 {
1594                                         cpu.z80F |= Z80_FLAG_ZERO;
1595                                 }
1596                         break;
1597                 }
1598                 case 0x4d:
1599                 {
1600                         sdwCyclesRemaining -= 8;
1601                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1602                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1603                                 if (!(cpu.z80L & 0x02))
1604                                 {
1605                                         cpu.z80F |= Z80_FLAG_ZERO;
1606                                 }
1607                         break;
1608                 }
1609                 case 0x4e:
1610                 {
1611                         sdwCyclesRemaining -= 12;
1612                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
1613                                 while (psMemRead->lowAddr != 0xffffffff)
1614                                 {
1615                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
1616                                         {
1617                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1618                                                 if (psMemRead->memoryCall)
1619                                                 {
1620                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
1621                                                 }
1622                                                 else
1623                                                 {
1624                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
1625                                                 }
1626                                                 psMemRead = NULL;
1627                                                 break;
1628                                         }
1629                                         ++psMemRead;
1630                                 }
1631
1632                                 if (psMemRead)
1633                                 {
1634                                         bTemp = cpu.z80Base[cpu.z80HL];
1635                                 }
1636
1637                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1638                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1639                                 if (!(bTemp & 0x02))
1640                                 {
1641                                         cpu.z80F |= Z80_FLAG_ZERO;
1642                                 }
1643                         break;
1644                 }
1645                 case 0x4f:
1646                 {
1647                         sdwCyclesRemaining -= 8;
1648                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1649                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1650                                 if (!(cpu.z80A & 0x02))
1651                                 {
1652                                         cpu.z80F |= Z80_FLAG_ZERO;
1653                                 }
1654                         break;
1655                 }
1656                 case 0x50:
1657                 {
1658                         sdwCyclesRemaining -= 8;
1659                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1660                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1661                                 if (!(cpu.z80B & 0x04))
1662                                 {
1663                                         cpu.z80F |= Z80_FLAG_ZERO;
1664                                 }
1665                         break;
1666                 }
1667                 case 0x51:
1668                 {
1669                         sdwCyclesRemaining -= 8;
1670                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1671                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1672                                 if (!(cpu.z80C & 0x04))
1673                                 {
1674                                         cpu.z80F |= Z80_FLAG_ZERO;
1675                                 }
1676                         break;
1677                 }
1678                 case 0x52:
1679                 {
1680                         sdwCyclesRemaining -= 8;
1681                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1682                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1683                                 if (!(cpu.z80D & 0x04))
1684                                 {
1685                                         cpu.z80F |= Z80_FLAG_ZERO;
1686                                 }
1687                         break;
1688                 }
1689                 case 0x53:
1690                 {
1691                         sdwCyclesRemaining -= 8;
1692                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1693                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1694                                 if (!(cpu.z80E & 0x04))
1695                                 {
1696                                         cpu.z80F |= Z80_FLAG_ZERO;
1697                                 }
1698                         break;
1699                 }
1700                 case 0x54:
1701                 {
1702                         sdwCyclesRemaining -= 8;
1703                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1704                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1705                                 if (!(cpu.z80H & 0x04))
1706                                 {
1707                                         cpu.z80F |= Z80_FLAG_ZERO;
1708                                 }
1709                         break;
1710                 }
1711                 case 0x55:
1712                 {
1713                         sdwCyclesRemaining -= 8;
1714                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1715                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1716                                 if (!(cpu.z80L & 0x04))
1717                                 {
1718                                         cpu.z80F |= Z80_FLAG_ZERO;
1719                                 }
1720                         break;
1721                 }
1722                 case 0x56:
1723                 {
1724                         sdwCyclesRemaining -= 12;
1725                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
1726                                 while (psMemRead->lowAddr != 0xffffffff)
1727                                 {
1728                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
1729                                         {
1730                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1731                                                 if (psMemRead->memoryCall)
1732                                                 {
1733                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
1734                                                 }
1735                                                 else
1736                                                 {
1737                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
1738                                                 }
1739                                                 psMemRead = NULL;
1740                                                 break;
1741                                         }
1742                                         ++psMemRead;
1743                                 }
1744
1745                                 if (psMemRead)
1746                                 {
1747                                         bTemp = cpu.z80Base[cpu.z80HL];
1748                                 }
1749
1750                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1751                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1752                                 if (!(bTemp & 0x04))
1753                                 {
1754                                         cpu.z80F |= Z80_FLAG_ZERO;
1755                                 }
1756                         break;
1757                 }
1758                 case 0x57:
1759                 {
1760                         sdwCyclesRemaining -= 8;
1761                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1762                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1763                                 if (!(cpu.z80A & 0x04))
1764                                 {
1765                                         cpu.z80F |= Z80_FLAG_ZERO;
1766                                 }
1767                         break;
1768                 }
1769                 case 0x58:
1770                 {
1771                         sdwCyclesRemaining -= 8;
1772                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1773                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1774                                 if (!(cpu.z80B & 0x08))
1775                                 {
1776                                         cpu.z80F |= Z80_FLAG_ZERO;
1777                                 }
1778                         break;
1779                 }
1780                 case 0x59:
1781                 {
1782                         sdwCyclesRemaining -= 8;
1783                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1784                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1785                                 if (!(cpu.z80C & 0x08))
1786                                 {
1787                                         cpu.z80F |= Z80_FLAG_ZERO;
1788                                 }
1789                         break;
1790                 }
1791                 case 0x5a:
1792                 {
1793                         sdwCyclesRemaining -= 8;
1794                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1795                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1796                                 if (!(cpu.z80D & 0x08))
1797                                 {
1798                                         cpu.z80F |= Z80_FLAG_ZERO;
1799                                 }
1800                         break;
1801                 }
1802                 case 0x5b:
1803                 {
1804                         sdwCyclesRemaining -= 8;
1805                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1806                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1807                                 if (!(cpu.z80E & 0x08))
1808                                 {
1809                                         cpu.z80F |= Z80_FLAG_ZERO;
1810                                 }
1811                         break;
1812                 }
1813                 case 0x5c:
1814                 {
1815                         sdwCyclesRemaining -= 8;
1816                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1817                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1818                                 if (!(cpu.z80H & 0x08))
1819                                 {
1820                                         cpu.z80F |= Z80_FLAG_ZERO;
1821                                 }
1822                         break;
1823                 }
1824                 case 0x5d:
1825                 {
1826                         sdwCyclesRemaining -= 8;
1827                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1828                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1829                                 if (!(cpu.z80L & 0x08))
1830                                 {
1831                                         cpu.z80F |= Z80_FLAG_ZERO;
1832                                 }
1833                         break;
1834                 }
1835                 case 0x5e:
1836                 {
1837                         sdwCyclesRemaining -= 12;
1838                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
1839                                 while (psMemRead->lowAddr != 0xffffffff)
1840                                 {
1841                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
1842                                         {
1843                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1844                                                 if (psMemRead->memoryCall)
1845                                                 {
1846                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
1847                                                 }
1848                                                 else
1849                                                 {
1850                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
1851                                                 }
1852                                                 psMemRead = NULL;
1853                                                 break;
1854                                         }
1855                                         ++psMemRead;
1856                                 }
1857
1858                                 if (psMemRead)
1859                                 {
1860                                         bTemp = cpu.z80Base[cpu.z80HL];
1861                                 }
1862
1863                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1864                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1865                                 if (!(bTemp & 0x08))
1866                                 {
1867                                         cpu.z80F |= Z80_FLAG_ZERO;
1868                                 }
1869                         break;
1870                 }
1871                 case 0x5f:
1872                 {
1873                         sdwCyclesRemaining -= 8;
1874                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1875                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1876                                 if (!(cpu.z80A & 0x08))
1877                                 {
1878                                         cpu.z80F |= Z80_FLAG_ZERO;
1879                                 }
1880                         break;
1881                 }
1882                 case 0x60:
1883                 {
1884                         sdwCyclesRemaining -= 8;
1885                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1886                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1887                                 if (!(cpu.z80B & 0x10))
1888                                 {
1889                                         cpu.z80F |= Z80_FLAG_ZERO;
1890                                 }
1891                         break;
1892                 }
1893                 case 0x61:
1894                 {
1895                         sdwCyclesRemaining -= 8;
1896                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1897                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1898                                 if (!(cpu.z80C & 0x10))
1899                                 {
1900                                         cpu.z80F |= Z80_FLAG_ZERO;
1901                                 }
1902                         break;
1903                 }
1904                 case 0x62:
1905                 {
1906                         sdwCyclesRemaining -= 8;
1907                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1908                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1909                                 if (!(cpu.z80D & 0x10))
1910                                 {
1911                                         cpu.z80F |= Z80_FLAG_ZERO;
1912                                 }
1913                         break;
1914                 }
1915                 case 0x63:
1916                 {
1917                         sdwCyclesRemaining -= 8;
1918                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1919                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1920                                 if (!(cpu.z80E & 0x10))
1921                                 {
1922                                         cpu.z80F |= Z80_FLAG_ZERO;
1923                                 }
1924                         break;
1925                 }
1926                 case 0x64:
1927                 {
1928                         sdwCyclesRemaining -= 8;
1929                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1930                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1931                                 if (!(cpu.z80H & 0x10))
1932                                 {
1933                                         cpu.z80F |= Z80_FLAG_ZERO;
1934                                 }
1935                         break;
1936                 }
1937                 case 0x65:
1938                 {
1939                         sdwCyclesRemaining -= 8;
1940                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1941                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1942                                 if (!(cpu.z80L & 0x10))
1943                                 {
1944                                         cpu.z80F |= Z80_FLAG_ZERO;
1945                                 }
1946                         break;
1947                 }
1948                 case 0x66:
1949                 {
1950                         sdwCyclesRemaining -= 12;
1951                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
1952                                 while (psMemRead->lowAddr != 0xffffffff)
1953                                 {
1954                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
1955                                         {
1956                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1957                                                 if (psMemRead->memoryCall)
1958                                                 {
1959                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
1960                                                 }
1961                                                 else
1962                                                 {
1963                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
1964                                                 }
1965                                                 psMemRead = NULL;
1966                                                 break;
1967                                         }
1968                                         ++psMemRead;
1969                                 }
1970
1971                                 if (psMemRead)
1972                                 {
1973                                         bTemp = cpu.z80Base[cpu.z80HL];
1974                                 }
1975
1976                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1977                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1978                                 if (!(bTemp & 0x10))
1979                                 {
1980                                         cpu.z80F |= Z80_FLAG_ZERO;
1981                                 }
1982                         break;
1983                 }
1984                 case 0x67:
1985                 {
1986                         sdwCyclesRemaining -= 8;
1987                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1988                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1989                                 if (!(cpu.z80A & 0x10))
1990                                 {
1991                                         cpu.z80F |= Z80_FLAG_ZERO;
1992                                 }
1993                         break;
1994                 }
1995                 case 0x68:
1996                 {
1997                         sdwCyclesRemaining -= 8;
1998                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1999                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2000                                 if (!(cpu.z80B & 0x20))
2001                                 {
2002                                         cpu.z80F |= Z80_FLAG_ZERO;
2003                                 }
2004                         break;
2005                 }
2006                 case 0x69:
2007                 {
2008                         sdwCyclesRemaining -= 8;
2009                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2010                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2011                                 if (!(cpu.z80C & 0x20))
2012                                 {
2013                                         cpu.z80F |= Z80_FLAG_ZERO;
2014                                 }
2015                         break;
2016                 }
2017                 case 0x6a:
2018                 {
2019                         sdwCyclesRemaining -= 8;
2020                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2021                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2022                                 if (!(cpu.z80D & 0x20))
2023                                 {
2024                                         cpu.z80F |= Z80_FLAG_ZERO;
2025                                 }
2026                         break;
2027                 }
2028                 case 0x6b:
2029                 {
2030                         sdwCyclesRemaining -= 8;
2031                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2032                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2033                                 if (!(cpu.z80E & 0x20))
2034                                 {
2035                                         cpu.z80F |= Z80_FLAG_ZERO;
2036                                 }
2037                         break;
2038                 }
2039                 case 0x6c:
2040                 {
2041                         sdwCyclesRemaining -= 8;
2042                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2043                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2044                                 if (!(cpu.z80H & 0x20))
2045                                 {
2046                                         cpu.z80F |= Z80_FLAG_ZERO;
2047                                 }
2048                         break;
2049                 }
2050                 case 0x6d:
2051                 {
2052                         sdwCyclesRemaining -= 8;
2053                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2054                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2055                                 if (!(cpu.z80L & 0x20))
2056                                 {
2057                                         cpu.z80F |= Z80_FLAG_ZERO;
2058                                 }
2059                         break;
2060                 }
2061                 case 0x6e:
2062                 {
2063                         sdwCyclesRemaining -= 12;
2064                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
2065                                 while (psMemRead->lowAddr != 0xffffffff)
2066                                 {
2067                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
2068                                         {
2069                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2070                                                 if (psMemRead->memoryCall)
2071                                                 {
2072                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
2073                                                 }
2074                                                 else
2075                                                 {
2076                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
2077                                                 }
2078                                                 psMemRead = NULL;
2079                                                 break;
2080                                         }
2081                                         ++psMemRead;
2082                                 }
2083
2084                                 if (psMemRead)
2085                                 {
2086                                         bTemp = cpu.z80Base[cpu.z80HL];
2087                                 }
2088
2089                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2090                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2091                                 if (!(bTemp & 0x20))
2092                                 {
2093                                         cpu.z80F |= Z80_FLAG_ZERO;
2094                                 }
2095                         break;
2096                 }
2097                 case 0x6f:
2098                 {
2099                         sdwCyclesRemaining -= 8;
2100                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2101                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2102                                 if (!(cpu.z80A & 0x20))
2103                                 {
2104                                         cpu.z80F |= Z80_FLAG_ZERO;
2105                                 }
2106                         break;
2107                 }
2108                 case 0x70:
2109                 {
2110                         sdwCyclesRemaining -= 8;
2111                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2112                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2113                                 if (!(cpu.z80B & 0x40))
2114                                 {
2115                                         cpu.z80F |= Z80_FLAG_ZERO;
2116                                 }
2117                         break;
2118                 }
2119                 case 0x71:
2120                 {
2121                         sdwCyclesRemaining -= 8;
2122                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2123                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2124                                 if (!(cpu.z80C & 0x40))
2125                                 {
2126                                         cpu.z80F |= Z80_FLAG_ZERO;
2127                                 }
2128                         break;
2129                 }
2130                 case 0x72:
2131                 {
2132                         sdwCyclesRemaining -= 8;
2133                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2134                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2135                                 if (!(cpu.z80D & 0x40))
2136                                 {
2137                                         cpu.z80F |= Z80_FLAG_ZERO;
2138                                 }
2139                         break;
2140                 }
2141                 case 0x73:
2142                 {
2143                         sdwCyclesRemaining -= 8;
2144                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2145                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2146                                 if (!(cpu.z80E & 0x40))
2147                                 {
2148                                         cpu.z80F |= Z80_FLAG_ZERO;
2149                                 }
2150                         break;
2151                 }
2152                 case 0x74:
2153                 {
2154                         sdwCyclesRemaining -= 8;
2155                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2156                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2157                                 if (!(cpu.z80H & 0x40))
2158                                 {
2159                                         cpu.z80F |= Z80_FLAG_ZERO;
2160                                 }
2161                         break;
2162                 }
2163                 case 0x75:
2164                 {
2165                         sdwCyclesRemaining -= 8;
2166                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2167                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2168                                 if (!(cpu.z80L & 0x40))
2169                                 {
2170                                         cpu.z80F |= Z80_FLAG_ZERO;
2171                                 }
2172                         break;
2173                 }
2174                 case 0x76:
2175                 {
2176                         sdwCyclesRemaining -= 12;
2177                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
2178                                 while (psMemRead->lowAddr != 0xffffffff)
2179                                 {
2180                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
2181                                         {
2182                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2183                                                 if (psMemRead->memoryCall)
2184                                                 {
2185                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
2186                                                 }
2187                                                 else
2188                                                 {
2189                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
2190                                                 }
2191                                                 psMemRead = NULL;
2192                                                 break;
2193                                         }
2194                                         ++psMemRead;
2195                                 }
2196
2197                                 if (psMemRead)
2198                                 {
2199                                         bTemp = cpu.z80Base[cpu.z80HL];
2200                                 }
2201
2202                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2203                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2204                                 if (!(bTemp & 0x40))
2205                                 {
2206                                         cpu.z80F |= Z80_FLAG_ZERO;
2207                                 }
2208                         break;
2209                 }
2210                 case 0x77:
2211                 {
2212                         sdwCyclesRemaining -= 8;
2213                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2214                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2215                                 if (!(cpu.z80A & 0x40))
2216                                 {
2217                                         cpu.z80F |= Z80_FLAG_ZERO;
2218                                 }
2219                         break;
2220                 }
2221                 case 0x78:
2222                 {
2223                         sdwCyclesRemaining -= 8;
2224                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2225                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2226                                 if (!(cpu.z80B & 0x80))
2227                                 {
2228                                         cpu.z80F |= Z80_FLAG_ZERO;
2229                                 }
2230                         break;
2231                 }
2232                 case 0x79:
2233                 {
2234                         sdwCyclesRemaining -= 8;
2235                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2236                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2237                                 if (!(cpu.z80C & 0x80))
2238                                 {
2239                                         cpu.z80F |= Z80_FLAG_ZERO;
2240                                 }
2241                         break;
2242                 }
2243                 case 0x7a:
2244                 {
2245                         sdwCyclesRemaining -= 8;
2246                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2247                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2248                                 if (!(cpu.z80D & 0x80))
2249                                 {
2250                                         cpu.z80F |= Z80_FLAG_ZERO;
2251                                 }
2252                         break;
2253                 }
2254                 case 0x7b:
2255                 {
2256                         sdwCyclesRemaining -= 8;
2257                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2258                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2259                                 if (!(cpu.z80E & 0x80))
2260                                 {
2261                                         cpu.z80F |= Z80_FLAG_ZERO;
2262                                 }
2263                         break;
2264                 }
2265                 case 0x7c:
2266                 {
2267                         sdwCyclesRemaining -= 8;
2268                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2269                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2270                                 if (!(cpu.z80H & 0x80))
2271                                 {
2272                                         cpu.z80F |= Z80_FLAG_ZERO;
2273                                 }
2274                         break;
2275                 }
2276                 case 0x7d:
2277                 {
2278                         sdwCyclesRemaining -= 8;
2279                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2280                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2281                                 if (!(cpu.z80L & 0x80))
2282                                 {
2283                                         cpu.z80F |= Z80_FLAG_ZERO;
2284                                 }
2285                         break;
2286                 }
2287                 case 0x7e:
2288                 {
2289                         sdwCyclesRemaining -= 12;
2290                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
2291                                 while (psMemRead->lowAddr != 0xffffffff)
2292                                 {
2293                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
2294                                         {
2295                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2296                                                 if (psMemRead->memoryCall)
2297                                                 {
2298                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
2299                                                 }
2300                                                 else
2301                                                 {
2302                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
2303                                                 }
2304                                                 psMemRead = NULL;
2305                                                 break;
2306                                         }
2307                                         ++psMemRead;
2308                                 }
2309
2310                                 if (psMemRead)
2311                                 {
2312                                         bTemp = cpu.z80Base[cpu.z80HL];
2313                                 }
2314
2315                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2316                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2317                                 if (!(bTemp & 0x80))
2318                                 {
2319                                         cpu.z80F |= Z80_FLAG_ZERO;
2320                                 }
2321                         break;
2322                 }
2323                 case 0x7f:
2324                 {
2325                         sdwCyclesRemaining -= 8;
2326                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2327                                 cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2328                                 if (!(cpu.z80A & 0x80))
2329                                 {
2330                                         cpu.z80F |= Z80_FLAG_ZERO;
2331                                 }
2332                         break;
2333                 }
2334                 case 0x80:
2335                 {
2336                         sdwCyclesRemaining -= 8;
2337                                 cpu.z80B &= 0xfe;
2338                         break;
2339                 }
2340                 case 0x81:
2341                 {
2342                         sdwCyclesRemaining -= 8;
2343                                 cpu.z80C &= 0xfe;
2344                         break;
2345                 }
2346                 case 0x82:
2347                 {
2348                         sdwCyclesRemaining -= 8;
2349                                 cpu.z80D &= 0xfe;
2350                         break;
2351                 }
2352                 case 0x83:
2353                 {
2354                         sdwCyclesRemaining -= 8;
2355                                 cpu.z80E &= 0xfe;
2356                         break;
2357                 }
2358                 case 0x84:
2359                 {
2360                         sdwCyclesRemaining -= 8;
2361                                 cpu.z80H &= 0xfe;
2362                         break;
2363                 }
2364                 case 0x85:
2365                 {
2366                         sdwCyclesRemaining -= 8;
2367                                 cpu.z80L &= 0xfe;
2368                         break;
2369                 }
2370                 case 0x86:
2371                 {
2372                         sdwCyclesRemaining -= 15;
2373                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
2374                                 while (psMemRead->lowAddr != 0xffffffff)
2375                                 {
2376                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
2377                                         {
2378                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2379                                                 if (psMemRead->memoryCall)
2380                                                 {
2381                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
2382                                                 }
2383                                                 else
2384                                                 {
2385                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
2386                                                 }
2387                                                 psMemRead = NULL;
2388                                                 break;
2389                                         }
2390                                         ++psMemRead;
2391                                 }
2392
2393                                 if (psMemRead)
2394                                 {
2395                                         bTemp = cpu.z80Base[cpu.z80HL];
2396                                 }
2397
2398                                 bTemp &= 0xfe;
2399                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
2400                                 while (psMemWrite->lowAddr != 0xffffffff)
2401                                 {
2402                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
2403                                         {
2404                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2405                                                 if (psMemWrite->memoryCall)
2406                                                 {
2407                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
2408                                                 }
2409                                                 else
2410                                                 {
2411                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
2412                                                 }
2413                                                 psMemWrite = NULL;
2414                                                 break;
2415                                         }
2416                                         ++psMemWrite;
2417                                 }
2418
2419                                 if (psMemWrite)
2420                                 {
2421                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
2422                                 }
2423
2424                         break;
2425                 }
2426                 case 0x87:
2427                 {
2428                         sdwCyclesRemaining -= 8;
2429                                 cpu.z80A &= 0xfe;
2430                         break;
2431                 }
2432                 case 0x88:
2433                 {
2434                         sdwCyclesRemaining -= 8;
2435                                 cpu.z80B &= 0xfd;
2436                         break;
2437                 }
2438                 case 0x89:
2439                 {
2440                         sdwCyclesRemaining -= 8;
2441                                 cpu.z80C &= 0xfd;
2442                         break;
2443                 }
2444                 case 0x8a:
2445                 {
2446                         sdwCyclesRemaining -= 8;
2447                                 cpu.z80D &= 0xfd;
2448                         break;
2449                 }
2450                 case 0x8b:
2451                 {
2452                         sdwCyclesRemaining -= 8;
2453                                 cpu.z80E &= 0xfd;
2454                         break;
2455                 }
2456                 case 0x8c:
2457                 {
2458                         sdwCyclesRemaining -= 8;
2459                                 cpu.z80H &= 0xfd;
2460                         break;
2461                 }
2462                 case 0x8d:
2463                 {
2464                         sdwCyclesRemaining -= 8;
2465                                 cpu.z80L &= 0xfd;
2466                         break;
2467                 }
2468                 case 0x8e:
2469                 {
2470                         sdwCyclesRemaining -= 15;
2471                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
2472                                 while (psMemRead->lowAddr != 0xffffffff)
2473                                 {
2474                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
2475                                         {
2476                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2477                                                 if (psMemRead->memoryCall)
2478                                                 {
2479                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
2480                                                 }
2481                                                 else
2482                                                 {
2483                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
2484                                                 }
2485                                                 psMemRead = NULL;
2486                                                 break;
2487                                         }
2488                                         ++psMemRead;
2489                                 }
2490
2491                                 if (psMemRead)
2492                                 {
2493                                         bTemp = cpu.z80Base[cpu.z80HL];
2494                                 }
2495
2496                                 bTemp &= 0xfd;
2497                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
2498                                 while (psMemWrite->lowAddr != 0xffffffff)
2499                                 {
2500                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
2501                                         {
2502                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2503                                                 if (psMemWrite->memoryCall)
2504                                                 {
2505                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
2506                                                 }
2507                                                 else
2508                                                 {
2509                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
2510                                                 }
2511                                                 psMemWrite = NULL;
2512                                                 break;
2513                                         }
2514                                         ++psMemWrite;
2515                                 }
2516
2517                                 if (psMemWrite)
2518                                 {
2519                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
2520                                 }
2521
2522                         break;
2523                 }
2524                 case 0x8f:
2525                 {
2526                         sdwCyclesRemaining -= 8;
2527                                 cpu.z80A &= 0xfd;
2528                         break;
2529                 }
2530                 case 0x90:
2531                 {
2532                         sdwCyclesRemaining -= 8;
2533                                 cpu.z80B &= 0xfb;
2534                         break;
2535                 }
2536                 case 0x91:
2537                 {
2538                         sdwCyclesRemaining -= 8;
2539                                 cpu.z80C &= 0xfb;
2540                         break;
2541                 }
2542                 case 0x92:
2543                 {
2544                         sdwCyclesRemaining -= 8;
2545                                 cpu.z80D &= 0xfb;
2546                         break;
2547                 }
2548                 case 0x93:
2549                 {
2550                         sdwCyclesRemaining -= 8;
2551                                 cpu.z80E &= 0xfb;
2552                         break;
2553                 }
2554                 case 0x94:
2555                 {
2556                         sdwCyclesRemaining -= 8;
2557                                 cpu.z80H &= 0xfb;
2558                         break;
2559                 }
2560                 case 0x95:
2561                 {
2562                         sdwCyclesRemaining -= 8;
2563                                 cpu.z80L &= 0xfb;
2564                         break;
2565                 }
2566                 case 0x96:
2567                 {
2568                         sdwCyclesRemaining -= 15;
2569                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
2570                                 while (psMemRead->lowAddr != 0xffffffff)
2571                                 {
2572                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
2573                                         {
2574                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2575                                                 if (psMemRead->memoryCall)
2576                                                 {
2577                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
2578                                                 }
2579                                                 else
2580                                                 {
2581                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
2582                                                 }
2583                                                 psMemRead = NULL;
2584                                                 break;
2585                                         }
2586                                         ++psMemRead;
2587                                 }
2588
2589                                 if (psMemRead)
2590                                 {
2591                                         bTemp = cpu.z80Base[cpu.z80HL];
2592                                 }
2593
2594                                 bTemp &= 0xfb;
2595                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
2596                                 while (psMemWrite->lowAddr != 0xffffffff)
2597                                 {
2598                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
2599                                         {
2600                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2601                                                 if (psMemWrite->memoryCall)
2602                                                 {
2603                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
2604                                                 }
2605                                                 else
2606                                                 {
2607                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
2608                                                 }
2609                                                 psMemWrite = NULL;
2610                                                 break;
2611                                         }
2612                                         ++psMemWrite;
2613                                 }
2614
2615                                 if (psMemWrite)
2616                                 {
2617                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
2618                                 }
2619
2620                         break;
2621                 }
2622                 case 0x97:
2623                 {
2624                         sdwCyclesRemaining -= 8;
2625                                 cpu.z80A &= 0xfb;
2626                         break;
2627                 }
2628                 case 0x98:
2629                 {
2630                         sdwCyclesRemaining -= 8;
2631                                 cpu.z80B &= 0xf7;
2632                         break;
2633                 }
2634                 case 0x99:
2635                 {
2636                         sdwCyclesRemaining -= 8;
2637                                 cpu.z80C &= 0xf7;
2638                         break;
2639                 }
2640                 case 0x9a:
2641                 {
2642                         sdwCyclesRemaining -= 8;
2643                                 cpu.z80D &= 0xf7;
2644                         break;
2645                 }
2646                 case 0x9b:
2647                 {
2648                         sdwCyclesRemaining -= 8;
2649                                 cpu.z80E &= 0xf7;
2650                         break;
2651                 }
2652                 case 0x9c:
2653                 {
2654                         sdwCyclesRemaining -= 8;
2655                                 cpu.z80H &= 0xf7;
2656                         break;
2657                 }
2658                 case 0x9d:
2659                 {
2660                         sdwCyclesRemaining -= 8;
2661                                 cpu.z80L &= 0xf7;
2662                         break;
2663                 }
2664                 case 0x9e:
2665                 {
2666                         sdwCyclesRemaining -= 15;
2667                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
2668                                 while (psMemRead->lowAddr != 0xffffffff)
2669                                 {
2670                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
2671                                         {
2672                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2673                                                 if (psMemRead->memoryCall)
2674                                                 {
2675                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
2676                                                 }
2677                                                 else
2678                                                 {
2679                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
2680                                                 }
2681                                                 psMemRead = NULL;
2682                                                 break;
2683                                         }
2684                                         ++psMemRead;
2685                                 }
2686
2687                                 if (psMemRead)
2688                                 {
2689                                         bTemp = cpu.z80Base[cpu.z80HL];
2690                                 }
2691
2692                                 bTemp &= 0xf7;
2693                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
2694                                 while (psMemWrite->lowAddr != 0xffffffff)
2695                                 {
2696                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
2697                                         {
2698                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2699                                                 if (psMemWrite->memoryCall)
2700                                                 {
2701                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
2702                                                 }
2703                                                 else
2704                                                 {
2705                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
2706                                                 }
2707                                                 psMemWrite = NULL;
2708                                                 break;
2709                                         }
2710                                         ++psMemWrite;
2711                                 }
2712
2713                                 if (psMemWrite)
2714                                 {
2715                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
2716                                 }
2717
2718                         break;
2719                 }
2720                 case 0x9f:
2721                 {
2722                         sdwCyclesRemaining -= 8;
2723                                 cpu.z80A &= 0xf7;
2724                         break;
2725                 }
2726                 case 0xa0:
2727                 {
2728                         sdwCyclesRemaining -= 8;
2729                                 cpu.z80B &= 0xef;
2730                         break;
2731                 }
2732                 case 0xa1:
2733                 {
2734                         sdwCyclesRemaining -= 8;
2735                                 cpu.z80C &= 0xef;
2736                         break;
2737                 }
2738                 case 0xa2:
2739                 {
2740                         sdwCyclesRemaining -= 8;
2741                                 cpu.z80D &= 0xef;
2742                         break;
2743                 }
2744                 case 0xa3:
2745                 {
2746                         sdwCyclesRemaining -= 8;
2747                                 cpu.z80E &= 0xef;
2748                         break;
2749                 }
2750                 case 0xa4:
2751                 {
2752                         sdwCyclesRemaining -= 8;
2753                                 cpu.z80H &= 0xef;
2754                         break;
2755                 }
2756                 case 0xa5:
2757                 {
2758                         sdwCyclesRemaining -= 8;
2759                                 cpu.z80L &= 0xef;
2760                         break;
2761                 }
2762                 case 0xa6:
2763                 {
2764                         sdwCyclesRemaining -= 15;
2765                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
2766                                 while (psMemRead->lowAddr != 0xffffffff)
2767                                 {
2768                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
2769                                         {
2770                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2771                                                 if (psMemRead->memoryCall)
2772                                                 {
2773                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
2774                                                 }
2775                                                 else
2776                                                 {
2777                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
2778                                                 }
2779                                                 psMemRead = NULL;
2780                                                 break;
2781                                         }
2782                                         ++psMemRead;
2783                                 }
2784
2785                                 if (psMemRead)
2786                                 {
2787                                         bTemp = cpu.z80Base[cpu.z80HL];
2788                                 }
2789
2790                                 bTemp &= 0xef;
2791                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
2792                                 while (psMemWrite->lowAddr != 0xffffffff)
2793                                 {
2794                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
2795                                         {
2796                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2797                                                 if (psMemWrite->memoryCall)
2798                                                 {
2799                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
2800                                                 }
2801                                                 else
2802                                                 {
2803                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
2804                                                 }
2805                                                 psMemWrite = NULL;
2806                                                 break;
2807                                         }
2808                                         ++psMemWrite;
2809                                 }
2810
2811                                 if (psMemWrite)
2812                                 {
2813                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
2814                                 }
2815
2816                         break;
2817                 }
2818                 case 0xa7:
2819                 {
2820                         sdwCyclesRemaining -= 8;
2821                                 cpu.z80A &= 0xef;
2822                         break;
2823                 }
2824                 case 0xa8:
2825                 {
2826                         sdwCyclesRemaining -= 8;
2827                                 cpu.z80B &= 0xdf;
2828                         break;
2829                 }
2830                 case 0xa9:
2831                 {
2832                         sdwCyclesRemaining -= 8;
2833                                 cpu.z80C &= 0xdf;
2834                         break;
2835                 }
2836                 case 0xaa:
2837                 {
2838                         sdwCyclesRemaining -= 8;
2839                                 cpu.z80D &= 0xdf;
2840                         break;
2841                 }
2842                 case 0xab:
2843                 {
2844                         sdwCyclesRemaining -= 8;
2845                                 cpu.z80E &= 0xdf;
2846                         break;
2847                 }
2848                 case 0xac:
2849                 {
2850                         sdwCyclesRemaining -= 8;
2851                                 cpu.z80H &= 0xdf;
2852                         break;
2853                 }
2854                 case 0xad:
2855                 {
2856                         sdwCyclesRemaining -= 8;
2857                                 cpu.z80L &= 0xdf;
2858                         break;
2859                 }
2860                 case 0xae:
2861                 {
2862                         sdwCyclesRemaining -= 15;
2863                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
2864                                 while (psMemRead->lowAddr != 0xffffffff)
2865                                 {
2866                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
2867                                         {
2868                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2869                                                 if (psMemRead->memoryCall)
2870                                                 {
2871                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
2872                                                 }
2873                                                 else
2874                                                 {
2875                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
2876                                                 }
2877                                                 psMemRead = NULL;
2878                                                 break;
2879                                         }
2880                                         ++psMemRead;
2881                                 }
2882
2883                                 if (psMemRead)
2884                                 {
2885                                         bTemp = cpu.z80Base[cpu.z80HL];
2886                                 }
2887
2888                                 bTemp &= 0xdf;
2889                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
2890                                 while (psMemWrite->lowAddr != 0xffffffff)
2891                                 {
2892                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
2893                                         {
2894                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2895                                                 if (psMemWrite->memoryCall)
2896                                                 {
2897                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
2898                                                 }
2899                                                 else
2900                                                 {
2901                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
2902                                                 }
2903                                                 psMemWrite = NULL;
2904                                                 break;
2905                                         }
2906                                         ++psMemWrite;
2907                                 }
2908
2909                                 if (psMemWrite)
2910                                 {
2911                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
2912                                 }
2913
2914                         break;
2915                 }
2916                 case 0xaf:
2917                 {
2918                         sdwCyclesRemaining -= 8;
2919                                 cpu.z80A &= 0xdf;
2920                         break;
2921                 }
2922                 case 0xb0:
2923                 {
2924                         sdwCyclesRemaining -= 8;
2925                                 cpu.z80B &= 0xbf;
2926                         break;
2927                 }
2928                 case 0xb1:
2929                 {
2930                         sdwCyclesRemaining -= 8;
2931                                 cpu.z80C &= 0xbf;
2932                         break;
2933                 }
2934                 case 0xb2:
2935                 {
2936                         sdwCyclesRemaining -= 8;
2937                                 cpu.z80D &= 0xbf;
2938                         break;
2939                 }
2940                 case 0xb3:
2941                 {
2942                         sdwCyclesRemaining -= 8;
2943                                 cpu.z80E &= 0xbf;
2944                         break;
2945                 }
2946                 case 0xb4:
2947                 {
2948                         sdwCyclesRemaining -= 8;
2949                                 cpu.z80H &= 0xbf;
2950                         break;
2951                 }
2952                 case 0xb5:
2953                 {
2954                         sdwCyclesRemaining -= 8;
2955                                 cpu.z80L &= 0xbf;
2956                         break;
2957                 }
2958                 case 0xb6:
2959                 {
2960                         sdwCyclesRemaining -= 15;
2961                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
2962                                 while (psMemRead->lowAddr != 0xffffffff)
2963                                 {
2964                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
2965                                         {
2966                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2967                                                 if (psMemRead->memoryCall)
2968                                                 {
2969                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
2970                                                 }
2971                                                 else
2972                                                 {
2973                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
2974                                                 }
2975                                                 psMemRead = NULL;
2976                                                 break;
2977                                         }
2978                                         ++psMemRead;
2979                                 }
2980
2981                                 if (psMemRead)
2982                                 {
2983                                         bTemp = cpu.z80Base[cpu.z80HL];
2984                                 }
2985
2986                                 bTemp &= 0xbf;
2987                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
2988                                 while (psMemWrite->lowAddr != 0xffffffff)
2989                                 {
2990                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
2991                                         {
2992                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2993                                                 if (psMemWrite->memoryCall)
2994                                                 {
2995                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
2996                                                 }
2997                                                 else
2998                                                 {
2999                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
3000                                                 }
3001                                                 psMemWrite = NULL;
3002                                                 break;
3003                                         }
3004                                         ++psMemWrite;
3005                                 }
3006
3007                                 if (psMemWrite)
3008                                 {
3009                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
3010                                 }
3011
3012                         break;
3013                 }
3014                 case 0xb7:
3015                 {
3016                         sdwCyclesRemaining -= 8;
3017                                 cpu.z80A &= 0xbf;
3018                         break;
3019                 }
3020                 case 0xb8:
3021                 {
3022                         sdwCyclesRemaining -= 8;
3023                                 cpu.z80B &= 0x7f;
3024                         break;
3025                 }
3026                 case 0xb9:
3027                 {
3028                         sdwCyclesRemaining -= 8;
3029                                 cpu.z80C &= 0x7f;
3030                         break;
3031                 }
3032                 case 0xba:
3033                 {
3034                         sdwCyclesRemaining -= 8;
3035                                 cpu.z80D &= 0x7f;
3036                         break;
3037                 }
3038                 case 0xbb:
3039                 {
3040                         sdwCyclesRemaining -= 8;
3041                                 cpu.z80E &= 0x7f;
3042                         break;
3043                 }
3044                 case 0xbc:
3045                 {
3046                         sdwCyclesRemaining -= 8;
3047                                 cpu.z80H &= 0x7f;
3048                         break;
3049                 }
3050                 case 0xbd:
3051                 {
3052                         sdwCyclesRemaining -= 8;
3053                                 cpu.z80L &= 0x7f;
3054                         break;
3055                 }
3056                 case 0xbe:
3057                 {
3058                         sdwCyclesRemaining -= 15;
3059                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
3060                                 while (psMemRead->lowAddr != 0xffffffff)
3061                                 {
3062                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
3063                                         {
3064                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3065                                                 if (psMemRead->memoryCall)
3066                                                 {
3067                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
3068                                                 }
3069                                                 else
3070                                                 {
3071                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
3072                                                 }
3073                                                 psMemRead = NULL;
3074                                                 break;
3075                                         }
3076                                         ++psMemRead;
3077                                 }
3078
3079                                 if (psMemRead)
3080                                 {
3081                                         bTemp = cpu.z80Base[cpu.z80HL];
3082                                 }
3083
3084                                 bTemp &= 0x7f;
3085                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
3086                                 while (psMemWrite->lowAddr != 0xffffffff)
3087                                 {
3088                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
3089                                         {
3090                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3091                                                 if (psMemWrite->memoryCall)
3092                                                 {
3093                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
3094                                                 }
3095                                                 else
3096                                                 {
3097                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
3098                                                 }
3099                                                 psMemWrite = NULL;
3100                                                 break;
3101                                         }
3102                                         ++psMemWrite;
3103                                 }
3104
3105                                 if (psMemWrite)
3106                                 {
3107                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
3108                                 }
3109
3110                         break;
3111                 }
3112                 case 0xbf:
3113                 {
3114                         sdwCyclesRemaining -= 8;
3115                                 cpu.z80A &= 0x7f;
3116                         break;
3117                 }
3118                 case 0xc0:
3119                 {
3120                         sdwCyclesRemaining -= 8;
3121                                 cpu.z80B |= 0x01;
3122                         break;
3123                 }
3124                 case 0xc1:
3125                 {
3126                         sdwCyclesRemaining -= 8;
3127                                 cpu.z80C |= 0x01;
3128                         break;
3129                 }
3130                 case 0xc2:
3131                 {
3132                         sdwCyclesRemaining -= 8;
3133                                 cpu.z80D |= 0x01;
3134                         break;
3135                 }
3136                 case 0xc3:
3137                 {
3138                         sdwCyclesRemaining -= 8;
3139                                 cpu.z80E |= 0x01;
3140                         break;
3141                 }
3142                 case 0xc4:
3143                 {
3144                         sdwCyclesRemaining -= 8;
3145                                 cpu.z80H |= 0x01;
3146                         break;
3147                 }
3148                 case 0xc5:
3149                 {
3150                         sdwCyclesRemaining -= 8;
3151                                 cpu.z80L |= 0x01;
3152                         break;
3153                 }
3154                 case 0xc6:
3155                 {
3156                         sdwCyclesRemaining -= 15;
3157                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
3158                                 while (psMemRead->lowAddr != 0xffffffff)
3159                                 {
3160                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
3161                                         {
3162                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3163                                                 if (psMemRead->memoryCall)
3164                                                 {
3165                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
3166                                                 }
3167                                                 else
3168                                                 {
3169                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
3170                                                 }
3171                                                 psMemRead = NULL;
3172                                                 break;
3173                                         }
3174                                         ++psMemRead;
3175                                 }
3176
3177                                 if (psMemRead)
3178                                 {
3179                                         bTemp = cpu.z80Base[cpu.z80HL];
3180                                 }
3181
3182                                 bTemp |= 0x01;
3183                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
3184                                 while (psMemWrite->lowAddr != 0xffffffff)
3185                                 {
3186                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
3187                                         {
3188                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3189                                                 if (psMemWrite->memoryCall)
3190                                                 {
3191                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
3192                                                 }
3193                                                 else
3194                                                 {
3195                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
3196                                                 }
3197                                                 psMemWrite = NULL;
3198                                                 break;
3199                                         }
3200                                         ++psMemWrite;
3201                                 }
3202
3203                                 if (psMemWrite)
3204                                 {
3205                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
3206                                 }
3207
3208                         break;
3209                 }
3210                 case 0xc7:
3211                 {
3212                         sdwCyclesRemaining -= 8;
3213                                 cpu.z80A |= 0x01;
3214                         break;
3215                 }
3216                 case 0xc8:
3217                 {
3218                         sdwCyclesRemaining -= 8;
3219                                 cpu.z80B |= 0x02;
3220                         break;
3221                 }
3222                 case 0xc9:
3223                 {
3224                         sdwCyclesRemaining -= 8;
3225                                 cpu.z80C |= 0x02;
3226                         break;
3227                 }
3228                 case 0xca:
3229                 {
3230                         sdwCyclesRemaining -= 8;
3231                                 cpu.z80D |= 0x02;
3232                         break;
3233                 }
3234                 case 0xcb:
3235                 {
3236                         sdwCyclesRemaining -= 8;
3237                                 cpu.z80E |= 0x02;
3238                         break;
3239                 }
3240                 case 0xcc:
3241                 {
3242                         sdwCyclesRemaining -= 8;
3243                                 cpu.z80H |= 0x02;
3244                         break;
3245                 }
3246                 case 0xcd:
3247                 {
3248                         sdwCyclesRemaining -= 8;
3249                                 cpu.z80L |= 0x02;
3250                         break;
3251                 }
3252                 case 0xce:
3253                 {
3254                         sdwCyclesRemaining -= 15;
3255                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
3256                                 while (psMemRead->lowAddr != 0xffffffff)
3257                                 {
3258                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
3259                                         {
3260                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3261                                                 if (psMemRead->memoryCall)
3262                                                 {
3263                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
3264                                                 }
3265                                                 else
3266                                                 {
3267                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
3268                                                 }
3269                                                 psMemRead = NULL;
3270                                                 break;
3271                                         }
3272                                         ++psMemRead;
3273                                 }
3274
3275                                 if (psMemRead)
3276                                 {
3277                                         bTemp = cpu.z80Base[cpu.z80HL];
3278                                 }
3279
3280                                 bTemp |= 0x02;
3281                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
3282                                 while (psMemWrite->lowAddr != 0xffffffff)
3283                                 {
3284                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
3285                                         {
3286                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3287                                                 if (psMemWrite->memoryCall)
3288                                                 {
3289                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
3290                                                 }
3291                                                 else
3292                                                 {
3293                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
3294                                                 }
3295                                                 psMemWrite = NULL;
3296                                                 break;
3297                                         }
3298                                         ++psMemWrite;
3299                                 }
3300
3301                                 if (psMemWrite)
3302                                 {
3303                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
3304                                 }
3305
3306                         break;
3307                 }
3308                 case 0xcf:
3309                 {
3310                         sdwCyclesRemaining -= 8;
3311                                 cpu.z80A |= 0x02;
3312                         break;
3313                 }
3314                 case 0xd0:
3315                 {
3316                         sdwCyclesRemaining -= 8;
3317                                 cpu.z80B |= 0x04;
3318                         break;
3319                 }
3320                 case 0xd1:
3321                 {
3322                         sdwCyclesRemaining -= 8;
3323                                 cpu.z80C |= 0x04;
3324                         break;
3325                 }
3326                 case 0xd2:
3327                 {
3328                         sdwCyclesRemaining -= 8;
3329                                 cpu.z80D |= 0x04;
3330                         break;
3331                 }
3332                 case 0xd3:
3333                 {
3334                         sdwCyclesRemaining -= 8;
3335                                 cpu.z80E |= 0x04;
3336                         break;
3337                 }
3338                 case 0xd4:
3339                 {
3340                         sdwCyclesRemaining -= 8;
3341                                 cpu.z80H |= 0x04;
3342                         break;
3343                 }
3344                 case 0xd5:
3345                 {
3346                         sdwCyclesRemaining -= 8;
3347                                 cpu.z80L |= 0x04;
3348                         break;
3349                 }
3350                 case 0xd6:
3351                 {
3352                         sdwCyclesRemaining -= 15;
3353                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
3354                                 while (psMemRead->lowAddr != 0xffffffff)
3355                                 {
3356                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
3357                                         {
3358                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3359                                                 if (psMemRead->memoryCall)
3360                                                 {
3361                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
3362                                                 }
3363                                                 else
3364                                                 {
3365                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
3366                                                 }
3367                                                 psMemRead = NULL;
3368                                                 break;
3369                                         }
3370                                         ++psMemRead;
3371                                 }
3372
3373                                 if (psMemRead)
3374                                 {
3375                                         bTemp = cpu.z80Base[cpu.z80HL];
3376                                 }
3377
3378                                 bTemp |= 0x04;
3379                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
3380                                 while (psMemWrite->lowAddr != 0xffffffff)
3381                                 {
3382                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
3383                                         {
3384                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3385                                                 if (psMemWrite->memoryCall)
3386                                                 {
3387                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
3388                                                 }
3389                                                 else
3390                                                 {
3391                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
3392                                                 }
3393                                                 psMemWrite = NULL;
3394                                                 break;
3395                                         }
3396                                         ++psMemWrite;
3397                                 }
3398
3399                                 if (psMemWrite)
3400                                 {
3401                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
3402                                 }
3403
3404                         break;
3405                 }
3406                 case 0xd7:
3407                 {
3408                         sdwCyclesRemaining -= 8;
3409                                 cpu.z80A |= 0x04;
3410                         break;
3411                 }
3412                 case 0xd8:
3413                 {
3414                         sdwCyclesRemaining -= 8;
3415                                 cpu.z80B |= 0x08;
3416                         break;
3417                 }
3418                 case 0xd9:
3419                 {
3420                         sdwCyclesRemaining -= 8;
3421                                 cpu.z80C |= 0x08;
3422                         break;
3423                 }
3424                 case 0xda:
3425                 {
3426                         sdwCyclesRemaining -= 8;
3427                                 cpu.z80D |= 0x08;
3428                         break;
3429                 }
3430                 case 0xdb:
3431                 {
3432                         sdwCyclesRemaining -= 8;
3433                                 cpu.z80E |= 0x08;
3434                         break;
3435                 }
3436                 case 0xdc:
3437                 {
3438                         sdwCyclesRemaining -= 8;
3439                                 cpu.z80H |= 0x08;
3440                         break;
3441                 }
3442                 case 0xdd:
3443                 {
3444                         sdwCyclesRemaining -= 8;
3445                                 cpu.z80L |= 0x08;
3446                         break;
3447                 }
3448                 case 0xde:
3449                 {
3450                         sdwCyclesRemaining -= 15;
3451                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
3452                                 while (psMemRead->lowAddr != 0xffffffff)
3453                                 {
3454                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
3455                                         {
3456                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3457                                                 if (psMemRead->memoryCall)
3458                                                 {
3459                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
3460                                                 }
3461                                                 else
3462                                                 {
3463                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
3464                                                 }
3465                                                 psMemRead = NULL;
3466                                                 break;
3467                                         }
3468                                         ++psMemRead;
3469                                 }
3470
3471                                 if (psMemRead)
3472                                 {
3473                                         bTemp = cpu.z80Base[cpu.z80HL];
3474                                 }
3475
3476                                 bTemp |= 0x08;
3477                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
3478                                 while (psMemWrite->lowAddr != 0xffffffff)
3479                                 {
3480                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
3481                                         {
3482                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3483                                                 if (psMemWrite->memoryCall)
3484                                                 {
3485                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
3486                                                 }
3487                                                 else
3488                                                 {
3489                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
3490                                                 }
3491                                                 psMemWrite = NULL;
3492                                                 break;
3493                                         }
3494                                         ++psMemWrite;
3495                                 }
3496
3497                                 if (psMemWrite)
3498                                 {
3499                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
3500                                 }
3501
3502                         break;
3503                 }
3504                 case 0xdf:
3505                 {
3506                         sdwCyclesRemaining -= 8;
3507                                 cpu.z80A |= 0x08;
3508                         break;
3509                 }
3510                 case 0xe0:
3511                 {
3512                         sdwCyclesRemaining -= 8;
3513                                 cpu.z80B |= 0x10;
3514                         break;
3515                 }
3516                 case 0xe1:
3517                 {
3518                         sdwCyclesRemaining -= 8;
3519                                 cpu.z80C |= 0x10;
3520                         break;
3521                 }
3522                 case 0xe2:
3523                 {
3524                         sdwCyclesRemaining -= 8;
3525                                 cpu.z80D |= 0x10;
3526                         break;
3527                 }
3528                 case 0xe3:
3529                 {
3530                         sdwCyclesRemaining -= 8;
3531                                 cpu.z80E |= 0x10;
3532                         break;
3533                 }
3534                 case 0xe4:
3535                 {
3536                         sdwCyclesRemaining -= 8;
3537                                 cpu.z80H |= 0x10;
3538                         break;
3539                 }
3540                 case 0xe5:
3541                 {
3542                         sdwCyclesRemaining -= 8;
3543                                 cpu.z80L |= 0x10;
3544                         break;
3545                 }
3546                 case 0xe6:
3547                 {
3548                         sdwCyclesRemaining -= 15;
3549                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
3550                                 while (psMemRead->lowAddr != 0xffffffff)
3551                                 {
3552                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
3553                                         {
3554                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3555                                                 if (psMemRead->memoryCall)
3556                                                 {
3557                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
3558                                                 }
3559                                                 else
3560                                                 {
3561                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
3562                                                 }
3563                                                 psMemRead = NULL;
3564                                                 break;
3565                                         }
3566                                         ++psMemRead;
3567                                 }
3568
3569                                 if (psMemRead)
3570                                 {
3571                                         bTemp = cpu.z80Base[cpu.z80HL];
3572                                 }
3573
3574                                 bTemp |= 0x10;
3575                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
3576                                 while (psMemWrite->lowAddr != 0xffffffff)
3577                                 {
3578                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
3579                                         {
3580                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3581                                                 if (psMemWrite->memoryCall)
3582                                                 {
3583                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
3584                                                 }
3585                                                 else
3586                                                 {
3587                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
3588                                                 }
3589                                                 psMemWrite = NULL;
3590                                                 break;
3591                                         }
3592                                         ++psMemWrite;
3593                                 }
3594
3595                                 if (psMemWrite)
3596                                 {
3597                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
3598                                 }
3599
3600                         break;
3601                 }
3602                 case 0xe7:
3603                 {
3604                         sdwCyclesRemaining -= 8;
3605                                 cpu.z80A |= 0x10;
3606                         break;
3607                 }
3608                 case 0xe8:
3609                 {
3610                         sdwCyclesRemaining -= 8;
3611                                 cpu.z80B |= 0x20;
3612                         break;
3613                 }
3614                 case 0xe9:
3615                 {
3616                         sdwCyclesRemaining -= 8;
3617                                 cpu.z80C |= 0x20;
3618                         break;
3619                 }
3620                 case 0xea:
3621                 {
3622                         sdwCyclesRemaining -= 8;
3623                                 cpu.z80D |= 0x20;
3624                         break;
3625                 }
3626                 case 0xeb:
3627                 {
3628                         sdwCyclesRemaining -= 8;
3629                                 cpu.z80E |= 0x20;
3630                         break;
3631                 }
3632                 case 0xec:
3633                 {
3634                         sdwCyclesRemaining -= 8;
3635                                 cpu.z80H |= 0x20;
3636                         break;
3637                 }
3638                 case 0xed:
3639                 {
3640                         sdwCyclesRemaining -= 8;
3641                                 cpu.z80L |= 0x20;
3642                         break;
3643                 }
3644                 case 0xee:
3645                 {
3646                         sdwCyclesRemaining -= 15;
3647                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
3648                                 while (psMemRead->lowAddr != 0xffffffff)
3649                                 {
3650                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
3651                                         {
3652                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3653                                                 if (psMemRead->memoryCall)
3654                                                 {
3655                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
3656                                                 }
3657                                                 else
3658                                                 {
3659                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
3660                                                 }
3661                                                 psMemRead = NULL;
3662                                                 break;
3663                                         }
3664                                         ++psMemRead;
3665                                 }
3666
3667                                 if (psMemRead)
3668                                 {
3669                                         bTemp = cpu.z80Base[cpu.z80HL];
3670                                 }
3671
3672                                 bTemp |= 0x20;
3673                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
3674                                 while (psMemWrite->lowAddr != 0xffffffff)
3675                                 {
3676                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
3677                                         {
3678                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3679                                                 if (psMemWrite->memoryCall)
3680                                                 {
3681                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
3682                                                 }
3683                                                 else
3684                                                 {
3685                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
3686                                                 }
3687                                                 psMemWrite = NULL;
3688                                                 break;
3689                                         }
3690                                         ++psMemWrite;
3691                                 }
3692
3693                                 if (psMemWrite)
3694                                 {
3695                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
3696                                 }
3697
3698                         break;
3699                 }
3700                 case 0xef:
3701                 {
3702                         sdwCyclesRemaining -= 8;
3703                                 cpu.z80A |= 0x20;
3704                         break;
3705                 }
3706                 case 0xf0:
3707                 {
3708                         sdwCyclesRemaining -= 8;
3709                                 cpu.z80B |= 0x40;
3710                         break;
3711                 }
3712                 case 0xf1:
3713                 {
3714                         sdwCyclesRemaining -= 8;
3715                                 cpu.z80C |= 0x40;
3716                         break;
3717                 }
3718                 case 0xf2:
3719                 {
3720                         sdwCyclesRemaining -= 8;
3721                                 cpu.z80D |= 0x40;
3722                         break;
3723                 }
3724                 case 0xf3:
3725                 {
3726                         sdwCyclesRemaining -= 8;
3727                                 cpu.z80E |= 0x40;
3728                         break;
3729                 }
3730                 case 0xf4:
3731                 {
3732                         sdwCyclesRemaining -= 8;
3733                                 cpu.z80H |= 0x40;
3734                         break;
3735                 }
3736                 case 0xf5:
3737                 {
3738                         sdwCyclesRemaining -= 8;
3739                                 cpu.z80L |= 0x40;
3740                         break;
3741                 }
3742                 case 0xf6:
3743                 {
3744                         sdwCyclesRemaining -= 15;
3745                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
3746                                 while (psMemRead->lowAddr != 0xffffffff)
3747                                 {
3748                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
3749                                         {
3750                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3751                                                 if (psMemRead->memoryCall)
3752                                                 {
3753                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
3754                                                 }
3755                                                 else
3756                                                 {
3757                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
3758                                                 }
3759                                                 psMemRead = NULL;
3760                                                 break;
3761                                         }
3762                                         ++psMemRead;
3763                                 }
3764
3765                                 if (psMemRead)
3766                                 {
3767                                         bTemp = cpu.z80Base[cpu.z80HL];
3768                                 }
3769
3770                                 bTemp |= 0x40;
3771                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
3772                                 while (psMemWrite->lowAddr != 0xffffffff)
3773                                 {
3774                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
3775                                         {
3776                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3777                                                 if (psMemWrite->memoryCall)
3778                                                 {
3779                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
3780                                                 }
3781                                                 else
3782                                                 {
3783                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
3784                                                 }
3785                                                 psMemWrite = NULL;
3786                                                 break;
3787                                         }
3788                                         ++psMemWrite;
3789                                 }
3790
3791                                 if (psMemWrite)
3792                                 {
3793                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
3794                                 }
3795
3796                         break;
3797                 }
3798                 case 0xf7:
3799                 {
3800                         sdwCyclesRemaining -= 8;
3801                                 cpu.z80A |= 0x40;
3802                         break;
3803                 }
3804                 case 0xf8:
3805                 {
3806                         sdwCyclesRemaining -= 8;
3807                                 cpu.z80B |= 0x80;
3808                         break;
3809                 }
3810                 case 0xf9:
3811                 {
3812                         sdwCyclesRemaining -= 8;
3813                                 cpu.z80C |= 0x80;
3814                         break;
3815                 }
3816                 case 0xfa:
3817                 {
3818                         sdwCyclesRemaining -= 8;
3819                                 cpu.z80D |= 0x80;
3820                         break;
3821                 }
3822                 case 0xfb:
3823                 {
3824                         sdwCyclesRemaining -= 8;
3825                                 cpu.z80E |= 0x80;
3826                         break;
3827                 }
3828                 case 0xfc:
3829                 {
3830                         sdwCyclesRemaining -= 8;
3831                                 cpu.z80H |= 0x80;
3832                         break;
3833                 }
3834                 case 0xfd:
3835                 {
3836                         sdwCyclesRemaining -= 8;
3837                                 cpu.z80L |= 0x80;
3838                         break;
3839                 }
3840                 case 0xfe:
3841                 {
3842                         sdwCyclesRemaining -= 15;
3843                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
3844                                 while (psMemRead->lowAddr != 0xffffffff)
3845                                 {
3846                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
3847                                         {
3848                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3849                                                 if (psMemRead->memoryCall)
3850                                                 {
3851                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
3852                                                 }
3853                                                 else
3854                                                 {
3855                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
3856                                                 }
3857                                                 psMemRead = NULL;
3858                                                 break;
3859                                         }
3860                                         ++psMemRead;
3861                                 }
3862
3863                                 if (psMemRead)
3864                                 {
3865                                         bTemp = cpu.z80Base[cpu.z80HL];
3866                                 }
3867
3868                                 bTemp |= 0x80;
3869                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
3870                                 while (psMemWrite->lowAddr != 0xffffffff)
3871                                 {
3872                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
3873                                         {
3874                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3875                                                 if (psMemWrite->memoryCall)
3876                                                 {
3877                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
3878                                                 }
3879                                                 else
3880                                                 {
3881                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
3882                                                 }
3883                                                 psMemWrite = NULL;
3884                                                 break;
3885                                         }
3886                                         ++psMemWrite;
3887                                 }
3888
3889                                 if (psMemWrite)
3890                                 {
3891                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
3892                                 }
3893
3894                         break;
3895                 }
3896                 case 0xff:
3897                 {
3898                         sdwCyclesRemaining -= 8;
3899                                 cpu.z80A |= 0x80;
3900                         break;
3901                 }
3902         }
3903 }
3904 void EDHandler(void)
3905 {
3906         switch (*pbPC++)
3907         {
3908                 case 0x00:
3909                 {
3910                                 InvalidInstruction(2);
3911                         break;
3912                 }
3913                 case 0x01:
3914                 {
3915                                 InvalidInstruction(2);
3916                         break;
3917                 }
3918                 case 0x02:
3919                 {
3920                                 InvalidInstruction(2);
3921                         break;
3922                 }
3923                 case 0x03:
3924                 {
3925                                 InvalidInstruction(2);
3926                         break;
3927                 }
3928                 case 0x04:
3929                 {
3930                                 InvalidInstruction(2);
3931                         break;
3932                 }
3933                 case 0x05:
3934                 {
3935                                 InvalidInstruction(2);
3936                         break;
3937                 }
3938                 case 0x06:
3939                 {
3940                                 InvalidInstruction(2);
3941                         break;
3942                 }
3943                 case 0x07:
3944                 {
3945                                 InvalidInstruction(2);
3946                         break;
3947                 }
3948                 case 0x08:
3949                 {
3950                                 InvalidInstruction(2);
3951                         break;
3952                 }
3953                 case 0x09:
3954                 {
3955                                 InvalidInstruction(2);
3956                         break;
3957                 }
3958                 case 0x0a:
3959                 {
3960                                 InvalidInstruction(2);
3961                         break;
3962                 }
3963                 case 0x0b:
3964                 {
3965                                 InvalidInstruction(2);
3966                         break;
3967                 }
3968                 case 0x0c:
3969                 {
3970                                 InvalidInstruction(2);
3971                         break;
3972                 }
3973                 case 0x0d:
3974                 {
3975                                 InvalidInstruction(2);
3976                         break;
3977                 }
3978                 case 0x0e:
3979                 {
3980                                 InvalidInstruction(2);
3981                         break;
3982                 }
3983                 case 0x0f:
3984                 {
3985                                 InvalidInstruction(2);
3986                         break;
3987                 }
3988                 case 0x10:
3989                 {
3990                                 InvalidInstruction(2);
3991                         break;
3992                 }
3993                 case 0x11:
3994                 {
3995                                 InvalidInstruction(2);
3996                         break;
3997                 }
3998                 case 0x12:
3999                 {
4000                                 InvalidInstruction(2);
4001                         break;
4002                 }
4003                 case 0x13:
4004                 {
4005                                 InvalidInstruction(2);
4006                         break;
4007                 }
4008                 case 0x14:
4009                 {
4010                                 InvalidInstruction(2);
4011                         break;
4012                 }
4013                 case 0x15:
4014                 {
4015                                 InvalidInstruction(2);
4016                         break;
4017                 }
4018                 case 0x16:
4019                 {
4020                                 InvalidInstruction(2);
4021                         break;
4022                 }
4023                 case 0x17:
4024                 {
4025                                 InvalidInstruction(2);
4026                         break;
4027                 }
4028                 case 0x18:
4029                 {
4030                                 InvalidInstruction(2);
4031                         break;
4032                 }
4033                 case 0x19:
4034                 {
4035                                 InvalidInstruction(2);
4036                         break;
4037                 }
4038                 case 0x1a:
4039                 {
4040                                 InvalidInstruction(2);
4041                         break;
4042                 }
4043                 case 0x1b:
4044                 {
4045                                 InvalidInstruction(2);
4046                         break;
4047                 }
4048                 case 0x1c:
4049                 {
4050                                 InvalidInstruction(2);
4051                         break;
4052                 }
4053                 case 0x1d:
4054                 {
4055                                 InvalidInstruction(2);
4056                         break;
4057                 }
4058                 case 0x1e:
4059                 {
4060                                 InvalidInstruction(2);
4061                         break;
4062                 }
4063                 case 0x1f:
4064                 {
4065                                 InvalidInstruction(2);
4066                         break;
4067                 }
4068                 case 0x20:
4069                 {
4070                                 InvalidInstruction(2);
4071                         break;
4072                 }
4073                 case 0x21:
4074                 {
4075                                 InvalidInstruction(2);
4076                         break;
4077                 }
4078                 case 0x22:
4079                 {
4080                                 InvalidInstruction(2);
4081                         break;
4082                 }
4083                 case 0x23:
4084                 {
4085                                 InvalidInstruction(2);
4086                         break;
4087                 }
4088                 case 0x24:
4089                 {
4090                                 InvalidInstruction(2);
4091                         break;
4092                 }
4093                 case 0x25:
4094                 {
4095                                 InvalidInstruction(2);
4096                         break;
4097                 }
4098                 case 0x26:
4099                 {
4100                                 InvalidInstruction(2);
4101                         break;
4102                 }
4103                 case 0x27:
4104                 {
4105                                 InvalidInstruction(2);
4106                         break;
4107                 }
4108                 case 0x28:
4109                 {
4110                                 InvalidInstruction(2);
4111                         break;
4112                 }
4113                 case 0x29:
4114                 {
4115                                 InvalidInstruction(2);
4116                         break;
4117                 }
4118                 case 0x2a:
4119                 {
4120                                 InvalidInstruction(2);
4121                         break;
4122                 }
4123                 case 0x2b:
4124                 {
4125                                 InvalidInstruction(2);
4126                         break;
4127                 }
4128                 case 0x2c:
4129                 {
4130                                 InvalidInstruction(2);
4131                         break;
4132                 }
4133                 case 0x2d:
4134                 {
4135                                 InvalidInstruction(2);
4136                         break;
4137                 }
4138                 case 0x2e:
4139                 {
4140                                 InvalidInstruction(2);
4141                         break;
4142                 }
4143                 case 0x2f:
4144                 {
4145                                 InvalidInstruction(2);
4146                         break;
4147                 }
4148                 case 0x30:
4149                 {
4150                                 InvalidInstruction(2);
4151                         break;
4152                 }
4153                 case 0x31:
4154                 {
4155                                 InvalidInstruction(2);
4156                         break;
4157                 }
4158                 case 0x32:
4159                 {
4160                                 InvalidInstruction(2);
4161                         break;
4162                 }
4163                 case 0x33:
4164                 {
4165                                 InvalidInstruction(2);
4166                         break;
4167                 }
4168                 case 0x34:
4169                 {
4170                                 InvalidInstruction(2);
4171                         break;
4172                 }
4173                 case 0x35:
4174                 {
4175                                 InvalidInstruction(2);
4176                         break;
4177                 }
4178                 case 0x36:
4179                 {
4180                                 InvalidInstruction(2);
4181                         break;
4182                 }
4183                 case 0x37:
4184                 {
4185                                 InvalidInstruction(2);
4186                         break;
4187                 }
4188                 case 0x38:
4189                 {
4190                                 InvalidInstruction(2);
4191                         break;
4192                 }
4193                 case 0x39:
4194                 {
4195                                 InvalidInstruction(2);
4196                         break;
4197                 }
4198                 case 0x3a:
4199                 {
4200                                 InvalidInstruction(2);
4201                         break;
4202                 }
4203                 case 0x3b:
4204                 {
4205                                 InvalidInstruction(2);
4206                         break;
4207                 }
4208                 case 0x3c:
4209                 {
4210                                 InvalidInstruction(2);
4211                         break;
4212                 }
4213                 case 0x3d:
4214                 {
4215                                 InvalidInstruction(2);
4216                         break;
4217                 }
4218                 case 0x3e:
4219                 {
4220                                 InvalidInstruction(2);
4221                         break;
4222                 }
4223                 case 0x3f:
4224                 {
4225                                 InvalidInstruction(2);
4226                         break;
4227                 }
4228                 case 0x40:
4229                 {
4230                         sdwCyclesRemaining -= 12;
4231                                 dwAddr = cpu.z80C;
4232                                 psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
4233                                 while (psIoRead->lowIoAddr != 0xffff)
4234                                 {
4235                                         if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
4236                                         {
4237                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4238                                                 cpu.z80B = psIoRead->IOCall(dwAddr, psIoRead);
4239                                                 psIoRead = NULL;
4240                                                 break;
4241                                         }
4242                                         ++psIoRead;
4243                                 }
4244
4245                                 if (psIoRead)
4246                                 {
4247                                         cpu.z80B = 0xff; /* Unclaimed I/O read */
4248                                 }
4249
4250                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
4251                                 cpu.z80F |= bPostORFlags[cpu.z80B];
4252                         break;
4253                 }
4254                 case 0x41:
4255                 {
4256                         sdwCyclesRemaining -= 12;
4257                                 dwAddr = cpu.z80C;
4258                                 psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
4259                                 while (psIoWrite->lowIoAddr != 0xffff)
4260                                 {
4261                                         if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
4262                                         {
4263                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4264                                                 psIoWrite->IOCall(dwAddr, cpu.z80B, psIoWrite);
4265                                                 psIoWrite = NULL;
4266                                                 break;
4267                                         }
4268                                         ++psIoWrite;
4269                                 }
4270
4271                         break;
4272                 }
4273                 case 0x42:
4274                 {
4275                         sdwCyclesRemaining -= 15;
4276                                 dwTemp = cpu.z80HL - cpu.z80BC - (cpu.z80F & Z80_FLAG_CARRY);
4277                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
4278                                 cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
4279                                 if (0 == (dwTemp & 0xffff))
4280                                 {
4281                                         cpu.z80F |= Z80_FLAG_ZERO;
4282                                 }
4283                                 cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80BC) >> 8) & Z80_FLAG_HALF_CARRY);
4284                                 cpu.z80F |= ((((cpu.z80BC ^ cpu.z80HL) & (cpu.z80BC ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
4285                                 cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
4286                                 cpu.z80HL = dwTemp & 0xffff;
4287                         break;
4288                 }
4289                 case 0x43:
4290                 {
4291                         sdwCyclesRemaining -= 20;
4292                 dwTemp = *pbPC++;
4293                 dwTemp |= ((UINT32) *pbPC++ << 8);
4294                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
4295                                 while (psMemWrite->lowAddr != 0xffffffff)
4296                                 {
4297                                         if ((dwTemp >= psMemWrite->lowAddr) && (dwTemp <= psMemWrite->highAddr))
4298                                         {
4299                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4300                                                 if (psMemWrite->memoryCall)
4301                                                 {
4302                                                         psMemWrite->memoryCall(dwTemp, (cpu.z80BC & 0xff), psMemWrite);
4303                                                         psMemWrite->memoryCall(dwTemp + 1, (cpu.z80BC >> 8), psMemWrite);
4304                                                 }
4305                                                 else
4306                                                 {
4307                                                         *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr)) = cpu.z80BC;
4308                                                         *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr) + 1) = cpu.z80BC >> 8;
4309                                                 }
4310                                                 psMemWrite = NULL;
4311                                                 break;
4312                                         }
4313                                         ++psMemWrite;
4314                                 }
4315
4316                                 if (psMemWrite)
4317                                 {
4318                                         cpu.z80Base[dwTemp] = (UINT8) cpu.z80BC;
4319                                         cpu.z80Base[dwTemp + 1] = (UINT8) ((UINT32) cpu.z80BC >> 8);
4320                                 }
4321
4322                         break;
4323                 }
4324                 case 0x44:
4325                 {
4326                         sdwCyclesRemaining -= 8;
4327                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
4328                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
4329                                                                 pbSubSbcTable[((UINT32) 0 << 8) | cpu.z80A];
4330                                 cpu.z80A = 0 - cpu.z80A;
4331                         break;
4332                 }
4333                 case 0x45:
4334                 {
4335                         sdwCyclesRemaining -= 14;
4336                                 pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
4337                                 dwAddr = *pbSP++;       /* Pop LSB */
4338                                 dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
4339                                 cpu.z80sp += 2; /* Pop the word off */
4340                                 pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
4341                                 cpu.z80iff &= ~(IFF1);  /* Keep IFF2 around */
4342                                 cpu.z80iff |= ((cpu.z80iff >> 1) & IFF1);       /* IFF2->IFF1 */
4343                         break;
4344                 }
4345                 case 0x46:
4346                 {
4347                         sdwCyclesRemaining -= 8;
4348                                 cpu.z80interruptMode = 0;
4349                         break;
4350                 }
4351                 case 0x47:
4352                 {
4353                         sdwCyclesRemaining -= 9;
4354                                 cpu.z80i = cpu.z80A;
4355                         break;
4356                 }
4357                 case 0x48:
4358                 {
4359                         sdwCyclesRemaining -= 12;
4360                                 dwAddr = cpu.z80C;
4361                                 psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
4362                                 while (psIoRead->lowIoAddr != 0xffff)
4363                                 {
4364                                         if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
4365                                         {
4366                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4367                                                 cpu.z80C = psIoRead->IOCall(dwAddr, psIoRead);
4368                                                 psIoRead = NULL;
4369                                                 break;
4370                                         }
4371                                         ++psIoRead;
4372                                 }
4373
4374                                 if (psIoRead)
4375                                 {
4376                                         cpu.z80C = 0xff; /* Unclaimed I/O read */
4377                                 }
4378
4379                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
4380                                 cpu.z80F |= bPostORFlags[cpu.z80C];
4381                         break;
4382                 }
4383                 case 0x49:
4384                 {
4385                         sdwCyclesRemaining -= 12;
4386                                 dwAddr = cpu.z80C;
4387                                 psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
4388                                 while (psIoWrite->lowIoAddr != 0xffff)
4389                                 {
4390                                         if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
4391                                         {
4392                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4393                                                 psIoWrite->IOCall(dwAddr, cpu.z80C, psIoWrite);
4394                                                 psIoWrite = NULL;
4395                                                 break;
4396                                         }
4397                                         ++psIoWrite;
4398                                 }
4399
4400                         break;
4401                 }
4402                 case 0x4a:
4403                 {
4404                         sdwCyclesRemaining -= 15;
4405                                 dwTemp = cpu.z80HL + cpu.z80BC + (cpu.z80F & Z80_FLAG_CARRY);
4406                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
4407                                 cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
4408                                 if (0 == (dwTemp & 0xffff))
4409                                 {
4410                                         cpu.z80F |= Z80_FLAG_ZERO;
4411                                 }
4412                                 cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80BC) >> 8) & Z80_FLAG_HALF_CARRY);
4413                                 cpu.z80F |= ((((cpu.z80BC ^ cpu.z80HL ^ 0x8000) & (cpu.z80BC ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
4414                                 cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
4415                                 cpu.z80HL = dwTemp & 0xffff;
4416                         break;
4417                 }
4418                 case 0x4b:
4419                 {
4420                         sdwCyclesRemaining -= 20;
4421                 dwTemp = *pbPC++;
4422                 dwTemp |= ((UINT32) *pbPC++ << 8);
4423                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
4424                                 while (psMemRead->lowAddr != 0xffffffff)
4425                                 {
4426                                         if ((dwTemp >= psMemRead->lowAddr) && (dwTemp <= psMemRead->highAddr))
4427                                         {
4428                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4429                                                 if (psMemRead->memoryCall)
4430                                                 {
4431                                                         cpu.z80BC = psMemRead->memoryCall(dwTemp, psMemRead);
4432                                                         cpu.z80BC |= (UINT32) ((UINT32) psMemRead->memoryCall(dwTemp + 1, psMemRead) << 8);
4433                                                 }
4434                                                 else
4435                                                 {
4436                                                         cpu.z80BC = *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr));
4437                                                         cpu.z80BC |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr + 1)) << 8);
4438                                                 }
4439                                                 psMemRead = NULL;
4440                                                 break;
4441                                         }
4442                                         ++psMemRead;
4443                                 }
4444
4445                                 if (psMemRead)
4446                                 {
4447                                         cpu.z80BC = cpu.z80Base[dwTemp];
4448                                         cpu.z80BC |= (UINT32) ((UINT32) cpu.z80Base[dwTemp + 1] << 8);
4449                                 }
4450
4451                         break;
4452                 }
4453                 case 0x4c:
4454                 {
4455                         sdwCyclesRemaining -= 8;
4456                                 InvalidInstruction(2);
4457                         break;
4458                 }
4459                 case 0x4d:
4460                 {
4461                         sdwCyclesRemaining -= 14;
4462                                 pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
4463                                 dwAddr = *pbSP++;       /* Pop LSB */
4464                                 dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
4465                                 cpu.z80sp += 2; /* Pop the word off */
4466                                 pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
4467                         break;
4468                 }
4469                 case 0x4e:
4470                 {
4471                         sdwCyclesRemaining -= 8;
4472                                 InvalidInstruction(2);
4473                         break;
4474                 }
4475                 case 0x4f:
4476                 {
4477                         sdwCyclesRemaining -= 9;
4478                                 cpu.z80r = cpu.z80A;
4479                         break;
4480                 }
4481                 case 0x50:
4482                 {
4483                         sdwCyclesRemaining -= 12;
4484                                 dwAddr = cpu.z80C;
4485                                 psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
4486                                 while (psIoRead->lowIoAddr != 0xffff)
4487                                 {
4488                                         if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
4489                                         {
4490                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4491                                                 cpu.z80D = psIoRead->IOCall(dwAddr, psIoRead);
4492                                                 psIoRead = NULL;
4493                                                 break;
4494                                         }
4495                                         ++psIoRead;
4496                                 }
4497
4498                                 if (psIoRead)
4499                                 {
4500                                         cpu.z80D = 0xff; /* Unclaimed I/O read */
4501                                 }
4502
4503                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
4504                                 cpu.z80F |= bPostORFlags[cpu.z80D];
4505                         break;
4506                 }
4507                 case 0x51:
4508                 {
4509                         sdwCyclesRemaining -= 12;
4510                                 dwAddr = cpu.z80C;
4511                                 psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
4512                                 while (psIoWrite->lowIoAddr != 0xffff)
4513                                 {
4514                                         if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
4515                                         {
4516                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4517                                                 psIoWrite->IOCall(dwAddr, cpu.z80D, psIoWrite);
4518                                                 psIoWrite = NULL;
4519                                                 break;
4520                                         }
4521                                         ++psIoWrite;
4522                                 }
4523
4524                         break;
4525                 }
4526                 case 0x52:
4527                 {
4528                         sdwCyclesRemaining -= 15;
4529                                 dwTemp = cpu.z80HL - cpu.z80DE - (cpu.z80F & Z80_FLAG_CARRY);
4530                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
4531                                 cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
4532                                 if (0 == (dwTemp & 0xffff))
4533                                 {
4534                                         cpu.z80F |= Z80_FLAG_ZERO;
4535                                 }
4536                                 cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80DE) >> 8) & Z80_FLAG_HALF_CARRY);
4537                                 cpu.z80F |= ((((cpu.z80DE ^ cpu.z80HL) & (cpu.z80DE ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
4538                                 cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
4539                                 cpu.z80HL = dwTemp & 0xffff;
4540                         break;
4541                 }
4542                 case 0x53:
4543                 {
4544                         sdwCyclesRemaining -= 20;
4545                 dwTemp = *pbPC++;
4546                 dwTemp |= ((UINT32) *pbPC++ << 8);
4547                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
4548                                 while (psMemWrite->lowAddr != 0xffffffff)
4549                                 {
4550                                         if ((dwTemp >= psMemWrite->lowAddr) && (dwTemp <= psMemWrite->highAddr))
4551                                         {
4552                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4553                                                 if (psMemWrite->memoryCall)
4554                                                 {
4555                                                         psMemWrite->memoryCall(dwTemp, (cpu.z80DE & 0xff), psMemWrite);
4556                                                         psMemWrite->memoryCall(dwTemp + 1, (cpu.z80DE >> 8), psMemWrite);
4557                                                 }
4558                                                 else
4559                                                 {
4560                                                         *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr)) = cpu.z80DE;
4561                                                         *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr) + 1) = cpu.z80DE >> 8;
4562                                                 }
4563                                                 psMemWrite = NULL;
4564                                                 break;
4565                                         }
4566                                         ++psMemWrite;
4567                                 }
4568
4569                                 if (psMemWrite)
4570                                 {
4571                                         cpu.z80Base[dwTemp] = (UINT8) cpu.z80DE;
4572                                         cpu.z80Base[dwTemp + 1] = (UINT8) ((UINT32) cpu.z80DE >> 8);
4573                                 }
4574
4575                         break;
4576                 }
4577                 case 0x54:
4578                 {
4579                         sdwCyclesRemaining -= 8;
4580                                 InvalidInstruction(2);
4581                         break;
4582                 }
4583                 case 0x55:
4584                 {
4585                         sdwCyclesRemaining -= 8;
4586                                 InvalidInstruction(2);
4587                         break;
4588                 }
4589                 case 0x56:
4590                 {
4591                         sdwCyclesRemaining -= 8;
4592                                 cpu.z80interruptMode = 1;
4593                                 cpu.z80intAddr = 0x38;
4594                         break;
4595                 }
4596                 case 0x57:
4597                 {
4598                         sdwCyclesRemaining -= 9;
4599                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
4600                                 cpu.z80F |= ((cpu.z80iff & IFF2) << 1);
4601                                 cpu.z80A = cpu.z80i;
4602                                 cpu.z80F |= bPostORFlags[cpu.z80A];
4603                         break;
4604                 }
4605                 case 0x58:
4606                 {
4607                         sdwCyclesRemaining -= 12;
4608                                 dwAddr = cpu.z80C;
4609                                 psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
4610                                 while (psIoRead->lowIoAddr != 0xffff)
4611                                 {
4612                                         if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
4613                                         {
4614                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4615                                                 cpu.z80E = psIoRead->IOCall(dwAddr, psIoRead);
4616                                                 psIoRead = NULL;
4617                                                 break;
4618                                         }
4619                                         ++psIoRead;
4620                                 }
4621
4622                                 if (psIoRead)
4623                                 {
4624                                         cpu.z80E = 0xff; /* Unclaimed I/O read */
4625                                 }
4626
4627                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
4628                                 cpu.z80F |= bPostORFlags[cpu.z80E];
4629                         break;
4630                 }
4631                 case 0x59:
4632                 {
4633                         sdwCyclesRemaining -= 12;
4634                                 dwAddr = cpu.z80C;
4635                                 psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
4636                                 while (psIoWrite->lowIoAddr != 0xffff)
4637                                 {
4638                                         if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
4639                                         {
4640                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4641                                                 psIoWrite->IOCall(dwAddr, cpu.z80E, psIoWrite);
4642                                                 psIoWrite = NULL;
4643                                                 break;
4644                                         }
4645                                         ++psIoWrite;
4646                                 }
4647
4648                         break;
4649                 }
4650                 case 0x5a:
4651                 {
4652                         sdwCyclesRemaining -= 15;
4653                                 dwTemp = cpu.z80HL + cpu.z80DE + (cpu.z80F & Z80_FLAG_CARRY);
4654                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
4655                                 cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
4656                                 if (0 == (dwTemp & 0xffff))
4657                                 {
4658                                         cpu.z80F |= Z80_FLAG_ZERO;
4659                                 }
4660                                 cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80DE) >> 8) & Z80_FLAG_HALF_CARRY);
4661                                 cpu.z80F |= ((((cpu.z80DE ^ cpu.z80HL ^ 0x8000) & (cpu.z80DE ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
4662                                 cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
4663                                 cpu.z80HL = dwTemp & 0xffff;
4664                         break;
4665                 }
4666                 case 0x5b:
4667                 {
4668                         sdwCyclesRemaining -= 20;
4669                 dwTemp = *pbPC++;
4670                 dwTemp |= ((UINT32) *pbPC++ << 8);
4671                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
4672                                 while (psMemRead->lowAddr != 0xffffffff)
4673                                 {
4674                                         if ((dwTemp >= psMemRead->lowAddr) && (dwTemp <= psMemRead->highAddr))
4675                                         {
4676                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4677                                                 if (psMemRead->memoryCall)
4678                                                 {
4679                                                         cpu.z80DE = psMemRead->memoryCall(dwTemp, psMemRead);
4680                                                         cpu.z80DE |= (UINT32) ((UINT32) psMemRead->memoryCall(dwTemp + 1, psMemRead) << 8);
4681                                                 }
4682                                                 else
4683                                                 {
4684                                                         cpu.z80DE = *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr));
4685                                                         cpu.z80DE |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr + 1)) << 8);
4686                                                 }
4687                                                 psMemRead = NULL;
4688                                                 break;
4689                                         }
4690                                         ++psMemRead;
4691                                 }
4692
4693                                 if (psMemRead)
4694                                 {
4695                                         cpu.z80DE = cpu.z80Base[dwTemp];
4696                                         cpu.z80DE |= (UINT32) ((UINT32) cpu.z80Base[dwTemp + 1] << 8);
4697                                 }
4698
4699                         break;
4700                 }
4701                 case 0x5c:
4702                 {
4703                         sdwCyclesRemaining -= 8;
4704                                 InvalidInstruction(2);
4705                         break;
4706                 }
4707                 case 0x5d:
4708                 {
4709                         sdwCyclesRemaining -= 8;
4710                                 InvalidInstruction(2);
4711                         break;
4712                 }
4713                 case 0x5e:
4714                 {
4715                         sdwCyclesRemaining -= 8;
4716                                 cpu.z80interruptMode = 2;
4717                         break;
4718                 }
4719                 case 0x5f:
4720                 {
4721                         sdwCyclesRemaining -= 9;
4722                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
4723                                 cpu.z80F |= bPostORFlags[cpu.z80r];
4724                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_OVERFLOW_PARITY)) | ((cpu.z80iff & IFF2) << 1);
4725                                 cpu.z80A = cpu.z80r;
4726                                 bTemp = (cpu.z80r + (cpu.z80B + sdwCyclesRemaining + 1 + cpu.z80H)) ^ cpu.z80A;
4727                                 cpu.z80r = (cpu.z80r & 0x80) | (bTemp & 0x7f);
4728                         break;
4729                 }
4730                 case 0x60:
4731                 {
4732                         sdwCyclesRemaining -= 12;
4733                                 dwAddr = cpu.z80C;
4734                                 psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
4735                                 while (psIoRead->lowIoAddr != 0xffff)
4736                                 {
4737                                         if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
4738                                         {
4739                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4740                                                 cpu.z80H = psIoRead->IOCall(dwAddr, psIoRead);
4741                                                 psIoRead = NULL;
4742                                                 break;
4743                                         }
4744                                         ++psIoRead;
4745                                 }
4746
4747                                 if (psIoRead)
4748                                 {
4749                                         cpu.z80H = 0xff; /* Unclaimed I/O read */
4750                                 }
4751
4752                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
4753                                 cpu.z80F |= bPostORFlags[cpu.z80H];
4754                         break;
4755                 }
4756                 case 0x61:
4757                 {
4758                         sdwCyclesRemaining -= 12;
4759                                 dwAddr = cpu.z80C;
4760                                 psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
4761                                 while (psIoWrite->lowIoAddr != 0xffff)
4762                                 {
4763                                         if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
4764                                         {
4765                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4766                                                 psIoWrite->IOCall(dwAddr, cpu.z80H, psIoWrite);
4767                                                 psIoWrite = NULL;
4768                                                 break;
4769                                         }
4770                                         ++psIoWrite;
4771                                 }
4772
4773                         break;
4774                 }
4775                 case 0x62:
4776                 {
4777                         sdwCyclesRemaining -= 15;
4778                                 dwTemp = cpu.z80HL - cpu.z80HL - (cpu.z80F & Z80_FLAG_CARRY);
4779                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
4780                                 cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
4781                                 if (0 == (dwTemp & 0xffff))
4782                                 {
4783                                         cpu.z80F |= Z80_FLAG_ZERO;
4784                                 }
4785                                 cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80HL) >> 8) & Z80_FLAG_HALF_CARRY);
4786                                 cpu.z80F |= ((((cpu.z80HL ^ cpu.z80HL) & (cpu.z80HL ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
4787                                 cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
4788                                 cpu.z80HL = dwTemp & 0xffff;
4789                         break;
4790                 }
4791                 case 0x63:
4792                 {
4793                         sdwCyclesRemaining -= 20;
4794                 dwTemp = *pbPC++;
4795                 dwTemp |= ((UINT32) *pbPC++ << 8);
4796                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
4797                                 while (psMemWrite->lowAddr != 0xffffffff)
4798                                 {
4799                                         if ((dwTemp >= psMemWrite->lowAddr) && (dwTemp <= psMemWrite->highAddr))
4800                                         {
4801                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4802                                                 if (psMemWrite->memoryCall)
4803                                                 {
4804                                                         psMemWrite->memoryCall(dwTemp, (cpu.z80HL & 0xff), psMemWrite);
4805                                                         psMemWrite->memoryCall(dwTemp + 1, (cpu.z80HL >> 8), psMemWrite);
4806                                                 }
4807                                                 else
4808                                                 {
4809                                                         *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr)) = cpu.z80HL;
4810                                                         *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr) + 1) = cpu.z80HL >> 8;
4811                                                 }
4812                                                 psMemWrite = NULL;
4813                                                 break;
4814                                         }
4815                                         ++psMemWrite;
4816                                 }
4817
4818                                 if (psMemWrite)
4819                                 {
4820                                         cpu.z80Base[dwTemp] = (UINT8) cpu.z80HL;
4821                                         cpu.z80Base[dwTemp + 1] = (UINT8) ((UINT32) cpu.z80HL >> 8);
4822                                 }
4823
4824                         break;
4825                 }
4826                 case 0x64:
4827                 {
4828                         sdwCyclesRemaining -= 8;
4829                                 InvalidInstruction(2);
4830                         break;
4831                 }
4832                 case 0x65:
4833                 {
4834                         sdwCyclesRemaining -= 8;
4835                                 InvalidInstruction(2);
4836                         break;
4837                 }
4838                 case 0x66:
4839                 {
4840                         sdwCyclesRemaining -= 8;
4841                                 InvalidInstruction(2);
4842                         break;
4843                 }
4844                 case 0x67:
4845                 {
4846                         sdwCyclesRemaining -= 18;
4847                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
4848                                 while (psMemRead->lowAddr != 0xffffffff)
4849                                 {
4850                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
4851                                         {
4852                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4853                                                 if (psMemRead->memoryCall)
4854                                                 {
4855                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
4856                                                 }
4857                                                 else
4858                                                 {
4859                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
4860                                                 }
4861                                                 psMemRead = NULL;
4862                                                 break;
4863                                         }
4864                                         ++psMemRead;
4865                                 }
4866
4867                                 if (psMemRead)
4868                                 {
4869                                         bTemp = cpu.z80Base[cpu.z80HL];
4870                                 }
4871
4872                                 bTemp2 = (cpu.z80A & 0x0f) << 4;
4873                                 cpu.z80A = (cpu.z80A & 0xf0) | (bTemp & 0x0f);
4874                                 bTemp = (bTemp >> 4) | bTemp2;
4875                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
4876                                 while (psMemWrite->lowAddr != 0xffffffff)
4877                                 {
4878                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
4879                                         {
4880                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4881                                                 if (psMemWrite->memoryCall)
4882                                                 {
4883                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
4884                                                 }
4885                                                 else
4886                                                 {
4887                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
4888                                                 }
4889                                                 psMemWrite = NULL;
4890                                                 break;
4891                                         }
4892                                         ++psMemWrite;
4893                                 }
4894
4895                                 if (psMemWrite)
4896                                 {
4897                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
4898                                 }
4899
4900                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
4901                                 cpu.z80F |= bPostORFlags[cpu.z80A];
4902                         break;
4903                 }
4904                 case 0x68:
4905                 {
4906                         sdwCyclesRemaining -= 12;
4907                                 dwAddr = cpu.z80C;
4908                                 psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
4909                                 while (psIoRead->lowIoAddr != 0xffff)
4910                                 {
4911                                         if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
4912                                         {
4913                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4914                                                 cpu.z80L = psIoRead->IOCall(dwAddr, psIoRead);
4915                                                 psIoRead = NULL;
4916                                                 break;
4917                                         }
4918                                         ++psIoRead;
4919                                 }
4920
4921                                 if (psIoRead)
4922                                 {
4923                                         cpu.z80L = 0xff; /* Unclaimed I/O read */
4924                                 }
4925
4926                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
4927                                 cpu.z80F |= bPostORFlags[cpu.z80L];
4928                         break;
4929                 }
4930                 case 0x69:
4931                 {
4932                         sdwCyclesRemaining -= 12;
4933                                 dwAddr = cpu.z80C;
4934                                 psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
4935                                 while (psIoWrite->lowIoAddr != 0xffff)
4936                                 {
4937                                         if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
4938                                         {
4939                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4940                                                 psIoWrite->IOCall(dwAddr, cpu.z80L, psIoWrite);
4941                                                 psIoWrite = NULL;
4942                                                 break;
4943                                         }
4944                                         ++psIoWrite;
4945                                 }
4946
4947                         break;
4948                 }
4949                 case 0x6a:
4950                 {
4951                         sdwCyclesRemaining -= 15;
4952                                 dwTemp = cpu.z80HL + cpu.z80HL + (cpu.z80F & Z80_FLAG_CARRY);
4953                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
4954                                 cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
4955                                 if (0 == (dwTemp & 0xffff))
4956                                 {
4957                                         cpu.z80F |= Z80_FLAG_ZERO;
4958                                 }
4959                                 cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80HL) >> 8) & Z80_FLAG_HALF_CARRY);
4960                                 cpu.z80F |= ((((cpu.z80HL ^ cpu.z80HL ^ 0x8000) & (cpu.z80HL ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
4961                                 cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
4962                                 cpu.z80HL = dwTemp & 0xffff;
4963                         break;
4964                 }
4965                 case 0x6b:
4966                 {
4967                         sdwCyclesRemaining -= 20;
4968                                 InvalidInstruction(2);
4969                         break;
4970                 }
4971                 case 0x6c:
4972                 {
4973                         sdwCyclesRemaining -= 8;
4974                                 InvalidInstruction(2);
4975                         break;
4976                 }
4977                 case 0x6d:
4978                 {
4979                         sdwCyclesRemaining -= 8;
4980                                 InvalidInstruction(2);
4981                         break;
4982                 }
4983                 case 0x6e:
4984                 {
4985                         sdwCyclesRemaining -= 8;
4986                                 InvalidInstruction(2);
4987                         break;
4988                 }
4989                 case 0x6f:
4990                 {
4991                         sdwCyclesRemaining -= 18;
4992                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
4993                                 while (psMemRead->lowAddr != 0xffffffff)
4994                                 {
4995                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
4996                                         {
4997                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4998                                                 if (psMemRead->memoryCall)
4999                                                 {
5000                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
5001                                                 }
5002                                                 else
5003                                                 {
5004                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
5005                                                 }
5006                                                 psMemRead = NULL;
5007                                                 break;
5008                                         }
5009                                         ++psMemRead;
5010                                 }
5011
5012                                 if (psMemRead)
5013                                 {
5014                                         bTemp = cpu.z80Base[cpu.z80HL];
5015                                 }
5016
5017                                 bTemp2 = (cpu.z80A & 0x0f);
5018                                 cpu.z80A = (cpu.z80A & 0xf0) | (bTemp >> 4);
5019                                 bTemp = (bTemp << 4) | bTemp2;
5020                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
5021                                 while (psMemWrite->lowAddr != 0xffffffff)
5022                                 {
5023                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
5024                                         {
5025                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5026                                                 if (psMemWrite->memoryCall)
5027                                                 {
5028                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
5029                                                 }
5030                                                 else
5031                                                 {
5032                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
5033                                                 }
5034                                                 psMemWrite = NULL;
5035                                                 break;
5036                                         }
5037                                         ++psMemWrite;
5038                                 }
5039
5040                                 if (psMemWrite)
5041                                 {
5042                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
5043                                 }
5044
5045                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
5046                                 cpu.z80F |= bPostORFlags[cpu.z80A];
5047                         break;
5048                 }
5049                 case 0x70:
5050                 {
5051                         sdwCyclesRemaining -= 12;
5052                                 InvalidInstruction(2);
5053                         break;
5054                 }
5055                 case 0x71:
5056                 {
5057                         sdwCyclesRemaining -= 12;
5058                                 InvalidInstruction(2);
5059                         break;
5060                 }
5061                 case 0x72:
5062                 {
5063                         sdwCyclesRemaining -= 15;
5064                                 dwTemp = cpu.z80HL - cpu.z80sp - (cpu.z80F & Z80_FLAG_CARRY);
5065                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
5066                                 cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
5067                                 if (0 == (dwTemp & 0xffff))
5068                                 {
5069                                         cpu.z80F |= Z80_FLAG_ZERO;
5070                                 }
5071                                 cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80sp) >> 8) & Z80_FLAG_HALF_CARRY);
5072                                 cpu.z80F |= ((((cpu.z80sp ^ cpu.z80HL) & (cpu.z80sp ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
5073                                 cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
5074                                 cpu.z80HL = dwTemp & 0xffff;
5075                         break;
5076                 }
5077                 case 0x73:
5078                 {
5079                         sdwCyclesRemaining -= 20;
5080                 dwTemp = *pbPC++;
5081                 dwTemp |= ((UINT32) *pbPC++ << 8);
5082                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
5083                                 while (psMemWrite->lowAddr != 0xffffffff)
5084                                 {
5085                                         if ((dwTemp >= psMemWrite->lowAddr) && (dwTemp <= psMemWrite->highAddr))
5086                                         {
5087                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5088                                                 if (psMemWrite->memoryCall)
5089                                                 {
5090                                                         psMemWrite->memoryCall(dwTemp, (cpu.z80sp & 0xff), psMemWrite);
5091                                                         psMemWrite->memoryCall(dwTemp + 1, (cpu.z80sp >> 8), psMemWrite);
5092                                                 }
5093                                                 else
5094                                                 {
5095                                                         *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr)) = cpu.z80sp;
5096                                                         *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr) + 1) = cpu.z80sp >> 8;
5097                                                 }
5098                                                 psMemWrite = NULL;
5099                                                 break;
5100                                         }
5101                                         ++psMemWrite;
5102                                 }
5103
5104                                 if (psMemWrite)
5105                                 {
5106                                         cpu.z80Base[dwTemp] = (UINT8) cpu.z80sp;
5107                                         cpu.z80Base[dwTemp + 1] = (UINT8) ((UINT32) cpu.z80sp >> 8);
5108                                 }
5109
5110                         break;
5111                 }
5112                 case 0x74:
5113                 {
5114                         sdwCyclesRemaining -= 8;
5115                                 InvalidInstruction(2);
5116                         break;
5117                 }
5118                 case 0x75:
5119                 {
5120                         sdwCyclesRemaining -= 8;
5121                                 InvalidInstruction(2);
5122                         break;
5123                 }
5124                 case 0x76:
5125                 {
5126                         sdwCyclesRemaining -= 8;
5127                                 InvalidInstruction(2);
5128                         break;
5129                 }
5130                 case 0x77:
5131                 {
5132                                 InvalidInstruction(2);
5133                         break;
5134                 }
5135                 case 0x78:
5136                 {
5137                         sdwCyclesRemaining -= 12;
5138                                 dwAddr = cpu.z80C;
5139                                 psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
5140                                 while (psIoRead->lowIoAddr != 0xffff)
5141                                 {
5142                                         if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
5143                                         {
5144                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5145                                                 cpu.z80A = psIoRead->IOCall(dwAddr, psIoRead);
5146                                                 psIoRead = NULL;
5147                                                 break;
5148                                         }
5149                                         ++psIoRead;
5150                                 }
5151
5152                                 if (psIoRead)
5153                                 {
5154                                         cpu.z80A = 0xff; /* Unclaimed I/O read */
5155                                 }
5156
5157                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
5158                                 cpu.z80F |= bPostORFlags[cpu.z80A];
5159                         break;
5160                 }
5161                 case 0x79:
5162                 {
5163                         sdwCyclesRemaining -= 12;
5164                                 dwAddr = cpu.z80C;
5165                                 psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
5166                                 while (psIoWrite->lowIoAddr != 0xffff)
5167                                 {
5168                                         if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
5169                                         {
5170                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5171                                                 psIoWrite->IOCall(dwAddr, cpu.z80A, psIoWrite);
5172                                                 psIoWrite = NULL;
5173                                                 break;
5174                                         }
5175                                         ++psIoWrite;
5176                                 }
5177
5178                         break;
5179                 }
5180                 case 0x7a:
5181                 {
5182                         sdwCyclesRemaining -= 15;
5183                                 dwTemp = cpu.z80HL + cpu.z80sp + (cpu.z80F & Z80_FLAG_CARRY);
5184                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
5185                                 cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
5186                                 if (0 == (dwTemp & 0xffff))
5187                                 {
5188                                         cpu.z80F |= Z80_FLAG_ZERO;
5189                                 }
5190                                 cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80sp) >> 8) & Z80_FLAG_HALF_CARRY);
5191                                 cpu.z80F |= ((((cpu.z80sp ^ cpu.z80HL ^ 0x8000) & (cpu.z80sp ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
5192                                 cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
5193                                 cpu.z80HL = dwTemp & 0xffff;
5194                         break;
5195                 }
5196                 case 0x7b:
5197                 {
5198                         sdwCyclesRemaining -= 20;
5199                 dwTemp = *pbPC++;
5200                 dwTemp |= ((UINT32) *pbPC++ << 8);
5201                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
5202                                 while (psMemRead->lowAddr != 0xffffffff)
5203                                 {
5204                                         if ((dwTemp >= psMemRead->lowAddr) && (dwTemp <= psMemRead->highAddr))
5205                                         {
5206                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5207                                                 if (psMemRead->memoryCall)
5208                                                 {
5209                                                         cpu.z80sp = psMemRead->memoryCall(dwTemp, psMemRead);
5210                                                         cpu.z80sp |= (UINT32) ((UINT32) psMemRead->memoryCall(dwTemp + 1, psMemRead) << 8);
5211                                                 }
5212                                                 else
5213                                                 {
5214                                                         cpu.z80sp = *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr));
5215                                                         cpu.z80sp |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr + 1)) << 8);
5216                                                 }
5217                                                 psMemRead = NULL;
5218                                                 break;
5219                                         }
5220                                         ++psMemRead;
5221                                 }
5222
5223                                 if (psMemRead)
5224                                 {
5225                                         cpu.z80sp = cpu.z80Base[dwTemp];
5226                                         cpu.z80sp |= (UINT32) ((UINT32) cpu.z80Base[dwTemp + 1] << 8);
5227                                 }
5228
5229                         break;
5230                 }
5231                 case 0x7c:
5232                 {
5233                         sdwCyclesRemaining -= 8;
5234                                 InvalidInstruction(2);
5235                         break;
5236                 }
5237                 case 0x7d:
5238                 {
5239                         sdwCyclesRemaining -= 8;
5240                                 InvalidInstruction(2);
5241                         break;
5242                 }
5243                 case 0x7e:
5244                 {
5245                         sdwCyclesRemaining -= 8;
5246                                 InvalidInstruction(2);
5247                         break;
5248                 }
5249                 case 0x7f:
5250                 {
5251                                 InvalidInstruction(2);
5252                         break;
5253                 }
5254                 case 0x80:
5255                 {
5256                                 InvalidInstruction(2);
5257                         break;
5258                 }
5259                 case 0x81:
5260                 {
5261                                 InvalidInstruction(2);
5262                         break;
5263                 }
5264                 case 0x82:
5265                 {
5266                                 InvalidInstruction(2);
5267                         break;
5268                 }
5269                 case 0x83:
5270                 {
5271                                 InvalidInstruction(2);
5272                         break;
5273                 }
5274                 case 0x84:
5275                 {
5276                                 InvalidInstruction(2);
5277                         break;
5278                 }
5279                 case 0x85:
5280                 {
5281                                 InvalidInstruction(2);
5282                         break;
5283                 }
5284                 case 0x86:
5285                 {
5286                                 InvalidInstruction(2);
5287                         break;
5288                 }
5289                 case 0x87:
5290                 {
5291                                 InvalidInstruction(2);
5292                         break;
5293                 }
5294                 case 0x88:
5295                 {
5296                                 InvalidInstruction(2);
5297                         break;
5298                 }
5299                 case 0x89:
5300                 {
5301                                 InvalidInstruction(2);
5302                         break;
5303                 }
5304                 case 0x8a:
5305                 {
5306                                 InvalidInstruction(2);
5307                         break;
5308                 }
5309                 case 0x8b:
5310                 {
5311                                 InvalidInstruction(2);
5312                         break;
5313                 }
5314                 case 0x8c:
5315                 {
5316                                 InvalidInstruction(2);
5317                         break;
5318                 }
5319                 case 0x8d:
5320                 {
5321                                 InvalidInstruction(2);
5322                         break;
5323                 }
5324                 case 0x8e:
5325                 {
5326                                 InvalidInstruction(2);
5327                         break;
5328                 }
5329                 case 0x8f:
5330                 {
5331                                 InvalidInstruction(2);
5332                         break;
5333                 }
5334                 case 0x90:
5335                 {
5336                                 InvalidInstruction(2);
5337                         break;
5338                 }
5339                 case 0x91:
5340                 {
5341                                 InvalidInstruction(2);
5342                         break;
5343                 }
5344                 case 0x92:
5345                 {
5346                                 InvalidInstruction(2);
5347                         break;
5348                 }
5349                 case 0x93:
5350                 {
5351                                 InvalidInstruction(2);
5352                         break;
5353                 }
5354                 case 0x94:
5355                 {
5356                                 InvalidInstruction(2);
5357                         break;
5358                 }
5359                 case 0x95:
5360                 {
5361                                 InvalidInstruction(2);
5362                         break;
5363                 }
5364                 case 0x96:
5365                 {
5366                                 InvalidInstruction(2);
5367                         break;
5368                 }
5369                 case 0x97:
5370                 {
5371                                 InvalidInstruction(2);
5372                         break;
5373                 }
5374                 case 0x98:
5375                 {
5376                                 InvalidInstruction(2);
5377                         break;
5378                 }
5379                 case 0x99:
5380                 {
5381                                 InvalidInstruction(2);
5382                         break;
5383                 }
5384                 case 0x9a:
5385                 {
5386                                 InvalidInstruction(2);
5387                         break;
5388                 }
5389                 case 0x9b:
5390                 {
5391                                 InvalidInstruction(2);
5392                         break;
5393                 }
5394                 case 0x9c:
5395                 {
5396                                 InvalidInstruction(2);
5397                         break;
5398                 }
5399                 case 0x9d:
5400                 {
5401                                 InvalidInstruction(2);
5402                         break;
5403                 }
5404                 case 0x9e:
5405                 {
5406                                 InvalidInstruction(2);
5407                         break;
5408                 }
5409                 case 0x9f:
5410                 {
5411                                 InvalidInstruction(2);
5412                         break;
5413                 }
5414                 case 0xa0:
5415                 {
5416                         sdwCyclesRemaining -= 16;
5417                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
5418                                 while (psMemRead->lowAddr != 0xffffffff)
5419                                 {
5420                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
5421                                         {
5422                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5423                                                 if (psMemRead->memoryCall)
5424                                                 {
5425                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
5426                                                 }
5427                                                 else
5428                                                 {
5429                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
5430                                                 }
5431                                                 psMemRead = NULL;
5432                                                 break;
5433                                         }
5434                                         ++psMemRead;
5435                                 }
5436
5437                                 if (psMemRead)
5438                                 {
5439                                         bTemp = cpu.z80Base[cpu.z80HL];
5440                                 }
5441
5442                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
5443                                 while (psMemWrite->lowAddr != 0xffffffff)
5444                                 {
5445                                         if ((cpu.z80DE >= psMemWrite->lowAddr) && (cpu.z80DE <= psMemWrite->highAddr))
5446                                         {
5447                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5448                                                 if (psMemWrite->memoryCall)
5449                                                 {
5450                                                         psMemWrite->memoryCall(cpu.z80DE, bTemp, psMemWrite);
5451                                                 }
5452                                                 else
5453                                                 {
5454                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80DE - psMemWrite->lowAddr)) = bTemp;
5455                                                 }
5456                                                 psMemWrite = NULL;
5457                                                 break;
5458                                         }
5459                                         ++psMemWrite;
5460                                 }
5461
5462                                 if (psMemWrite)
5463                                 {
5464                                         cpu.z80Base[cpu.z80DE] = (UINT8) bTemp;
5465                                 }
5466
5467                                         ++cpu.z80HL;
5468                                         ++cpu.z80DE;
5469                                 --cpu.z80BC;
5470                                 cpu.z80HL &= 0xffff;
5471                                 cpu.z80DE &= 0xffff;
5472                                 cpu.z80BC &= 0xffff;
5473                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY);
5474                                 if (cpu.z80BC)
5475                                 {
5476                                         cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
5477                                 }
5478                         break;
5479                 }
5480                 case 0xa1:
5481                 {
5482                         sdwCyclesRemaining -= 16;
5483                                 {
5484                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
5485                                 while (psMemRead->lowAddr != 0xffffffff)
5486                                 {
5487                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
5488                                         {
5489                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5490                                                 if (psMemRead->memoryCall)
5491                                                 {
5492                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
5493                                                 }
5494                                                 else
5495                                                 {
5496                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
5497                                                 }
5498                                                 psMemRead = NULL;
5499                                                 break;
5500                                         }
5501                                         ++psMemRead;
5502                                 }
5503
5504                                 if (psMemRead)
5505                                 {
5506                                         bTemp = cpu.z80Base[cpu.z80HL];
5507                                 }
5508
5509                                 cpu.z80HL++;
5510                                 cpu.z80HL &= 0xffff;
5511                                 cpu.z80BC--;
5512                                 cpu.z80BC &= 0xffff;
5513                                 }
5514                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
5515                                 cpu.z80F |= (pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO));
5516                                 if (cpu.z80BC)
5517                                 {
5518                                         cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
5519                                 }
5520                         break;
5521                 }
5522                 case 0xa2:
5523                 {
5524                         sdwCyclesRemaining -= 16;
5525                                 {
5526                                 psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
5527                                 while (psIoRead->lowIoAddr != 0xffff)
5528                                 {
5529                                         if ((cpu.z80B >= psIoRead->lowIoAddr) && (cpu.z80B <= psIoRead->highIoAddr))
5530                                         {
5531                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5532                                                 bTemp = psIoRead->IOCall(cpu.z80B, psIoRead);
5533                                                 psIoRead = NULL;
5534                                                 break;
5535                                         }
5536                                         ++psIoRead;
5537                                 }
5538
5539                                 if (psIoRead)
5540                                 {
5541                                         bTemp = 0xff; /* Unclaimed I/O read */
5542                                 }
5543
5544                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
5545                                 while (psMemWrite->lowAddr != 0xffffffff)
5546                                 {
5547                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
5548                                         {
5549                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5550                                                 if (psMemWrite->memoryCall)
5551                                                 {
5552                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
5553                                                 }
5554                                                 else
5555                                                 {
5556                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
5557                                                 }
5558                                                 psMemWrite = NULL;
5559                                                 break;
5560                                         }
5561                                         ++psMemWrite;
5562                                 }
5563
5564                                 if (psMemWrite)
5565                                 {
5566                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
5567                                 }
5568
5569                                 cpu.z80HL++;
5570                                 cpu.z80HL &= 0xffff;
5571                                 sdwCyclesRemaining -= 16;
5572                                 cpu.z80B--;
5573                                 }
5574                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
5575                                 cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
5576                                 if (cpu.z80B)
5577                                 {
5578                                         cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
5579                                         pbPC -= 2;
5580                                 }
5581                         break;
5582                 }
5583                 case 0xa3:
5584                 {
5585                         sdwCyclesRemaining -= 16;
5586                                 {
5587                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
5588                                 while (psMemRead->lowAddr != 0xffffffff)
5589                                 {
5590                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
5591                                         {
5592                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5593                                                 if (psMemRead->memoryCall)
5594                                                 {
5595                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
5596                                                 }
5597                                                 else
5598                                                 {
5599                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
5600                                                 }
5601                                                 psMemRead = NULL;
5602                                                 break;
5603                                         }
5604                                         ++psMemRead;
5605                                 }
5606
5607                                 if (psMemRead)
5608                                 {
5609                                         bTemp = cpu.z80Base[cpu.z80HL];
5610                                 }
5611
5612                                 psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
5613                                 while (psIoWrite->lowIoAddr != 0xffff)
5614                                 {
5615                                         if ((cpu.z80BC >= psIoWrite->lowIoAddr) && (cpu.z80BC <= psIoWrite->highIoAddr))
5616                                         {
5617                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5618                                                 psIoWrite->IOCall(cpu.z80BC, bTemp, psIoWrite);
5619                                                 psIoWrite = NULL;
5620                                                 break;
5621                                         }
5622                                         ++psIoWrite;
5623                                 }
5624
5625                                 cpu.z80HL++;
5626                                 cpu.z80HL &= 0xffff;
5627                                 sdwCyclesRemaining -= 16;
5628                                 cpu.z80B--;
5629                                 }
5630                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
5631                                 cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
5632                                 if (cpu.z80B)
5633                                 {
5634                                         cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
5635                                 }
5636                         break;
5637                 }
5638                 case 0xa4:
5639                 {
5640                                 InvalidInstruction(2);
5641                         break;
5642                 }
5643                 case 0xa5:
5644                 {
5645                                 InvalidInstruction(2);
5646                         break;
5647                 }
5648                 case 0xa6:
5649                 {
5650                                 InvalidInstruction(2);
5651                         break;
5652                 }
5653                 case 0xa7:
5654                 {
5655                                 InvalidInstruction(2);
5656                         break;
5657                 }
5658                 case 0xa8:
5659                 {
5660                         sdwCyclesRemaining -= 16;
5661                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
5662                                 while (psMemRead->lowAddr != 0xffffffff)
5663                                 {
5664                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
5665                                         {
5666                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5667                                                 if (psMemRead->memoryCall)
5668                                                 {
5669                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
5670                                                 }
5671                                                 else
5672                                                 {
5673                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
5674                                                 }
5675                                                 psMemRead = NULL;
5676                                                 break;
5677                                         }
5678                                         ++psMemRead;
5679                                 }
5680
5681                                 if (psMemRead)
5682                                 {
5683                                         bTemp = cpu.z80Base[cpu.z80HL];
5684                                 }
5685
5686                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
5687                                 while (psMemWrite->lowAddr != 0xffffffff)
5688                                 {
5689                                         if ((cpu.z80DE >= psMemWrite->lowAddr) && (cpu.z80DE <= psMemWrite->highAddr))
5690                                         {
5691                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5692                                                 if (psMemWrite->memoryCall)
5693                                                 {
5694                                                         psMemWrite->memoryCall(cpu.z80DE, bTemp, psMemWrite);
5695                                                 }
5696                                                 else
5697                                                 {
5698                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80DE - psMemWrite->lowAddr)) = bTemp;
5699                                                 }
5700                                                 psMemWrite = NULL;
5701                                                 break;
5702                                         }
5703                                         ++psMemWrite;
5704                                 }
5705
5706                                 if (psMemWrite)
5707                                 {
5708                                         cpu.z80Base[cpu.z80DE] = (UINT8) bTemp;
5709                                 }
5710
5711                                         --cpu.z80HL;
5712                                         --cpu.z80DE;
5713                                 --cpu.z80BC;
5714                                 cpu.z80HL &= 0xffff;
5715                                 cpu.z80DE &= 0xffff;
5716                                 cpu.z80BC &= 0xffff;
5717                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY);
5718                                 if (cpu.z80BC)
5719                                 {
5720                                         cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
5721                                 }
5722                         break;
5723                 }
5724                 case 0xa9:
5725                 {
5726                         sdwCyclesRemaining -= 16;
5727                                 {
5728                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
5729                                 while (psMemRead->lowAddr != 0xffffffff)
5730                                 {
5731                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
5732                                         {
5733                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5734                                                 if (psMemRead->memoryCall)
5735                                                 {
5736                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
5737                                                 }
5738                                                 else
5739                                                 {
5740                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
5741                                                 }
5742                                                 psMemRead = NULL;
5743                                                 break;
5744                                         }
5745                                         ++psMemRead;
5746                                 }
5747
5748                                 if (psMemRead)
5749                                 {
5750                                         bTemp = cpu.z80Base[cpu.z80HL];
5751                                 }
5752
5753                                 cpu.z80HL--;
5754                                 cpu.z80HL &= 0xffff;
5755                                 cpu.z80BC--;
5756                                 cpu.z80BC &= 0xffff;
5757                                 }
5758                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
5759                                 cpu.z80F |= (pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO));
5760                                 if (cpu.z80BC)
5761                                 {
5762                                         cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
5763                                 }
5764                         break;
5765                 }
5766                 case 0xaa:
5767                 {
5768                         sdwCyclesRemaining -= 16;
5769                                 {
5770                                 psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
5771                                 while (psIoRead->lowIoAddr != 0xffff)
5772                                 {
5773                                         if ((cpu.z80B >= psIoRead->lowIoAddr) && (cpu.z80B <= psIoRead->highIoAddr))
5774                                         {
5775                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5776                                                 bTemp = psIoRead->IOCall(cpu.z80B, psIoRead);
5777                                                 psIoRead = NULL;
5778                                                 break;
5779                                         }
5780                                         ++psIoRead;
5781                                 }
5782
5783                                 if (psIoRead)
5784                                 {
5785                                         bTemp = 0xff; /* Unclaimed I/O read */
5786                                 }
5787
5788                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
5789                                 while (psMemWrite->lowAddr != 0xffffffff)
5790                                 {
5791                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
5792                                         {
5793                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5794                                                 if (psMemWrite->memoryCall)
5795                                                 {
5796                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
5797                                                 }
5798                                                 else
5799                                                 {
5800                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
5801                                                 }
5802                                                 psMemWrite = NULL;
5803                                                 break;
5804                                         }
5805                                         ++psMemWrite;
5806                                 }
5807
5808                                 if (psMemWrite)
5809                                 {
5810                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
5811                                 }
5812
5813                                 cpu.z80HL--;
5814                                 cpu.z80HL &= 0xffff;
5815                                 sdwCyclesRemaining -= 16;
5816                                 cpu.z80B--;
5817                                 }
5818                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
5819                                 cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
5820                                 if (cpu.z80B)
5821                                 {
5822                                         cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
5823                                         pbPC -= 2;
5824                                 }
5825                         break;
5826                 }
5827                 case 0xab:
5828                 {
5829                         sdwCyclesRemaining -= 16;
5830                                 {
5831                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
5832                                 while (psMemRead->lowAddr != 0xffffffff)
5833                                 {
5834                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
5835                                         {
5836                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5837                                                 if (psMemRead->memoryCall)
5838                                                 {
5839                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
5840                                                 }
5841                                                 else
5842                                                 {
5843                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
5844                                                 }
5845                                                 psMemRead = NULL;
5846                                                 break;
5847                                         }
5848                                         ++psMemRead;
5849                                 }
5850
5851                                 if (psMemRead)
5852                                 {
5853                                         bTemp = cpu.z80Base[cpu.z80HL];
5854                                 }
5855
5856                                 psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
5857                                 while (psIoWrite->lowIoAddr != 0xffff)
5858                                 {
5859                                         if ((cpu.z80BC >= psIoWrite->lowIoAddr) && (cpu.z80BC <= psIoWrite->highIoAddr))
5860                                         {
5861                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5862                                                 psIoWrite->IOCall(cpu.z80BC, bTemp, psIoWrite);
5863                                                 psIoWrite = NULL;
5864                                                 break;
5865                                         }
5866                                         ++psIoWrite;
5867                                 }
5868
5869                                 cpu.z80HL--;
5870                                 cpu.z80HL &= 0xffff;
5871                                 sdwCyclesRemaining -= 16;
5872                                 cpu.z80B--;
5873                                 }
5874                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
5875                                 cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
5876                                 if (cpu.z80B)
5877                                 {
5878                                         cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
5879                                 }
5880                         break;
5881                 }
5882                 case 0xac:
5883                 {
5884                                 InvalidInstruction(2);
5885                         break;
5886                 }
5887                 case 0xad:
5888                 {
5889                                 InvalidInstruction(2);
5890                         break;
5891                 }
5892                 case 0xae:
5893                 {
5894                                 InvalidInstruction(2);
5895                         break;
5896                 }
5897                 case 0xaf:
5898                 {
5899                                 InvalidInstruction(2);
5900                         break;
5901                 }
5902                 case 0xb0:
5903                 {
5904                         sdwCyclesRemaining -= 16;
5905                                 while ((sdwCyclesRemaining > 0) && (cpu.z80BC))
5906                                 {
5907                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
5908                                 while (psMemRead->lowAddr != 0xffffffff)
5909                                 {
5910                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
5911                                         {
5912                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5913                                                 if (psMemRead->memoryCall)
5914                                                 {
5915                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
5916                                                 }
5917                                                 else
5918                                                 {
5919                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
5920                                                 }
5921                                                 psMemRead = NULL;
5922                                                 break;
5923                                         }
5924                                         ++psMemRead;
5925                                 }
5926
5927                                 if (psMemRead)
5928                                 {
5929                                         bTemp = cpu.z80Base[cpu.z80HL];
5930                                 }
5931
5932                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
5933                                 while (psMemWrite->lowAddr != 0xffffffff)
5934                                 {
5935                                         if ((cpu.z80DE >= psMemWrite->lowAddr) && (cpu.z80DE <= psMemWrite->highAddr))
5936                                         {
5937                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5938                                                 if (psMemWrite->memoryCall)
5939                                                 {
5940                                                         psMemWrite->memoryCall(cpu.z80DE, bTemp, psMemWrite);
5941                                                 }
5942                                                 else
5943                                                 {
5944                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80DE - psMemWrite->lowAddr)) = bTemp;
5945                                                 }
5946                                                 psMemWrite = NULL;
5947                                                 break;
5948                                         }
5949                                         ++psMemWrite;
5950                                 }
5951
5952                                 if (psMemWrite)
5953                                 {
5954                                         cpu.z80Base[cpu.z80DE] = (UINT8) bTemp;
5955                                 }
5956
5957                                         ++cpu.z80HL;
5958                                         ++cpu.z80DE;
5959                                 --cpu.z80BC;
5960                                 cpu.z80HL &= 0xffff;
5961                                 cpu.z80DE &= 0xffff;
5962                                 cpu.z80BC &= 0xffff;
5963                                 sdwCyclesRemaining -= 21;
5964                                 }
5965                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY);
5966                                 if (cpu.z80BC)
5967                                 {
5968                                         pbPC -= 2;      /* Back up so we hit this instruction again */
5969                                         cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
5970                                 }
5971                                 sdwCyclesRemaining -= 16;
5972                         break;
5973                 }
5974                 case 0xb1:
5975                 {
5976                         sdwCyclesRemaining -= 16;
5977                                 while ((sdwCyclesRemaining >= 0) && (cpu.z80BC))
5978                                 {
5979                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
5980                                 while (psMemRead->lowAddr != 0xffffffff)
5981                                 {
5982                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
5983                                         {
5984                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5985                                                 if (psMemRead->memoryCall)
5986                                                 {
5987                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
5988                                                 }
5989                                                 else
5990                                                 {
5991                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
5992                                                 }
5993                                                 psMemRead = NULL;
5994                                                 break;
5995                                         }
5996                                         ++psMemRead;
5997                                 }
5998
5999                                 if (psMemRead)
6000                                 {
6001                                         bTemp = cpu.z80Base[cpu.z80HL];
6002                                 }
6003
6004                                 cpu.z80HL++;
6005                                 cpu.z80HL &= 0xffff;
6006                                 cpu.z80BC--;
6007                                 cpu.z80BC &= 0xffff;
6008                                 sdwCyclesRemaining -= 16;
6009                                 if (cpu.z80A == bTemp)
6010                                 {
6011                                         break;
6012                                 }
6013                                 }
6014                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
6015                                 cpu.z80F |= (pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO));
6016                                 if (cpu.z80BC)
6017                                 {
6018                                         cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
6019                                 }
6020                         break;
6021                 }
6022                 case 0xb2:
6023                 {
6024                         sdwCyclesRemaining -= 16;
6025                                 while ((sdwCyclesRemaining > 0) && (cpu.z80B))
6026                                 {
6027                                 psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
6028                                 while (psIoRead->lowIoAddr != 0xffff)
6029                                 {
6030                                         if ((cpu.z80B >= psIoRead->lowIoAddr) && (cpu.z80B <= psIoRead->highIoAddr))
6031                                         {
6032                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6033                                                 bTemp = psIoRead->IOCall(cpu.z80B, psIoRead);
6034                                                 psIoRead = NULL;
6035                                                 break;
6036                                         }
6037                                         ++psIoRead;
6038                                 }
6039
6040                                 if (psIoRead)
6041                                 {
6042                                         bTemp = 0xff; /* Unclaimed I/O read */
6043                                 }
6044
6045                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
6046                                 while (psMemWrite->lowAddr != 0xffffffff)
6047                                 {
6048                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
6049                                         {
6050                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6051                                                 if (psMemWrite->memoryCall)
6052                                                 {
6053                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
6054                                                 }
6055                                                 else
6056                                                 {
6057                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
6058                                                 }
6059                                                 psMemWrite = NULL;
6060                                                 break;
6061                                         }
6062                                         ++psMemWrite;
6063                                 }
6064
6065                                 if (psMemWrite)
6066                                 {
6067                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
6068                                 }
6069
6070                                 cpu.z80HL++;
6071                                 cpu.z80HL &= 0xffff;
6072                                 sdwCyclesRemaining -= 16;
6073                                 cpu.z80B--;
6074                                 }
6075                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
6076                                 cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
6077                                 if (cpu.z80B)
6078                                 {
6079                                         cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
6080                                         pbPC -= 2;
6081                                 }
6082                         break;
6083                 }
6084                 case 0xb3:
6085                 {
6086                         sdwCyclesRemaining -= 16;
6087                                 while ((sdwCyclesRemaining > 0) && (cpu.z80B))
6088                                 {
6089                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
6090                                 while (psMemRead->lowAddr != 0xffffffff)
6091                                 {
6092                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
6093                                         {
6094                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6095                                                 if (psMemRead->memoryCall)
6096                                                 {
6097                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
6098                                                 }
6099                                                 else
6100                                                 {
6101                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
6102                                                 }
6103                                                 psMemRead = NULL;
6104                                                 break;
6105                                         }
6106                                         ++psMemRead;
6107                                 }
6108
6109                                 if (psMemRead)
6110                                 {
6111                                         bTemp = cpu.z80Base[cpu.z80HL];
6112                                 }
6113
6114                                 psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
6115                                 while (psIoWrite->lowIoAddr != 0xffff)
6116                                 {
6117                                         if ((cpu.z80BC >= psIoWrite->lowIoAddr) && (cpu.z80BC <= psIoWrite->highIoAddr))
6118                                         {
6119                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6120                                                 psIoWrite->IOCall(cpu.z80BC, bTemp, psIoWrite);
6121                                                 psIoWrite = NULL;
6122                                                 break;
6123                                         }
6124                                         ++psIoWrite;
6125                                 }
6126
6127                                 cpu.z80HL++;
6128                                 cpu.z80HL &= 0xffff;
6129                                 sdwCyclesRemaining -= 16;
6130                                 cpu.z80B--;
6131                                 }
6132                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
6133                                 cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
6134                                 if (cpu.z80B)
6135                                 {
6136                                         cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
6137                                 }
6138                         break;
6139                 }
6140                 case 0xb4:
6141                 {
6142                                 InvalidInstruction(2);
6143                         break;
6144                 }
6145                 case 0xb5:
6146                 {
6147                                 InvalidInstruction(2);
6148                         break;
6149                 }
6150                 case 0xb6:
6151                 {
6152                                 InvalidInstruction(2);
6153                         break;
6154                 }
6155                 case 0xb7:
6156                 {
6157                                 InvalidInstruction(2);
6158                         break;
6159                 }
6160                 case 0xb8:
6161                 {
6162                         sdwCyclesRemaining -= 16;
6163                                 while ((sdwCyclesRemaining > 0) && (cpu.z80BC))
6164                                 {
6165                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
6166                                 while (psMemRead->lowAddr != 0xffffffff)
6167                                 {
6168                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
6169                                         {
6170                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6171                                                 if (psMemRead->memoryCall)
6172                                                 {
6173                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
6174                                                 }
6175                                                 else
6176                                                 {
6177                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
6178                                                 }
6179                                                 psMemRead = NULL;
6180                                                 break;
6181                                         }
6182                                         ++psMemRead;
6183                                 }
6184
6185                                 if (psMemRead)
6186                                 {
6187                                         bTemp = cpu.z80Base[cpu.z80HL];
6188                                 }
6189
6190                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
6191                                 while (psMemWrite->lowAddr != 0xffffffff)
6192                                 {
6193                                         if ((cpu.z80DE >= psMemWrite->lowAddr) && (cpu.z80DE <= psMemWrite->highAddr))
6194                                         {
6195                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6196                                                 if (psMemWrite->memoryCall)
6197                                                 {
6198                                                         psMemWrite->memoryCall(cpu.z80DE, bTemp, psMemWrite);
6199                                                 }
6200                                                 else
6201                                                 {
6202                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80DE - psMemWrite->lowAddr)) = bTemp;
6203                                                 }
6204                                                 psMemWrite = NULL;
6205                                                 break;
6206                                         }
6207                                         ++psMemWrite;
6208                                 }
6209
6210                                 if (psMemWrite)
6211                                 {
6212                                         cpu.z80Base[cpu.z80DE] = (UINT8) bTemp;
6213                                 }
6214
6215                                         --cpu.z80HL;
6216                                         --cpu.z80DE;
6217                                 --cpu.z80BC;
6218                                 cpu.z80HL &= 0xffff;
6219                                 cpu.z80DE &= 0xffff;
6220                                 cpu.z80BC &= 0xffff;
6221                                 sdwCyclesRemaining -= 21;
6222                                 }
6223                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY);
6224                                 if (cpu.z80BC)
6225                                 {
6226                                         pbPC -= 2;      /* Back up so we hit this instruction again */
6227                                         cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
6228                                 }
6229                                 sdwCyclesRemaining -= 16;
6230                         break;
6231                 }
6232                 case 0xb9:
6233                 {
6234                         sdwCyclesRemaining -= 16;
6235                                 while ((sdwCyclesRemaining >= 0) && (cpu.z80BC))
6236                                 {
6237                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
6238                                 while (psMemRead->lowAddr != 0xffffffff)
6239                                 {
6240                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
6241                                         {
6242                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6243                                                 if (psMemRead->memoryCall)
6244                                                 {
6245                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
6246                                                 }
6247                                                 else
6248                                                 {
6249                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
6250                                                 }
6251                                                 psMemRead = NULL;
6252                                                 break;
6253                                         }
6254                                         ++psMemRead;
6255                                 }
6256
6257                                 if (psMemRead)
6258                                 {
6259                                         bTemp = cpu.z80Base[cpu.z80HL];
6260                                 }
6261
6262                                 cpu.z80HL--;
6263                                 cpu.z80HL &= 0xffff;
6264                                 cpu.z80BC--;
6265                                 cpu.z80BC &= 0xffff;
6266                                 sdwCyclesRemaining -= 16;
6267                                 if (cpu.z80A == bTemp)
6268                                 {
6269                                         break;
6270                                 }
6271                                 }
6272                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
6273                                 cpu.z80F |= (pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO));
6274                                 if (cpu.z80BC)
6275                                 {
6276                                         cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
6277                                 }
6278                         break;
6279                 }
6280                 case 0xba:
6281                 {
6282                         sdwCyclesRemaining -= 16;
6283                                 while ((sdwCyclesRemaining > 0) && (cpu.z80B))
6284                                 {
6285                                 psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
6286                                 while (psIoRead->lowIoAddr != 0xffff)
6287                                 {
6288                                         if ((cpu.z80B >= psIoRead->lowIoAddr) && (cpu.z80B <= psIoRead->highIoAddr))
6289                                         {
6290                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6291                                                 bTemp = psIoRead->IOCall(cpu.z80B, psIoRead);
6292                                                 psIoRead = NULL;
6293                                                 break;
6294                                         }
6295                                         ++psIoRead;
6296                                 }
6297
6298                                 if (psIoRead)
6299                                 {
6300                                         bTemp = 0xff; /* Unclaimed I/O read */
6301                                 }
6302
6303                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
6304                                 while (psMemWrite->lowAddr != 0xffffffff)
6305                                 {
6306                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
6307                                         {
6308                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6309                                                 if (psMemWrite->memoryCall)
6310                                                 {
6311                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
6312                                                 }
6313                                                 else
6314                                                 {
6315                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
6316                                                 }
6317                                                 psMemWrite = NULL;
6318                                                 break;
6319                                         }
6320                                         ++psMemWrite;
6321                                 }
6322
6323                                 if (psMemWrite)
6324                                 {
6325                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
6326                                 }
6327
6328                                 cpu.z80HL--;
6329                                 cpu.z80HL &= 0xffff;
6330                                 sdwCyclesRemaining -= 16;
6331                                 cpu.z80B--;
6332                                 }
6333                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
6334                                 cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
6335                                 if (cpu.z80B)
6336                                 {
6337                                         cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
6338                                         pbPC -= 2;
6339                                 }
6340                         break;
6341                 }
6342                 case 0xbb:
6343                 {
6344                         sdwCyclesRemaining -= 16;
6345                                 while ((sdwCyclesRemaining > 0) && (cpu.z80B))
6346                                 {
6347                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
6348                                 while (psMemRead->lowAddr != 0xffffffff)
6349                                 {
6350                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
6351                                         {
6352                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6353                                                 if (psMemRead->memoryCall)
6354                                                 {
6355                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
6356                                                 }
6357                                                 else
6358                                                 {
6359                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
6360                                                 }
6361                                                 psMemRead = NULL;
6362                                                 break;
6363                                         }
6364                                         ++psMemRead;
6365                                 }
6366
6367                                 if (psMemRead)
6368                                 {
6369                                         bTemp = cpu.z80Base[cpu.z80HL];
6370                                 }
6371
6372                                 psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
6373                                 while (psIoWrite->lowIoAddr != 0xffff)
6374                                 {
6375                                         if ((cpu.z80BC >= psIoWrite->lowIoAddr) && (cpu.z80BC <= psIoWrite->highIoAddr))
6376                                         {
6377                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6378                                                 psIoWrite->IOCall(cpu.z80BC, bTemp, psIoWrite);
6379                                                 psIoWrite = NULL;
6380                                                 break;
6381                                         }
6382                                         ++psIoWrite;
6383                                 }
6384
6385                                 cpu.z80HL--;
6386                                 cpu.z80HL &= 0xffff;
6387                                 sdwCyclesRemaining -= 16;
6388                                 cpu.z80B--;
6389                                 }
6390                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
6391                                 cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
6392                                 if (cpu.z80B)
6393                                 {
6394                                         cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
6395                                 }
6396                         break;
6397                 }
6398                 case 0xbc:
6399                 {
6400                                 InvalidInstruction(2);
6401                         break;
6402                 }
6403                 case 0xbd:
6404                 {
6405                                 InvalidInstruction(2);
6406                         break;
6407                 }
6408                 case 0xbe:
6409                 {
6410                                 InvalidInstruction(2);
6411                         break;
6412                 }
6413                 case 0xbf:
6414                 {
6415                                 InvalidInstruction(2);
6416                         break;
6417                 }
6418                 case 0xc0:
6419                 {
6420                                 InvalidInstruction(2);
6421                         break;
6422                 }
6423                 case 0xc1:
6424                 {
6425                                 InvalidInstruction(2);
6426                         break;
6427                 }
6428                 case 0xc2:
6429                 {
6430                                 InvalidInstruction(2);
6431                         break;
6432                 }
6433                 case 0xc3:
6434                 {
6435                                 InvalidInstruction(2);
6436                         break;
6437                 }
6438                 case 0xc4:
6439                 {
6440                                 InvalidInstruction(2);
6441                         break;
6442                 }
6443                 case 0xc5:
6444                 {
6445                                 InvalidInstruction(2);
6446                         break;
6447                 }
6448                 case 0xc6:
6449                 {
6450                                 InvalidInstruction(2);
6451                         break;
6452                 }
6453                 case 0xc7:
6454                 {
6455                                 InvalidInstruction(2);
6456                         break;
6457                 }
6458                 case 0xc8:
6459                 {
6460                                 InvalidInstruction(2);
6461                         break;
6462                 }
6463                 case 0xc9:
6464                 {
6465                                 InvalidInstruction(2);
6466                         break;
6467                 }
6468                 case 0xca:
6469                 {
6470                                 InvalidInstruction(2);
6471                         break;
6472                 }
6473                 case 0xcb:
6474                 {
6475                                 InvalidInstruction(2);
6476                         break;
6477                 }
6478                 case 0xcc:
6479                 {
6480                                 InvalidInstruction(2);
6481                         break;
6482                 }
6483                 case 0xcd:
6484                 {
6485                                 InvalidInstruction(2);
6486                         break;
6487                 }
6488                 case 0xce:
6489                 {
6490                                 InvalidInstruction(2);
6491                         break;
6492                 }
6493                 case 0xcf:
6494                 {
6495                                 InvalidInstruction(2);
6496                         break;
6497                 }
6498                 case 0xd0:
6499                 {
6500                                 InvalidInstruction(2);
6501                         break;
6502                 }
6503                 case 0xd1:
6504                 {
6505                                 InvalidInstruction(2);
6506                         break;
6507                 }
6508                 case 0xd2:
6509                 {
6510                                 InvalidInstruction(2);
6511                         break;
6512                 }
6513                 case 0xd3:
6514                 {
6515                                 InvalidInstruction(2);
6516                         break;
6517                 }
6518                 case 0xd4:
6519                 {
6520                                 InvalidInstruction(2);
6521                         break;
6522                 }
6523                 case 0xd5:
6524                 {
6525                                 InvalidInstruction(2);
6526                         break;
6527                 }
6528                 case 0xd6:
6529                 {
6530                                 InvalidInstruction(2);
6531                         break;
6532                 }
6533                 case 0xd7:
6534                 {
6535                                 InvalidInstruction(2);
6536                         break;
6537                 }
6538                 case 0xd8:
6539                 {
6540                                 InvalidInstruction(2);
6541                         break;
6542                 }
6543                 case 0xd9:
6544                 {
6545                                 InvalidInstruction(2);
6546                         break;
6547                 }
6548                 case 0xda:
6549                 {
6550                                 InvalidInstruction(2);
6551                         break;
6552                 }
6553                 case 0xdb:
6554                 {
6555                                 InvalidInstruction(2);
6556                         break;
6557                 }
6558                 case 0xdc:
6559                 {
6560                                 InvalidInstruction(2);
6561                         break;
6562                 }
6563                 case 0xdd:
6564                 {
6565                                 InvalidInstruction(2);
6566                         break;
6567                 }
6568                 case 0xde:
6569                 {
6570                                 InvalidInstruction(2);
6571                         break;
6572                 }
6573                 case 0xdf:
6574                 {
6575                                 InvalidInstruction(2);
6576                         break;
6577                 }
6578                 case 0xe0:
6579                 {
6580                                 InvalidInstruction(2);
6581                         break;
6582                 }
6583                 case 0xe1:
6584                 {
6585                                 InvalidInstruction(2);
6586                         break;
6587                 }
6588                 case 0xe2:
6589                 {
6590                                 InvalidInstruction(2);
6591                         break;
6592                 }
6593                 case 0xe3:
6594                 {
6595                                 InvalidInstruction(2);
6596                         break;
6597                 }
6598                 case 0xe4:
6599                 {
6600                                 InvalidInstruction(2);
6601                         break;
6602                 }
6603                 case 0xe5:
6604                 {
6605                                 InvalidInstruction(2);
6606                         break;
6607                 }
6608                 case 0xe6:
6609                 {
6610                                 InvalidInstruction(2);
6611                         break;
6612                 }
6613                 case 0xe7:
6614                 {
6615                                 InvalidInstruction(2);
6616                         break;
6617                 }
6618                 case 0xe8:
6619                 {
6620                                 InvalidInstruction(2);
6621                         break;
6622                 }
6623                 case 0xe9:
6624                 {
6625                                 InvalidInstruction(2);
6626                         break;
6627                 }
6628                 case 0xea:
6629                 {
6630                                 InvalidInstruction(2);
6631                         break;
6632                 }
6633                 case 0xeb:
6634                 {
6635                                 InvalidInstruction(2);
6636                         break;
6637                 }
6638                 case 0xec:
6639                 {
6640                                 InvalidInstruction(2);
6641                         break;
6642                 }
6643                 case 0xed:
6644                 {
6645                                 InvalidInstruction(2);
6646                         break;
6647                 }
6648                 case 0xee:
6649                 {
6650                                 InvalidInstruction(2);
6651                         break;
6652                 }
6653                 case 0xef:
6654                 {
6655                                 InvalidInstruction(2);
6656                         break;
6657                 }
6658                 case 0xf0:
6659                 {
6660                                 InvalidInstruction(2);
6661                         break;
6662                 }
6663                 case 0xf1:
6664                 {
6665                                 InvalidInstruction(2);
6666                         break;
6667                 }
6668                 case 0xf2:
6669                 {
6670                                 InvalidInstruction(2);
6671                         break;
6672                 }
6673                 case 0xf3:
6674                 {
6675                                 InvalidInstruction(2);
6676                         break;
6677                 }
6678                 case 0xf4:
6679                 {
6680                                 InvalidInstruction(2);
6681                         break;
6682                 }
6683                 case 0xf5:
6684                 {
6685                                 InvalidInstruction(2);
6686                         break;
6687                 }
6688                 case 0xf6:
6689                 {
6690                                 InvalidInstruction(2);
6691                         break;
6692                 }
6693                 case 0xf7:
6694                 {
6695                                 InvalidInstruction(2);
6696                         break;
6697                 }
6698                 case 0xf8:
6699                 {
6700                                 InvalidInstruction(2);
6701                         break;
6702                 }
6703                 case 0xf9:
6704                 {
6705                                 InvalidInstruction(2);
6706                         break;
6707                 }
6708                 case 0xfa:
6709                 {
6710                                 InvalidInstruction(2);
6711                         break;
6712                 }
6713                 case 0xfb:
6714                 {
6715                                 InvalidInstruction(2);
6716                         break;
6717                 }
6718                 case 0xfc:
6719                 {
6720                                 InvalidInstruction(2);
6721                         break;
6722                 }
6723                 case 0xfd:
6724                 {
6725                                 InvalidInstruction(2);
6726                         break;
6727                 }
6728                 case 0xfe:
6729                 {
6730                                 InvalidInstruction(2);
6731                         break;
6732                 }
6733                 case 0xff:
6734                 {
6735                                 InvalidInstruction(2);
6736                         break;
6737                 }
6738         }
6739 }
6740
6741 void DDHandler(void)
6742 {
6743         switch (*pbPC++)
6744         {
6745                 case 0x00:
6746                 {
6747                                 InvalidInstruction(2);
6748                         break;
6749                 }
6750                 case 0x01:
6751                 {
6752                                 InvalidInstruction(2);
6753                         break;
6754                 }
6755                 case 0x02:
6756                 {
6757                                 InvalidInstruction(2);
6758                         break;
6759                 }
6760                 case 0x03:
6761                 {
6762                                 InvalidInstruction(2);
6763                         break;
6764                 }
6765                 case 0x04:
6766                 {
6767                                 InvalidInstruction(2);
6768                         break;
6769                 }
6770                 case 0x05:
6771                 {
6772                                 InvalidInstruction(2);
6773                         break;
6774                 }
6775                 case 0x06:
6776                 {
6777                                 InvalidInstruction(2);
6778                         break;
6779                 }
6780                 case 0x07:
6781                 {
6782                                 InvalidInstruction(2);
6783                         break;
6784                 }
6785                 case 0x08:
6786                 {
6787                                 InvalidInstruction(2);
6788                         break;
6789                 }
6790                 case 0x09:
6791                 {
6792                         sdwCyclesRemaining -= 15;
6793                         cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
6794                         dwTemp = cpu.z80IX + cpu.z80BC;
6795                         cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IX ^ dwTemp ^ cpu.z80BC) >> 8) & Z80_FLAG_HALF_CARRY);
6796                         cpu.z80IX = dwTemp & 0xffff;
6797                         break;
6798                 }
6799                 case 0x0a:
6800                 {
6801                                 InvalidInstruction(2);
6802                         break;
6803                 }
6804                 case 0x0b:
6805                 {
6806                                 InvalidInstruction(2);
6807                         break;
6808                 }
6809                 case 0x0c:
6810                 {
6811                                 InvalidInstruction(2);
6812                         break;
6813                 }
6814                 case 0x0d:
6815                 {
6816                                 InvalidInstruction(2);
6817                         break;
6818                 }
6819                 case 0x0e:
6820                 {
6821                                 InvalidInstruction(2);
6822                         break;
6823                 }
6824                 case 0x0f:
6825                 {
6826                                 InvalidInstruction(2);
6827                         break;
6828                 }
6829                 case 0x10:
6830                 {
6831                                 InvalidInstruction(2);
6832                         break;
6833                 }
6834                 case 0x11:
6835                 {
6836                                 InvalidInstruction(2);
6837                         break;
6838                 }
6839                 case 0x12:
6840                 {
6841                                 InvalidInstruction(2);
6842                         break;
6843                 }
6844                 case 0x13:
6845                 {
6846                                 InvalidInstruction(2);
6847                         break;
6848                 }
6849                 case 0x14:
6850                 {
6851                                 InvalidInstruction(2);
6852                         break;
6853                 }
6854                 case 0x15:
6855                 {
6856                                 InvalidInstruction(2);
6857                         break;
6858                 }
6859                 case 0x16:
6860                 {
6861                                 InvalidInstruction(2);
6862                         break;
6863                 }
6864                 case 0x17:
6865                 {
6866                                 InvalidInstruction(2);
6867                         break;
6868                 }
6869                 case 0x18:
6870                 {
6871                                 InvalidInstruction(2);
6872                         break;
6873                 }
6874                 case 0x19:
6875                 {
6876                         sdwCyclesRemaining -= 15;
6877                         cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
6878                         dwTemp = cpu.z80IX + cpu.z80DE;
6879                         cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IX ^ dwTemp ^ cpu.z80DE) >> 8) & Z80_FLAG_HALF_CARRY);
6880                         cpu.z80IX = dwTemp & 0xffff;
6881                         break;
6882                 }
6883                 case 0x1a:
6884                 {
6885                                 InvalidInstruction(2);
6886                         break;
6887                 }
6888                 case 0x1b:
6889                 {
6890                                 InvalidInstruction(2);
6891                         break;
6892                 }
6893                 case 0x1c:
6894                 {
6895                                 InvalidInstruction(2);
6896                         break;
6897                 }
6898                 case 0x1d:
6899                 {
6900                                 InvalidInstruction(2);
6901                         break;
6902                 }
6903                 case 0x1e:
6904                 {
6905                                 InvalidInstruction(2);
6906                         break;
6907                 }
6908                 case 0x1f:
6909                 {
6910                                 InvalidInstruction(2);
6911                         break;
6912                 }
6913                 case 0x20:
6914                 {
6915                                 InvalidInstruction(2);
6916                         break;
6917                 }
6918                 case 0x21:
6919                 {
6920                         sdwCyclesRemaining -= 14;
6921                 cpu.z80IX = *pbPC++;
6922                 cpu.z80IX |= ((UINT32) *pbPC++ << 8);
6923                         break;
6924                 }
6925                 case 0x22:
6926                 {
6927                         sdwCyclesRemaining -= 20;
6928                                 dwAddr = *pbPC++;
6929                                 dwAddr |= ((UINT32) *pbPC++ << 8);
6930                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
6931                                 while (psMemWrite->lowAddr != 0xffffffff)
6932                                 {
6933                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
6934                                         {
6935                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6936                                                 if (psMemWrite->memoryCall)
6937                                                 {
6938                                                         psMemWrite->memoryCall(dwAddr, (cpu.z80IX & 0xff), psMemWrite);
6939                                                         psMemWrite->memoryCall(dwAddr + 1, (cpu.z80IX >> 8), psMemWrite);
6940                                                 }
6941                                                 else
6942                                                 {
6943                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = cpu.z80IX;
6944                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr) + 1) = cpu.z80IX >> 8;
6945                                                 }
6946                                                 psMemWrite = NULL;
6947                                                 break;
6948                                         }
6949                                         ++psMemWrite;
6950                                 }
6951
6952                                 if (psMemWrite)
6953                                 {
6954                                         cpu.z80Base[dwAddr] = (UINT8) cpu.z80IX;
6955                                         cpu.z80Base[dwAddr + 1] = (UINT8) ((UINT32) cpu.z80IX >> 8);
6956                                 }
6957
6958                         break;
6959                 }
6960                 case 0x23:
6961                 {
6962                         sdwCyclesRemaining -= 10;
6963                                 cpu.z80IX++;
6964                                 cpu.z80IX &= 0xffff;
6965                         break;
6966                 }
6967                 case 0x24:
6968                 {
6969                         sdwCyclesRemaining -= 9;
6970                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
6971                                 cpu.z80F |= bPostIncFlags[cpu.z80XH++];
6972                         break;
6973                 }
6974                 case 0x25:
6975                 {
6976                         sdwCyclesRemaining -= 9;
6977                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
6978                                 cpu.z80F |= bPostDecFlags[cpu.z80XH--];
6979                         break;
6980                 }
6981                 case 0x26:
6982                 {
6983                         sdwCyclesRemaining -= 9;
6984                         cpu.z80XH = *pbPC++;
6985                         break;
6986                 }
6987                 case 0x27:
6988                 {
6989                                 InvalidInstruction(2);
6990                         break;
6991                 }
6992                 case 0x28:
6993                 {
6994                                 InvalidInstruction(2);
6995                         break;
6996                 }
6997                 case 0x29:
6998                 {
6999                         sdwCyclesRemaining -= 15;
7000                         cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
7001                         dwTemp = cpu.z80IX + cpu.z80IX;
7002                         cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IX ^ dwTemp ^ cpu.z80HL) >> 8) & Z80_FLAG_HALF_CARRY);
7003                         cpu.z80IX = dwTemp & 0xffff;
7004                         break;
7005                 }
7006                 case 0x2a:
7007                 {
7008                         sdwCyclesRemaining -= 20;
7009                                 dwAddr = *pbPC++;
7010                                 dwAddr |= ((UINT32) *pbPC++ << 8);
7011                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
7012                                 while (psMemRead->lowAddr != 0xffffffff)
7013                                 {
7014                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
7015                                         {
7016                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7017                                                 if (psMemRead->memoryCall)
7018                                                 {
7019                                                         cpu.z80IX = psMemRead->memoryCall(dwAddr, psMemRead);
7020                                                         cpu.z80IX |= (UINT32) ((UINT32) psMemRead->memoryCall(dwAddr + 1, psMemRead) << 8);
7021                                                 }
7022                                                 else
7023                                                 {
7024                                                         cpu.z80IX = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
7025                                                         cpu.z80IX |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr + 1)) << 8);
7026                                                 }
7027                                                 psMemRead = NULL;
7028                                                 break;
7029                                         }
7030                                         ++psMemRead;
7031                                 }
7032
7033                                 if (psMemRead)
7034                                 {
7035                                         cpu.z80IX = cpu.z80Base[dwAddr];
7036                                         cpu.z80IX |= (UINT32) ((UINT32) cpu.z80Base[dwAddr + 1] << 8);
7037                                 }
7038
7039                         break;
7040                 }
7041                 case 0x2b:
7042                 {
7043                         sdwCyclesRemaining -= 10;
7044                                 cpu.z80IX--;
7045                                 cpu.z80IX &= 0xffff;
7046                         break;
7047                 }
7048                 case 0x2c:
7049                 {
7050                         sdwCyclesRemaining -= 9;
7051                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
7052                                 cpu.z80F |= bPostIncFlags[cpu.z80XL++];
7053                         break;
7054                 }
7055                 case 0x2d:
7056                 {
7057                         sdwCyclesRemaining -= 9;
7058                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
7059                                 cpu.z80F |= bPostDecFlags[cpu.z80XL--];
7060                         break;
7061                 }
7062                 case 0x2e:
7063                 {
7064                         sdwCyclesRemaining -= 9;
7065                         cpu.z80XL = *pbPC++;
7066                         break;
7067                 }
7068                 case 0x2f:
7069                 {
7070                                 InvalidInstruction(2);
7071                         break;
7072                 }
7073                 case 0x30:
7074                 {
7075                                 InvalidInstruction(2);
7076                         break;
7077                 }
7078                 case 0x31:
7079                 {
7080                                 InvalidInstruction(2);
7081                         break;
7082                 }
7083                 case 0x32:
7084                 {
7085                                 InvalidInstruction(2);
7086                         break;
7087                 }
7088                 case 0x33:
7089                 {
7090                                 InvalidInstruction(2);
7091                         break;
7092                 }
7093                 case 0x34:
7094                 {
7095                         sdwCyclesRemaining -= 23;
7096                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
7097                                 dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
7098                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
7099                                 while (psMemRead->lowAddr != 0xffffffff)
7100                                 {
7101                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
7102                                         {
7103                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7104                                                 if (psMemRead->memoryCall)
7105                                                 {
7106                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
7107                                                 }
7108                                                 else
7109                                                 {
7110                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
7111                                                 }
7112                                                 psMemRead = NULL;
7113                                                 break;
7114                                         }
7115                                         ++psMemRead;
7116                                 }
7117
7118                                 if (psMemRead)
7119                                 {
7120                                         bTemp = cpu.z80Base[dwAddr];
7121                                 }
7122
7123                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
7124                                 cpu.z80F |= bPostIncFlags[bTemp++];
7125                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
7126                                 while (psMemWrite->lowAddr != 0xffffffff)
7127                                 {
7128                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
7129                                         {
7130                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7131                                                 if (psMemWrite->memoryCall)
7132                                                 {
7133                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
7134                                                 }
7135                                                 else
7136                                                 {
7137                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
7138                                                 }
7139                                                 psMemWrite = NULL;
7140                                                 break;
7141                                         }
7142                                         ++psMemWrite;
7143                                 }
7144
7145                                 if (psMemWrite)
7146                                 {
7147                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
7148                                 }
7149
7150                         break;
7151                 }
7152                 case 0x35:
7153                 {
7154                         sdwCyclesRemaining -= 23;
7155                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
7156                                 dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
7157                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
7158                                 while (psMemRead->lowAddr != 0xffffffff)
7159                                 {
7160                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
7161                                         {
7162                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7163                                                 if (psMemRead->memoryCall)
7164                                                 {
7165                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
7166                                                 }
7167                                                 else
7168                                                 {
7169                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
7170                                                 }
7171                                                 psMemRead = NULL;
7172                                                 break;
7173                                         }
7174                                         ++psMemRead;
7175                                 }
7176
7177                                 if (psMemRead)
7178                                 {
7179                                         bTemp = cpu.z80Base[dwAddr];
7180                                 }
7181
7182                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
7183                                 cpu.z80F |= bPostDecFlags[bTemp--];
7184                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
7185                                 while (psMemWrite->lowAddr != 0xffffffff)
7186                                 {
7187                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
7188                                         {
7189                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7190                                                 if (psMemWrite->memoryCall)
7191                                                 {
7192                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
7193                                                 }
7194                                                 else
7195                                                 {
7196                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
7197                                                 }
7198                                                 psMemWrite = NULL;
7199                                                 break;
7200                                         }
7201                                         ++psMemWrite;
7202                                 }
7203
7204                                 if (psMemWrite)
7205                                 {
7206                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
7207                                 }
7208
7209                         break;
7210                 }
7211                 case 0x36:
7212                 {
7213                         sdwCyclesRemaining -= 19;
7214                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
7215                                 sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7216                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
7217                                 while (psMemWrite->lowAddr != 0xffffffff)
7218                                 {
7219                                         if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
7220                                         {
7221                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7222                                                 if (psMemWrite->memoryCall)
7223                                                 {
7224                                                         psMemWrite->memoryCall(sdwAddr, *pbPC++, psMemWrite);
7225                                                 }
7226                                                 else
7227                                                 {
7228                                                         *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = *pbPC++;
7229                                                 }
7230                                                 psMemWrite = NULL;
7231                                                 break;
7232                                         }
7233                                         ++psMemWrite;
7234                                 }
7235
7236                                 if (psMemWrite)
7237                                 {
7238                                         cpu.z80Base[sdwAddr] = (UINT8) *pbPC++;
7239                                 }
7240
7241                         break;
7242                 }
7243                 case 0x37:
7244                 {
7245                                 InvalidInstruction(2);
7246                         break;
7247                 }
7248                 case 0x38:
7249                 {
7250                                 InvalidInstruction(2);
7251                         break;
7252                 }
7253                 case 0x39:
7254                 {
7255                         sdwCyclesRemaining -= 15;
7256                         cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
7257                         dwTemp = cpu.z80IX + cpu.z80sp;
7258                         cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IX ^ dwTemp ^ cpu.z80sp) >> 8) & Z80_FLAG_HALF_CARRY);
7259                         cpu.z80IX = dwTemp & 0xffff;
7260                         break;
7261                 }
7262                 case 0x3a:
7263                 {
7264                                 InvalidInstruction(2);
7265                         break;
7266                 }
7267                 case 0x3b:
7268                 {
7269                                 InvalidInstruction(2);
7270                         break;
7271                 }
7272                 case 0x3c:
7273                 {
7274                                 InvalidInstruction(2);
7275                         break;
7276                 }
7277                 case 0x3d:
7278                 {
7279                                 InvalidInstruction(2);
7280                         break;
7281                 }
7282                 case 0x3e:
7283                 {
7284                                 InvalidInstruction(2);
7285                         break;
7286                 }
7287                 case 0x3f:
7288                 {
7289                                 InvalidInstruction(2);
7290                         break;
7291                 }
7292                 case 0x40:
7293                 {
7294                                 InvalidInstruction(2);
7295                         break;
7296                 }
7297                 case 0x41:
7298                 {
7299                                 InvalidInstruction(2);
7300                         break;
7301                 }
7302                 case 0x42:
7303                 {
7304                                 InvalidInstruction(2);
7305                         break;
7306                 }
7307                 case 0x43:
7308                 {
7309                                 InvalidInstruction(2);
7310                         break;
7311                 }
7312                 case 0x44:
7313                 {
7314                         sdwCyclesRemaining -= 9;
7315                         cpu.z80B = cpu.z80XH;
7316                         break;
7317                 }
7318                 case 0x45:
7319                 {
7320                         sdwCyclesRemaining -= 9;
7321                         cpu.z80B = cpu.z80XL;
7322                         break;
7323                 }
7324                 case 0x46:
7325                 {
7326                         sdwCyclesRemaining -= 19;
7327                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
7328                                 sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7329                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
7330                                 while (psMemRead->lowAddr != 0xffffffff)
7331                                 {
7332                                         if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
7333                                         {
7334                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7335                                                 if (psMemRead->memoryCall)
7336                                                 {
7337                                                         cpu.z80B = psMemRead->memoryCall(sdwAddr, psMemRead);
7338                                                 }
7339                                                 else
7340                                                 {
7341                                                         cpu.z80B = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
7342                                                 }
7343                                                 psMemRead = NULL;
7344                                                 break;
7345                                         }
7346                                         ++psMemRead;
7347                                 }
7348
7349                                 if (psMemRead)
7350                                 {
7351                                         cpu.z80B = cpu.z80Base[sdwAddr];
7352                                 }
7353
7354                         break;
7355                 }
7356                 case 0x47:
7357                 {
7358                                 InvalidInstruction(2);
7359                         break;
7360                 }
7361                 case 0x48:
7362                 {
7363                                 InvalidInstruction(2);
7364                         break;
7365                 }
7366                 case 0x49:
7367                 {
7368                                 InvalidInstruction(2);
7369                         break;
7370                 }
7371                 case 0x4a:
7372                 {
7373                                 InvalidInstruction(2);
7374                         break;
7375                 }
7376                 case 0x4b:
7377                 {
7378                                 InvalidInstruction(2);
7379                         break;
7380                 }
7381                 case 0x4c:
7382                 {
7383                         sdwCyclesRemaining -= 9;
7384                         cpu.z80C = cpu.z80XH;
7385                         break;
7386                 }
7387                 case 0x4d:
7388                 {
7389                         sdwCyclesRemaining -= 9;
7390                         cpu.z80C = cpu.z80XL;
7391                         break;
7392                 }
7393                 case 0x4e:
7394                 {
7395                         sdwCyclesRemaining -= 19;
7396                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
7397                                 sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7398                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
7399                                 while (psMemRead->lowAddr != 0xffffffff)
7400                                 {
7401                                         if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
7402                                         {
7403                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7404                                                 if (psMemRead->memoryCall)
7405                                                 {
7406                                                         cpu.z80C = psMemRead->memoryCall(sdwAddr, psMemRead);
7407                                                 }
7408                                                 else
7409                                                 {
7410                                                         cpu.z80C = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
7411                                                 }
7412                                                 psMemRead = NULL;
7413                                                 break;
7414                                         }
7415                                         ++psMemRead;
7416                                 }
7417
7418                                 if (psMemRead)
7419                                 {
7420                                         cpu.z80C = cpu.z80Base[sdwAddr];
7421                                 }
7422
7423                         break;
7424                 }
7425                 case 0x4f:
7426                 {
7427                                 InvalidInstruction(2);
7428                         break;
7429                 }
7430                 case 0x50:
7431                 {
7432                                 InvalidInstruction(2);
7433                         break;
7434                 }
7435                 case 0x51:
7436                 {
7437                                 InvalidInstruction(2);
7438                         break;
7439                 }
7440                 case 0x52:
7441                 {
7442                                 InvalidInstruction(2);
7443                         break;
7444                 }
7445                 case 0x53:
7446                 {
7447                                 InvalidInstruction(2);
7448                         break;
7449                 }
7450                 case 0x54:
7451                 {
7452                         sdwCyclesRemaining -= 9;
7453                         cpu.z80D = cpu.z80XH;
7454                         break;
7455                 }
7456                 case 0x55:
7457                 {
7458                         sdwCyclesRemaining -= 9;
7459                         cpu.z80D = cpu.z80XL;
7460                         break;
7461                 }
7462                 case 0x56:
7463                 {
7464                         sdwCyclesRemaining -= 19;
7465                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
7466                                 sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7467                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
7468                                 while (psMemRead->lowAddr != 0xffffffff)
7469                                 {
7470                                         if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
7471                                         {
7472                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7473                                                 if (psMemRead->memoryCall)
7474                                                 {
7475                                                         cpu.z80D = psMemRead->memoryCall(sdwAddr, psMemRead);
7476                                                 }
7477                                                 else
7478                                                 {
7479                                                         cpu.z80D = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
7480                                                 }
7481                                                 psMemRead = NULL;
7482                                                 break;
7483                                         }
7484                                         ++psMemRead;
7485                                 }
7486
7487                                 if (psMemRead)
7488                                 {
7489                                         cpu.z80D = cpu.z80Base[sdwAddr];
7490                                 }
7491
7492                         break;
7493                 }
7494                 case 0x57:
7495                 {
7496                                 InvalidInstruction(2);
7497                         break;
7498                 }
7499                 case 0x58:
7500                 {
7501                                 InvalidInstruction(2);
7502                         break;
7503                 }
7504                 case 0x59:
7505                 {
7506                                 InvalidInstruction(2);
7507                         break;
7508                 }
7509                 case 0x5a:
7510                 {
7511                                 InvalidInstruction(2);
7512                         break;
7513                 }
7514                 case 0x5b:
7515                 {
7516                                 InvalidInstruction(2);
7517                         break;
7518                 }
7519                 case 0x5c:
7520                 {
7521                         sdwCyclesRemaining -= 9;
7522                         cpu.z80E = cpu.z80XH;
7523                         break;
7524                 }
7525                 case 0x5d:
7526                 {
7527                         sdwCyclesRemaining -= 9;
7528                         cpu.z80E = cpu.z80XL;
7529                         break;
7530                 }
7531                 case 0x5e:
7532                 {
7533                         sdwCyclesRemaining -= 19;
7534                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
7535                                 sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7536                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
7537                                 while (psMemRead->lowAddr != 0xffffffff)
7538                                 {
7539                                         if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
7540                                         {
7541                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7542                                                 if (psMemRead->memoryCall)
7543                                                 {
7544                                                         cpu.z80E = psMemRead->memoryCall(sdwAddr, psMemRead);
7545                                                 }
7546                                                 else
7547                                                 {
7548                                                         cpu.z80E = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
7549                                                 }
7550                                                 psMemRead = NULL;
7551                                                 break;
7552                                         }
7553                                         ++psMemRead;
7554                                 }
7555
7556                                 if (psMemRead)
7557                                 {
7558                                         cpu.z80E = cpu.z80Base[sdwAddr];
7559                                 }
7560
7561                         break;
7562                 }
7563                 case 0x5f:
7564                 {
7565                                 InvalidInstruction(2);
7566                         break;
7567                 }
7568                 case 0x60:
7569                 {
7570                         sdwCyclesRemaining -= 9;
7571                         cpu.z80XH = cpu.z80B;
7572                         break;
7573                 }
7574                 case 0x61:
7575                 {
7576                         sdwCyclesRemaining -= 9;
7577                         cpu.z80XH = cpu.z80C;
7578                         break;
7579                 }
7580                 case 0x62:
7581                 {
7582                         sdwCyclesRemaining -= 9;
7583                         cpu.z80XH = cpu.z80D;
7584                         break;
7585                 }
7586                 case 0x63:
7587                 {
7588                         sdwCyclesRemaining -= 9;
7589                         cpu.z80XH = cpu.z80E;
7590                         break;
7591                 }
7592                 case 0x64:
7593                 {
7594                         sdwCyclesRemaining -= 9;
7595                         break;
7596                 }
7597                 case 0x65:
7598                 {
7599                         sdwCyclesRemaining -= 9;
7600                         cpu.z80XH = cpu.z80XL;
7601                         break;
7602                 }
7603                 case 0x66:
7604                 {
7605                         sdwCyclesRemaining -= 19;
7606                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
7607                                 sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7608                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
7609                                 while (psMemRead->lowAddr != 0xffffffff)
7610                                 {
7611                                         if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
7612                                         {
7613                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7614                                                 if (psMemRead->memoryCall)
7615                                                 {
7616                                                         cpu.z80H = psMemRead->memoryCall(sdwAddr, psMemRead);
7617                                                 }
7618                                                 else
7619                                                 {
7620                                                         cpu.z80H = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
7621                                                 }
7622                                                 psMemRead = NULL;
7623                                                 break;
7624                                         }
7625                                         ++psMemRead;
7626                                 }
7627
7628                                 if (psMemRead)
7629                                 {
7630                                         cpu.z80H = cpu.z80Base[sdwAddr];
7631                                 }
7632
7633                         break;
7634                 }
7635                 case 0x67:
7636                 {
7637                         sdwCyclesRemaining -= 9;
7638                         cpu.z80XH = cpu.z80A;
7639                         break;
7640                 }
7641                 case 0x68:
7642                 {
7643                         sdwCyclesRemaining -= 9;
7644                         cpu.z80XL = cpu.z80B;
7645                         break;
7646                 }
7647                 case 0x69:
7648                 {
7649                         sdwCyclesRemaining -= 9;
7650                         cpu.z80XL = cpu.z80C;
7651                         break;
7652                 }
7653                 case 0x6a:
7654                 {
7655                         sdwCyclesRemaining -= 9;
7656                         cpu.z80XL = cpu.z80D;
7657                         break;
7658                 }
7659                 case 0x6b:
7660                 {
7661                         sdwCyclesRemaining -= 9;
7662                         cpu.z80XL = cpu.z80E;
7663                         break;
7664                 }
7665                 case 0x6c:
7666                 {
7667                         sdwCyclesRemaining -= 9;
7668                         cpu.z80XL = cpu.z80XH;
7669                         break;
7670                 }
7671                 case 0x6d:
7672                 {
7673                         sdwCyclesRemaining -= 9;
7674                         break;
7675                 }
7676                 case 0x6e:
7677                 {
7678                         sdwCyclesRemaining -= 19;
7679                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
7680                                 sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7681                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
7682                                 while (psMemRead->lowAddr != 0xffffffff)
7683                                 {
7684                                         if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
7685                                         {
7686                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7687                                                 if (psMemRead->memoryCall)
7688                                                 {
7689                                                         cpu.z80L = psMemRead->memoryCall(sdwAddr, psMemRead);
7690                                                 }
7691                                                 else
7692                                                 {
7693                                                         cpu.z80L = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
7694                                                 }
7695                                                 psMemRead = NULL;
7696                                                 break;
7697                                         }
7698                                         ++psMemRead;
7699                                 }
7700
7701                                 if (psMemRead)
7702                                 {
7703                                         cpu.z80L = cpu.z80Base[sdwAddr];
7704                                 }
7705
7706                         break;
7707                 }
7708                 case 0x6f:
7709                 {
7710                         sdwCyclesRemaining -= 9;
7711                         cpu.z80XL = cpu.z80A;
7712                         break;
7713                 }
7714                 case 0x70:
7715                 {
7716                         sdwCyclesRemaining -= 19;
7717                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
7718                                 sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7719                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
7720                                 while (psMemWrite->lowAddr != 0xffffffff)
7721                                 {
7722                                         if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
7723                                         {
7724                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7725                                                 if (psMemWrite->memoryCall)
7726                                                 {
7727                                                         psMemWrite->memoryCall(sdwAddr, cpu.z80B, psMemWrite);
7728                                                 }
7729                                                 else
7730                                                 {
7731                                                         *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80B;
7732                                                 }
7733                                                 psMemWrite = NULL;
7734                                                 break;
7735                                         }
7736                                         ++psMemWrite;
7737                                 }
7738
7739                                 if (psMemWrite)
7740                                 {
7741                                         cpu.z80Base[sdwAddr] = (UINT8) cpu.z80B;
7742                                 }
7743
7744                         break;
7745                 }
7746                 case 0x71:
7747                 {
7748                         sdwCyclesRemaining -= 19;
7749                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
7750                                 sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7751                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
7752                                 while (psMemWrite->lowAddr != 0xffffffff)
7753                                 {
7754                                         if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
7755                                         {
7756                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7757                                                 if (psMemWrite->memoryCall)
7758                                                 {
7759                                                         psMemWrite->memoryCall(sdwAddr, cpu.z80C, psMemWrite);
7760                                                 }
7761                                                 else
7762                                                 {
7763                                                         *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80C;
7764                                                 }
7765                                                 psMemWrite = NULL;
7766                                                 break;
7767                                         }
7768                                         ++psMemWrite;
7769                                 }
7770
7771                                 if (psMemWrite)
7772                                 {
7773                                         cpu.z80Base[sdwAddr] = (UINT8) cpu.z80C;
7774                                 }
7775
7776                         break;
7777                 }
7778                 case 0x72:
7779                 {
7780                         sdwCyclesRemaining -= 19;
7781                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
7782                                 sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7783                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
7784                                 while (psMemWrite->lowAddr != 0xffffffff)
7785                                 {
7786                                         if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
7787                                         {
7788                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7789                                                 if (psMemWrite->memoryCall)
7790                                                 {
7791                                                         psMemWrite->memoryCall(sdwAddr, cpu.z80D, psMemWrite);
7792                                                 }
7793                                                 else
7794                                                 {
7795                                                         *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80D;
7796                                                 }
7797                                                 psMemWrite = NULL;
7798                                                 break;
7799                                         }
7800                                         ++psMemWrite;
7801                                 }
7802
7803                                 if (psMemWrite)
7804                                 {
7805                                         cpu.z80Base[sdwAddr] = (UINT8) cpu.z80D;
7806                                 }
7807
7808                         break;
7809                 }
7810                 case 0x73:
7811                 {
7812                         sdwCyclesRemaining -= 19;
7813                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
7814                                 sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7815                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
7816                                 while (psMemWrite->lowAddr != 0xffffffff)
7817                                 {
7818                                         if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
7819                                         {
7820                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7821                                                 if (psMemWrite->memoryCall)
7822                                                 {
7823                                                         psMemWrite->memoryCall(sdwAddr, cpu.z80E, psMemWrite);
7824                                                 }
7825                                                 else
7826                                                 {
7827                                                         *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80E;
7828                                                 }
7829                                                 psMemWrite = NULL;
7830                                                 break;
7831                                         }
7832                                         ++psMemWrite;
7833                                 }
7834
7835                                 if (psMemWrite)
7836                                 {
7837                                         cpu.z80Base[sdwAddr] = (UINT8) cpu.z80E;
7838                                 }
7839
7840                         break;
7841                 }
7842                 case 0x74:
7843                 {
7844                         sdwCyclesRemaining -= 19;
7845                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
7846                                 sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7847                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
7848                                 while (psMemWrite->lowAddr != 0xffffffff)
7849                                 {
7850                                         if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
7851                                         {
7852                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7853                                                 if (psMemWrite->memoryCall)
7854                                                 {
7855                                                         psMemWrite->memoryCall(sdwAddr, cpu.z80H, psMemWrite);
7856                                                 }
7857                                                 else
7858                                                 {
7859                                                         *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80H;
7860                                                 }
7861                                                 psMemWrite = NULL;
7862                                                 break;
7863                                         }
7864                                         ++psMemWrite;
7865                                 }
7866
7867                                 if (psMemWrite)
7868                                 {
7869                                         cpu.z80Base[sdwAddr] = (UINT8) cpu.z80H;
7870                                 }
7871
7872                         break;
7873                 }
7874                 case 0x75:
7875                 {
7876                         sdwCyclesRemaining -= 19;
7877                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
7878                                 sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7879                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
7880                                 while (psMemWrite->lowAddr != 0xffffffff)
7881                                 {
7882                                         if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
7883                                         {
7884                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7885                                                 if (psMemWrite->memoryCall)
7886                                                 {
7887                                                         psMemWrite->memoryCall(sdwAddr, cpu.z80L, psMemWrite);
7888                                                 }
7889                                                 else
7890                                                 {
7891                                                         *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80L;
7892                                                 }
7893                                                 psMemWrite = NULL;
7894                                                 break;
7895                                         }
7896                                         ++psMemWrite;
7897                                 }
7898
7899                                 if (psMemWrite)
7900                                 {
7901                                         cpu.z80Base[sdwAddr] = (UINT8) cpu.z80L;
7902                                 }
7903
7904                         break;
7905                 }
7906                 case 0x76:
7907                 {
7908                         sdwCyclesRemaining -= 19;
7909                                 InvalidInstruction(2);
7910                         break;
7911                 }
7912                 case 0x77:
7913                 {
7914                         sdwCyclesRemaining -= 19;
7915                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
7916                                 sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7917                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
7918                                 while (psMemWrite->lowAddr != 0xffffffff)
7919                                 {
7920                                         if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
7921                                         {
7922                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7923                                                 if (psMemWrite->memoryCall)
7924                                                 {
7925                                                         psMemWrite->memoryCall(sdwAddr, cpu.z80A, psMemWrite);
7926                                                 }
7927                                                 else
7928                                                 {
7929                                                         *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80A;
7930                                                 }
7931                                                 psMemWrite = NULL;
7932                                                 break;
7933                                         }
7934                                         ++psMemWrite;
7935                                 }
7936
7937                                 if (psMemWrite)
7938                                 {
7939                                         cpu.z80Base[sdwAddr] = (UINT8) cpu.z80A;
7940                                 }
7941
7942                         break;
7943                 }
7944                 case 0x78:
7945                 {
7946                                 InvalidInstruction(2);
7947                         break;
7948                 }
7949                 case 0x79:
7950                 {
7951                                 InvalidInstruction(2);
7952                         break;
7953                 }
7954                 case 0x7a:
7955                 {
7956                                 InvalidInstruction(2);
7957                         break;
7958                 }
7959                 case 0x7b:
7960                 {
7961                                 InvalidInstruction(2);
7962                         break;
7963                 }
7964                 case 0x7c:
7965                 {
7966                         sdwCyclesRemaining -= 9;
7967                         cpu.z80A = cpu.z80XH;
7968                         break;
7969                 }
7970                 case 0x7d:
7971                 {
7972                         sdwCyclesRemaining -= 9;
7973                         cpu.z80A = cpu.z80XL;
7974                         break;
7975                 }
7976                 case 0x7e:
7977                 {
7978                         sdwCyclesRemaining -= 19;
7979                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
7980                                 sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7981                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
7982                                 while (psMemRead->lowAddr != 0xffffffff)
7983                                 {
7984                                         if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
7985                                         {
7986                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7987                                                 if (psMemRead->memoryCall)
7988                                                 {
7989                                                         cpu.z80A = psMemRead->memoryCall(sdwAddr, psMemRead);
7990                                                 }
7991                                                 else
7992                                                 {
7993                                                         cpu.z80A = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
7994                                                 }
7995                                                 psMemRead = NULL;
7996                                                 break;
7997                                         }
7998                                         ++psMemRead;
7999                                 }
8000
8001                                 if (psMemRead)
8002                                 {
8003                                         cpu.z80A = cpu.z80Base[sdwAddr];
8004                                 }
8005
8006                         break;
8007                 }
8008                 case 0x7f:
8009                 {
8010                                 InvalidInstruction(2);
8011                         break;
8012                 }
8013                 case 0x80:
8014                 {
8015                                 InvalidInstruction(2);
8016                         break;
8017                 }
8018                 case 0x81:
8019                 {
8020                                 InvalidInstruction(2);
8021                         break;
8022                 }
8023                 case 0x82:
8024                 {
8025                                 InvalidInstruction(2);
8026                         break;
8027                 }
8028                 case 0x83:
8029                 {
8030                                 InvalidInstruction(2);
8031                         break;
8032                 }
8033                 case 0x84:
8034                 {
8035                         sdwCyclesRemaining -= 9;
8036                                 bTemp2 = cpu.z80A + cpu.z80XH;
8037                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
8038                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8039                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80XH];
8040                                 InvalidInstruction(2);
8041                         break;
8042                 }
8043                 case 0x85:
8044                 {
8045                         sdwCyclesRemaining -= 9;
8046                                 bTemp2 = cpu.z80A + cpu.z80XL;
8047                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
8048                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8049                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80XL];
8050                                 InvalidInstruction(2);
8051                         break;
8052                 }
8053                 case 0x86:
8054                 {
8055                         sdwCyclesRemaining -= 19;
8056                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
8057                                 dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
8058                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
8059                                 while (psMemRead->lowAddr != 0xffffffff)
8060                                 {
8061                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
8062                                         {
8063                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8064                                                 if (psMemRead->memoryCall)
8065                                                 {
8066                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
8067                                                 }
8068                                                 else
8069                                                 {
8070                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
8071                                                 }
8072                                                 psMemRead = NULL;
8073                                                 break;
8074                                         }
8075                                         ++psMemRead;
8076                                 }
8077
8078                                 if (psMemRead)
8079                                 {
8080                                         bTemp = cpu.z80Base[dwAddr];
8081                                 }
8082
8083                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
8084                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8085                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp];
8086                                 cpu.z80A += bTemp;
8087                         break;
8088                 }
8089                 case 0x87:
8090                 {
8091                                 InvalidInstruction(2);
8092                         break;
8093                 }
8094                 case 0x88:
8095                 {
8096                                 InvalidInstruction(2);
8097                         break;
8098                 }
8099                 case 0x89:
8100                 {
8101                                 InvalidInstruction(2);
8102                         break;
8103                 }
8104                 case 0x8a:
8105                 {
8106                                 InvalidInstruction(2);
8107                         break;
8108                 }
8109                 case 0x8b:
8110                 {
8111                                 InvalidInstruction(2);
8112                         break;
8113                 }
8114                 case 0x8c:
8115                 {
8116                         sdwCyclesRemaining -= 9;
8117                                 bTemp2 = cpu.z80A + cpu.z80XH + (cpu.z80F & Z80_FLAG_CARRY);
8118                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
8119                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8120                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80XH | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
8121                                 InvalidInstruction(2);
8122                         break;
8123                 }
8124                 case 0x8d:
8125                 {
8126                         sdwCyclesRemaining -= 9;
8127                                 bTemp2 = cpu.z80A + cpu.z80XL + (cpu.z80F & Z80_FLAG_CARRY);
8128                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
8129                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8130                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80XL | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
8131                                 InvalidInstruction(2);
8132                         break;
8133                 }
8134                 case 0x8e:
8135                 {
8136                         sdwCyclesRemaining -= 19;
8137                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
8138                                 dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
8139                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
8140                                 while (psMemRead->lowAddr != 0xffffffff)
8141                                 {
8142                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
8143                                         {
8144                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8145                                                 if (psMemRead->memoryCall)
8146                                                 {
8147                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
8148                                                 }
8149                                                 else
8150                                                 {
8151                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
8152                                                 }
8153                                                 psMemRead = NULL;
8154                                                 break;
8155                                         }
8156                                         ++psMemRead;
8157                                 }
8158
8159                                 if (psMemRead)
8160                                 {
8161                                         bTemp = cpu.z80Base[dwAddr];
8162                                 }
8163
8164                                 bTemp2 = (cpu.z80F & Z80_FLAG_CARRY);
8165                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
8166                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8167                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
8168                                 cpu.z80A += bTemp + bTemp2;
8169                         break;
8170                 }
8171                 case 0x8f:
8172                 {
8173                                 InvalidInstruction(2);
8174                         break;
8175                 }
8176                 case 0x90:
8177                 {
8178                                 InvalidInstruction(2);
8179                         break;
8180                 }
8181                 case 0x91:
8182                 {
8183                                 InvalidInstruction(2);
8184                         break;
8185                 }
8186                 case 0x92:
8187                 {
8188                                 InvalidInstruction(2);
8189                         break;
8190                 }
8191                 case 0x93:
8192                 {
8193                                 InvalidInstruction(2);
8194                         break;
8195                 }
8196                 case 0x94:
8197                 {
8198                         sdwCyclesRemaining -= 9;
8199                                 bTemp2 = cpu.z80A - cpu.z80XH;
8200                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
8201                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8202                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80XH];
8203                                 InvalidInstruction(2);
8204                         break;
8205                 }
8206                 case 0x95:
8207                 {
8208                         sdwCyclesRemaining -= 9;
8209                                 bTemp2 = cpu.z80A - cpu.z80XL;
8210                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
8211                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8212                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80XL];
8213                                 InvalidInstruction(2);
8214                         break;
8215                 }
8216                 case 0x96:
8217                 {
8218                         sdwCyclesRemaining -= 19;
8219                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
8220                                 dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
8221                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
8222                                 while (psMemRead->lowAddr != 0xffffffff)
8223                                 {
8224                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
8225                                         {
8226                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8227                                                 if (psMemRead->memoryCall)
8228                                                 {
8229                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
8230                                                 }
8231                                                 else
8232                                                 {
8233                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
8234                                                 }
8235                                                 psMemRead = NULL;
8236                                                 break;
8237                                         }
8238                                         ++psMemRead;
8239                                 }
8240
8241                                 if (psMemRead)
8242                                 {
8243                                         bTemp = cpu.z80Base[dwAddr];
8244                                 }
8245
8246                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
8247                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8248                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
8249                                 cpu.z80A -= bTemp;
8250                         break;
8251                 }
8252                 case 0x97:
8253                 {
8254                                 InvalidInstruction(2);
8255                         break;
8256                 }
8257                 case 0x98:
8258                 {
8259                                 InvalidInstruction(2);
8260                         break;
8261                 }
8262                 case 0x99:
8263                 {
8264                                 InvalidInstruction(2);
8265                         break;
8266                 }
8267                 case 0x9a:
8268                 {
8269                                 InvalidInstruction(2);
8270                         break;
8271                 }
8272                 case 0x9b:
8273                 {
8274                                 InvalidInstruction(2);
8275                         break;
8276                 }
8277                 case 0x9c:
8278                 {
8279                         sdwCyclesRemaining -= 9;
8280                                 bTemp2 = cpu.z80A - cpu.z80XH - (cpu.z80F & Z80_FLAG_CARRY);
8281                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
8282                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8283                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80XH | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
8284                                 InvalidInstruction(2);
8285                         break;
8286                 }
8287                 case 0x9d:
8288                 {
8289                         sdwCyclesRemaining -= 9;
8290                                 bTemp2 = cpu.z80A - cpu.z80XL - (cpu.z80F & Z80_FLAG_CARRY);
8291                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
8292                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8293                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80XL | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
8294                                 InvalidInstruction(2);
8295                         break;
8296                 }
8297                 case 0x9e:
8298                 {
8299                         sdwCyclesRemaining -= 19;
8300                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
8301                                 dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
8302                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
8303                                 while (psMemRead->lowAddr != 0xffffffff)
8304                                 {
8305                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
8306                                         {
8307                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8308                                                 if (psMemRead->memoryCall)
8309                                                 {
8310                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
8311                                                 }
8312                                                 else
8313                                                 {
8314                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
8315                                                 }
8316                                                 psMemRead = NULL;
8317                                                 break;
8318                                         }
8319                                         ++psMemRead;
8320                                 }
8321
8322                                 if (psMemRead)
8323                                 {
8324                                         bTemp = cpu.z80Base[dwAddr];
8325                                 }
8326
8327                                 bTemp2 = cpu.z80A;
8328                                 cpu.z80A = cpu.z80A - bTemp - (cpu.z80F & Z80_FLAG_CARRY);
8329                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
8330                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8331                                                                 pbSubSbcTable[((UINT32) bTemp2 << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
8332                         break;
8333                 }
8334                 case 0x9f:
8335                 {
8336                                 InvalidInstruction(2);
8337                         break;
8338                 }
8339                 case 0xa0:
8340                 {
8341                                 InvalidInstruction(2);
8342                         break;
8343                 }
8344                 case 0xa1:
8345                 {
8346                                 InvalidInstruction(2);
8347                         break;
8348                 }
8349                 case 0xa2:
8350                 {
8351                                 InvalidInstruction(2);
8352                         break;
8353                 }
8354                 case 0xa3:
8355                 {
8356                                 InvalidInstruction(2);
8357                         break;
8358                 }
8359                 case 0xa4:
8360                 {
8361                         sdwCyclesRemaining -= 9;
8362                                 cpu.z80A &= cpu.z80XH;
8363                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8364                                 cpu.z80F |= bPostANDFlags[cpu.z80A];
8365
8366                                 InvalidInstruction(2);
8367                         break;
8368                 }
8369                 case 0xa5:
8370                 {
8371                         sdwCyclesRemaining -= 9;
8372                                 cpu.z80A &= cpu.z80XL;
8373                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8374                                 cpu.z80F |= bPostANDFlags[cpu.z80A];
8375
8376                                 InvalidInstruction(2);
8377                         break;
8378                 }
8379                 case 0xa6:
8380                 {
8381                         sdwCyclesRemaining -= 19;
8382                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
8383                                 dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
8384                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
8385                                 while (psMemRead->lowAddr != 0xffffffff)
8386                                 {
8387                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
8388                                         {
8389                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8390                                                 if (psMemRead->memoryCall)
8391                                                 {
8392                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
8393                                                 }
8394                                                 else
8395                                                 {
8396                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
8397                                                 }
8398                                                 psMemRead = NULL;
8399                                                 break;
8400                                         }
8401                                         ++psMemRead;
8402                                 }
8403
8404                                 if (psMemRead)
8405                                 {
8406                                         bTemp = cpu.z80Base[dwAddr];
8407                                 }
8408
8409                                 cpu.z80A &= bTemp;
8410                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8411                                 cpu.z80F |= bPostANDFlags[cpu.z80A];
8412
8413                         break;
8414                 }
8415                 case 0xa7:
8416                 {
8417                                 InvalidInstruction(2);
8418                         break;
8419                 }
8420                 case 0xa8:
8421                 {
8422                                 InvalidInstruction(2);
8423                         break;
8424                 }
8425                 case 0xa9:
8426                 {
8427                                 InvalidInstruction(2);
8428                         break;
8429                 }
8430                 case 0xaa:
8431                 {
8432                                 InvalidInstruction(2);
8433                         break;
8434                 }
8435                 case 0xab:
8436                 {
8437                                 InvalidInstruction(2);
8438                         break;
8439                 }
8440                 case 0xac:
8441                 {
8442                         sdwCyclesRemaining -= 9;
8443                                 cpu.z80A ^= cpu.z80XH;
8444                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8445                                 cpu.z80F |= bPostORFlags[cpu.z80A];
8446
8447                                 InvalidInstruction(2);
8448                         break;
8449                 }
8450                 case 0xad:
8451                 {
8452                         sdwCyclesRemaining -= 9;
8453                                 cpu.z80A ^= cpu.z80XL;
8454                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8455                                 cpu.z80F |= bPostORFlags[cpu.z80A];
8456
8457                                 InvalidInstruction(2);
8458                         break;
8459                 }
8460                 case 0xae:
8461                 {
8462                         sdwCyclesRemaining -= 19;
8463                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
8464                                 dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
8465                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
8466                                 while (psMemRead->lowAddr != 0xffffffff)
8467                                 {
8468                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
8469                                         {
8470                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8471                                                 if (psMemRead->memoryCall)
8472                                                 {
8473                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
8474                                                 }
8475                                                 else
8476                                                 {
8477                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
8478                                                 }
8479                                                 psMemRead = NULL;
8480                                                 break;
8481                                         }
8482                                         ++psMemRead;
8483                                 }
8484
8485                                 if (psMemRead)
8486                                 {
8487                                         bTemp = cpu.z80Base[dwAddr];
8488                                 }
8489
8490                                 cpu.z80A ^= bTemp;
8491                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8492                                 cpu.z80F |= bPostORFlags[cpu.z80A];
8493
8494                         break;
8495                 }
8496                 case 0xaf:
8497                 {
8498                                 InvalidInstruction(2);
8499                         break;
8500                 }
8501                 case 0xb0:
8502                 {
8503                                 InvalidInstruction(2);
8504                         break;
8505                 }
8506                 case 0xb1:
8507                 {
8508                                 InvalidInstruction(2);
8509                         break;
8510                 }
8511                 case 0xb2:
8512                 {
8513                                 InvalidInstruction(2);
8514                         break;
8515                 }
8516                 case 0xb3:
8517                 {
8518                                 InvalidInstruction(2);
8519                         break;
8520                 }
8521                 case 0xb4:
8522                 {
8523                         sdwCyclesRemaining -= 9;
8524                                 cpu.z80A |= cpu.z80XH;
8525                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8526                                 cpu.z80F |= bPostORFlags[cpu.z80A];
8527
8528                                 InvalidInstruction(2);
8529                         break;
8530                 }
8531                 case 0xb5:
8532                 {
8533                         sdwCyclesRemaining -= 9;
8534                                 cpu.z80A |= cpu.z80XL;
8535                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8536                                 cpu.z80F |= bPostORFlags[cpu.z80A];
8537
8538                                 InvalidInstruction(2);
8539                         break;
8540                 }
8541                 case 0xb6:
8542                 {
8543                         sdwCyclesRemaining -= 19;
8544                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
8545                                 dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
8546                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
8547                                 while (psMemRead->lowAddr != 0xffffffff)
8548                                 {
8549                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
8550                                         {
8551                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8552                                                 if (psMemRead->memoryCall)
8553                                                 {
8554                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
8555                                                 }
8556                                                 else
8557                                                 {
8558                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
8559                                                 }
8560                                                 psMemRead = NULL;
8561                                                 break;
8562                                         }
8563                                         ++psMemRead;
8564                                 }
8565
8566                                 if (psMemRead)
8567                                 {
8568                                         bTemp = cpu.z80Base[dwAddr];
8569                                 }
8570
8571                                 cpu.z80A |= bTemp;
8572                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8573                                 cpu.z80F |= bPostORFlags[cpu.z80A];
8574
8575                         break;
8576                 }
8577                 case 0xb7:
8578                 {
8579                                 InvalidInstruction(2);
8580                         break;
8581                 }
8582                 case 0xb8:
8583                 {
8584                                 InvalidInstruction(2);
8585                         break;
8586                 }
8587                 case 0xb9:
8588                 {
8589                                 InvalidInstruction(2);
8590                         break;
8591                 }
8592                 case 0xba:
8593                 {
8594                                 InvalidInstruction(2);
8595                         break;
8596                 }
8597                 case 0xbb:
8598                 {
8599                                 InvalidInstruction(2);
8600                         break;
8601                 }
8602                 case 0xbc:
8603                 {
8604                         sdwCyclesRemaining -= 9;
8605                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8606                                 cpu.z80F |= bPostORFlags[cpu.z80A];
8607
8608                                 InvalidInstruction(2);
8609                         break;
8610                 }
8611                 case 0xbd:
8612                 {
8613                         sdwCyclesRemaining -= 9;
8614                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8615                                 cpu.z80F |= bPostORFlags[cpu.z80A];
8616
8617                                 InvalidInstruction(2);
8618                         break;
8619                 }
8620                 case 0xbe:
8621                 {
8622                         sdwCyclesRemaining -= 19;
8623                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
8624                                 dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
8625                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
8626                                 while (psMemRead->lowAddr != 0xffffffff)
8627                                 {
8628                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
8629                                         {
8630                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8631                                                 if (psMemRead->memoryCall)
8632                                                 {
8633                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
8634                                                 }
8635                                                 else
8636                                                 {
8637                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
8638                                                 }
8639                                                 psMemRead = NULL;
8640                                                 break;
8641                                         }
8642                                         ++psMemRead;
8643                                 }
8644
8645                                 if (psMemRead)
8646                                 {
8647                                         bTemp = cpu.z80Base[dwAddr];
8648                                 }
8649
8650                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
8651                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8652                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
8653                         break;
8654                 }
8655                 case 0xbf:
8656                 {
8657                                 InvalidInstruction(2);
8658                         break;
8659                 }
8660                 case 0xc0:
8661                 {
8662                                 InvalidInstruction(2);
8663                         break;
8664                 }
8665                 case 0xc1:
8666                 {
8667                                 InvalidInstruction(2);
8668                         break;
8669                 }
8670                 case 0xc2:
8671                 {
8672                                 InvalidInstruction(2);
8673                         break;
8674                 }
8675                 case 0xc3:
8676                 {
8677                                 InvalidInstruction(2);
8678                         break;
8679                 }
8680                 case 0xc4:
8681                 {
8682                                 InvalidInstruction(2);
8683                         break;
8684                 }
8685                 case 0xc5:
8686                 {
8687                                 InvalidInstruction(2);
8688                         break;
8689                 }
8690                 case 0xc6:
8691                 {
8692                                 InvalidInstruction(2);
8693                         break;
8694                 }
8695                 case 0xc7:
8696                 {
8697                                 InvalidInstruction(2);
8698                         break;
8699                 }
8700                 case 0xc8:
8701                 {
8702                                 InvalidInstruction(2);
8703                         break;
8704                 }
8705                 case 0xc9:
8706                 {
8707                                 InvalidInstruction(2);
8708                         break;
8709                 }
8710                 case 0xca:
8711                 {
8712                                 InvalidInstruction(2);
8713                         break;
8714                 }
8715                 case 0xcb:
8716                 {
8717                                 DDFDCBHandler(0);
8718                         break;
8719                 }
8720                 case 0xcc:
8721                 {
8722                                 InvalidInstruction(2);
8723                         break;
8724                 }
8725                 case 0xcd:
8726                 {
8727                                 InvalidInstruction(2);
8728                         break;
8729                 }
8730                 case 0xce:
8731                 {
8732                                 InvalidInstruction(2);
8733                         break;
8734                 }
8735                 case 0xcf:
8736                 {
8737                                 InvalidInstruction(2);
8738                         break;
8739                 }
8740                 case 0xd0:
8741                 {
8742                                 InvalidInstruction(2);
8743                         break;
8744                 }
8745                 case 0xd1:
8746                 {
8747                                 InvalidInstruction(2);
8748                         break;
8749                 }
8750                 case 0xd2:
8751                 {
8752                                 InvalidInstruction(2);
8753                         break;
8754                 }
8755                 case 0xd3:
8756                 {
8757                                 InvalidInstruction(2);
8758                         break;
8759                 }
8760                 case 0xd4:
8761                 {
8762                                 InvalidInstruction(2);
8763                         break;
8764                 }
8765                 case 0xd5:
8766                 {
8767                                 InvalidInstruction(2);
8768                         break;
8769                 }
8770                 case 0xd6:
8771                 {
8772                                 InvalidInstruction(2);
8773                         break;
8774                 }
8775                 case 0xd7:
8776                 {
8777                                 InvalidInstruction(2);
8778                         break;
8779                 }
8780                 case 0xd8:
8781                 {
8782                                 InvalidInstruction(2);
8783                         break;
8784                 }
8785                 case 0xd9:
8786                 {
8787                                 InvalidInstruction(2);
8788                         break;
8789                 }
8790                 case 0xda:
8791                 {
8792                                 InvalidInstruction(2);
8793                         break;
8794                 }
8795                 case 0xdb:
8796                 {
8797                                 InvalidInstruction(2);
8798                         break;
8799                 }
8800                 case 0xdc:
8801                 {
8802                                 InvalidInstruction(2);
8803                         break;
8804                 }
8805                 case 0xdd:
8806                 {
8807                                 InvalidInstruction(2);
8808                         break;
8809                 }
8810                 case 0xde:
8811                 {
8812                                 InvalidInstruction(2);
8813                         break;
8814                 }
8815                 case 0xdf:
8816                 {
8817                                 InvalidInstruction(2);
8818                         break;
8819                 }
8820                 case 0xe0:
8821                 {
8822                                 InvalidInstruction(2);
8823                         break;
8824                 }
8825                 case 0xe1:
8826                 {
8827                         sdwCyclesRemaining -= 14;
8828                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
8829                                 while (psMemRead->lowAddr != 0xffffffff)
8830                                 {
8831                                         if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
8832                                         {
8833                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8834                                                 if (psMemRead->memoryCall)
8835                                                 {
8836                                                         cpu.z80IX = psMemRead->memoryCall(cpu.z80sp, psMemRead);
8837                                                         cpu.z80IX |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
8838                                                 }
8839                                                 else
8840                                                 {
8841                                                         cpu.z80IX = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
8842                                                         cpu.z80IX |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
8843                                                 }
8844                                                 psMemRead = NULL;
8845                                                 break;
8846                                         }
8847                                         ++psMemRead;
8848                                 }
8849
8850                                 if (psMemRead)
8851                                 {
8852                                         cpu.z80IX = cpu.z80Base[cpu.z80sp];
8853                                         cpu.z80IX |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
8854                                 }
8855
8856                                         cpu.z80sp += 2;
8857                                         pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
8858                         break;
8859                 }
8860                 case 0xe2:
8861                 {
8862                                 InvalidInstruction(2);
8863                         break;
8864                 }
8865                 case 0xe3:
8866                 {
8867                         sdwCyclesRemaining -= 23;
8868                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
8869                                 while (psMemRead->lowAddr != 0xffffffff)
8870                                 {
8871                                         if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
8872                                         {
8873                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8874                                                 if (psMemRead->memoryCall)
8875                                                 {
8876                                                         dwAddr = psMemRead->memoryCall(cpu.z80sp, psMemRead);
8877                                                         dwAddr |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
8878                                                 }
8879                                                 else
8880                                                 {
8881                                                         dwAddr = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
8882                                                         dwAddr |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
8883                                                 }
8884                                                 psMemRead = NULL;
8885                                                 break;
8886                                         }
8887                                         ++psMemRead;
8888                                 }
8889
8890                                 if (psMemRead)
8891                                 {
8892                                         dwAddr = cpu.z80Base[cpu.z80sp];
8893                                         dwAddr |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
8894                                 }
8895
8896                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
8897                                 while (psMemWrite->lowAddr != 0xffffffff)
8898                                 {
8899                                         if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
8900                                         {
8901                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8902                                                 if (psMemWrite->memoryCall)
8903                                                 {
8904                                                         psMemWrite->memoryCall(cpu.z80sp, (cpu.z80IX & 0xff), psMemWrite);
8905                                                         psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80IX >> 8), psMemWrite);
8906                                                 }
8907                                                 else
8908                                                 {
8909                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80IX;
8910                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80IX >> 8;
8911                                                 }
8912                                                 psMemWrite = NULL;
8913                                                 break;
8914                                         }
8915                                         ++psMemWrite;
8916                                 }
8917
8918                                 if (psMemWrite)
8919                                 {
8920                                         cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80IX;
8921                                         cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80IX >> 8);
8922                                 }
8923
8924                                 cpu.z80IX = dwAddr;
8925                         break;
8926                 }
8927                 case 0xe4:
8928                 {
8929                                 InvalidInstruction(2);
8930                         break;
8931                 }
8932                 case 0xe5:
8933                 {
8934                         sdwCyclesRemaining -= 15;
8935                                         cpu.z80sp -= 2;
8936                                         pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
8937                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
8938                                 while (psMemWrite->lowAddr != 0xffffffff)
8939                                 {
8940                                         if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
8941                                         {
8942                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8943                                                 if (psMemWrite->memoryCall)
8944                                                 {
8945                                                         psMemWrite->memoryCall(cpu.z80sp, (cpu.z80IX & 0xff), psMemWrite);
8946                                                         psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80IX >> 8), psMemWrite);
8947                                                 }
8948                                                 else
8949                                                 {
8950                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80IX;
8951                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80IX >> 8;
8952                                                 }
8953                                                 psMemWrite = NULL;
8954                                                 break;
8955                                         }
8956                                         ++psMemWrite;
8957                                 }
8958
8959                                 if (psMemWrite)
8960                                 {
8961                                         cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80IX;
8962                                         cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80IX >> 8);
8963                                 }
8964
8965                         break;
8966                 }
8967                 case 0xe6:
8968                 {
8969                                 InvalidInstruction(2);
8970                         break;
8971                 }
8972                 case 0xe7:
8973                 {
8974                                 InvalidInstruction(2);
8975                         break;
8976                 }
8977                 case 0xe8:
8978                 {
8979                                 InvalidInstruction(2);
8980                         break;
8981                 }
8982                 case 0xe9:
8983                 {
8984                         sdwCyclesRemaining -= 8;
8985                                 pbPC = cpu.z80Base + cpu.z80IX;
8986                         break;
8987                 }
8988                 case 0xea:
8989                 {
8990                                 InvalidInstruction(2);
8991                         break;
8992                 }
8993                 case 0xeb:
8994                 {
8995                                 InvalidInstruction(2);
8996                         break;
8997                 }
8998                 case 0xec:
8999                 {
9000                                 InvalidInstruction(2);
9001                         break;
9002                 }
9003                 case 0xed:
9004                 {
9005                                 InvalidInstruction(2);
9006                         break;
9007                 }
9008                 case 0xee:
9009                 {
9010                                 InvalidInstruction(2);
9011                         break;
9012                 }
9013                 case 0xef:
9014                 {
9015                                 InvalidInstruction(2);
9016                         break;
9017                 }
9018                 case 0xf0:
9019                 {
9020                                 InvalidInstruction(2);
9021                         break;
9022                 }
9023                 case 0xf1:
9024                 {
9025                                 InvalidInstruction(2);
9026                         break;
9027                 }
9028                 case 0xf2:
9029                 {
9030                                 InvalidInstruction(2);
9031                         break;
9032                 }
9033                 case 0xf3:
9034                 {
9035                                 InvalidInstruction(2);
9036                         break;
9037                 }
9038                 case 0xf4:
9039                 {
9040                                 InvalidInstruction(2);
9041                         break;
9042                 }
9043                 case 0xf5:
9044                 {
9045                                 InvalidInstruction(2);
9046                         break;
9047                 }
9048                 case 0xf6:
9049                 {
9050                                 InvalidInstruction(2);
9051                         break;
9052                 }
9053                 case 0xf7:
9054                 {
9055                                 InvalidInstruction(2);
9056                         break;
9057                 }
9058                 case 0xf8:
9059                 {
9060                                 InvalidInstruction(2);
9061                         break;
9062                 }
9063                 case 0xf9:
9064                 {
9065                         sdwCyclesRemaining -= 10;
9066                                 cpu.z80sp = cpu.z80IX;
9067                         break;
9068                 }
9069                 case 0xfa:
9070                 {
9071                                 InvalidInstruction(2);
9072                         break;
9073                 }
9074                 case 0xfb:
9075                 {
9076                                 InvalidInstruction(2);
9077                         break;
9078                 }
9079                 case 0xfc:
9080                 {
9081                                 InvalidInstruction(2);
9082                         break;
9083                 }
9084                 case 0xfd:
9085                 {
9086                                 InvalidInstruction(2);
9087                         break;
9088                 }
9089                 case 0xfe:
9090                 {
9091                                 InvalidInstruction(2);
9092                         break;
9093                 }
9094                 case 0xff:
9095                 {
9096                                 InvalidInstruction(2);
9097                         break;
9098                 }
9099         }
9100 }
9101 void DDFDCBHandler(UINT32 dwWhich)
9102 {
9103         if (dwWhich)
9104         {
9105                 dwAddr = (UINT32) ((INT32) cpu.z80IY + ((INT32) *pbPC++)) & 0xffff;
9106         }
9107         else
9108         {
9109                 dwAddr = (UINT32) ((INT32) cpu.z80IX + ((INT32) *pbPC++)) & 0xffff;
9110         }
9111
9112                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
9113                                 while (psMemRead->lowAddr != 0xffffffff)
9114                                 {
9115                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
9116                                         {
9117                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
9118                                                 if (psMemRead->memoryCall)
9119                                                 {
9120                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
9121                                                 }
9122                                                 else
9123                                                 {
9124                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
9125                                                 }
9126                                                 psMemRead = NULL;
9127                                                 break;
9128                                         }
9129                                         ++psMemRead;
9130                                 }
9131
9132                                 if (psMemRead)
9133                                 {
9134                                         bTemp = cpu.z80Base[dwAddr];
9135                                 }
9136
9137         switch (*pbPC++)
9138         {
9139                 case 0x00:
9140                 {
9141                                 InvalidInstruction(4);
9142                         break;
9143                 }
9144                 case 0x01:
9145                 {
9146                                 InvalidInstruction(4);
9147                         break;
9148                 }
9149                 case 0x02:
9150                 {
9151                                 InvalidInstruction(4);
9152                         break;
9153                 }
9154                 case 0x03:
9155                 {
9156                                 InvalidInstruction(4);
9157                         break;
9158                 }
9159                 case 0x04:
9160                 {
9161                                 InvalidInstruction(4);
9162                         break;
9163                 }
9164                 case 0x05:
9165                 {
9166                                 InvalidInstruction(4);
9167                         break;
9168                 }
9169                 case 0x06:
9170                 {
9171                         sdwCyclesRemaining -= 23;
9172                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
9173                                 bTemp2 = (bTemp >> 7);
9174                                 bTemp = (bTemp << 1) | bTemp2;
9175                                 cpu.z80F |= bTemp2 | bPostORFlags[bTemp];
9176                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
9177                                 while (psMemWrite->lowAddr != 0xffffffff)
9178                                 {
9179                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
9180                                         {
9181                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
9182                                                 if (psMemWrite->memoryCall)
9183                                                 {
9184                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
9185                                                 }
9186                                                 else
9187                                                 {
9188                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
9189                                                 }
9190                                                 psMemWrite = NULL;
9191                                                 break;
9192                                         }
9193                                         ++psMemWrite;
9194                                 }
9195
9196                                 if (psMemWrite)
9197                                 {
9198                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
9199                                 }
9200
9201                         break;
9202                 }
9203                 case 0x07:
9204                 {
9205                                 InvalidInstruction(4);
9206                         break;
9207                 }
9208                 case 0x08:
9209                 {
9210                                 InvalidInstruction(4);
9211                         break;
9212                 }
9213                 case 0x09:
9214                 {
9215                                 InvalidInstruction(4);
9216                         break;
9217                 }
9218                 case 0x0a:
9219                 {
9220                                 InvalidInstruction(4);
9221                         break;
9222                 }
9223                 case 0x0b:
9224                 {
9225                                 InvalidInstruction(4);
9226                         break;
9227                 }
9228                 case 0x0c:
9229                 {
9230                                 InvalidInstruction(4);
9231                         break;
9232                 }
9233                 case 0x0d:
9234                 {
9235                                 InvalidInstruction(4);
9236                         break;
9237                 }
9238                 case 0x0e:
9239                 {
9240                         sdwCyclesRemaining -= 23;
9241                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
9242                                 cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
9243                                 bTemp = (bTemp >> 1) | (bTemp << 7);
9244                                 cpu.z80F |= bPostORFlags[bTemp];
9245                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
9246                                 while (psMemWrite->lowAddr != 0xffffffff)
9247                                 {
9248                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
9249                                         {
9250                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
9251                                                 if (psMemWrite->memoryCall)
9252                                                 {
9253                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
9254                                                 }
9255                                                 else
9256                                                 {
9257                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
9258                                                 }
9259                                                 psMemWrite = NULL;
9260                                                 break;
9261                                         }
9262                                         ++psMemWrite;
9263                                 }
9264
9265                                 if (psMemWrite)
9266                                 {
9267                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
9268                                 }
9269
9270                         break;
9271                 }
9272                 case 0x0f:
9273                 {
9274                                 InvalidInstruction(4);
9275                         break;
9276                 }
9277                 case 0x10:
9278                 {
9279                                 InvalidInstruction(4);
9280                         break;
9281                 }
9282                 case 0x11:
9283                 {
9284                                 InvalidInstruction(4);
9285                         break;
9286                 }
9287                 case 0x12:
9288                 {
9289                                 InvalidInstruction(4);
9290                         break;
9291                 }
9292                 case 0x13:
9293                 {
9294                                 InvalidInstruction(4);
9295                         break;
9296                 }
9297                 case 0x14:
9298                 {
9299                                 InvalidInstruction(4);
9300                         break;
9301                 }
9302                 case 0x15:
9303                 {
9304                                 InvalidInstruction(4);
9305                         break;
9306                 }
9307                 case 0x16:
9308                 {
9309                         sdwCyclesRemaining -= 23;
9310                                 bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
9311                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
9312                                 cpu.z80F |= (bTemp >> 7);
9313                                 bTemp = (bTemp << 1) | bTemp2;
9314                                 cpu.z80F |= bPostORFlags[bTemp];
9315                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
9316                                 while (psMemWrite->lowAddr != 0xffffffff)
9317                                 {
9318                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
9319                                         {
9320                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
9321                                                 if (psMemWrite->memoryCall)
9322                                                 {
9323                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
9324                                                 }
9325                                                 else
9326                                                 {
9327                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
9328                                                 }
9329                                                 psMemWrite = NULL;
9330                                                 break;
9331                                         }
9332                                         ++psMemWrite;
9333                                 }
9334
9335                                 if (psMemWrite)
9336                                 {
9337                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
9338                                 }
9339
9340                         break;
9341                 }
9342                 case 0x17:
9343                 {
9344                                 InvalidInstruction(4);
9345                         break;
9346                 }
9347                 case 0x18:
9348                 {
9349                                 InvalidInstruction(4);
9350                         break;
9351                 }
9352                 case 0x19:
9353                 {
9354                                 InvalidInstruction(4);
9355                         break;
9356                 }
9357                 case 0x1a:
9358                 {
9359                                 InvalidInstruction(4);
9360                         break;
9361                 }
9362                 case 0x1b:
9363                 {
9364                                 InvalidInstruction(4);
9365                         break;
9366                 }
9367                 case 0x1c:
9368                 {
9369                                 InvalidInstruction(4);
9370                         break;
9371                 }
9372                 case 0x1d:
9373                 {
9374                                 InvalidInstruction(4);
9375                         break;
9376                 }
9377                 case 0x1e:
9378                 {
9379                         sdwCyclesRemaining -= 23;
9380                                 bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
9381                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
9382                                 cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
9383                                 bTemp = (bTemp >> 1) | bTemp2;
9384                                 cpu.z80F |= bPostORFlags[bTemp];
9385                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
9386                                 while (psMemWrite->lowAddr != 0xffffffff)
9387                                 {
9388                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
9389                                         {
9390                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
9391                                                 if (psMemWrite->memoryCall)
9392                                                 {
9393                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
9394                                                 }
9395                                                 else
9396                                                 {
9397                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
9398                                                 }
9399                                                 psMemWrite = NULL;
9400                                                 break;
9401                                         }
9402                                         ++psMemWrite;
9403                                 }
9404
9405                                 if (psMemWrite)
9406                                 {
9407                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
9408                                 }
9409
9410                         break;
9411                 }
9412                 case 0x1f:
9413                 {
9414                                 InvalidInstruction(4);
9415                         break;
9416                 }
9417                 case 0x20:
9418                 {
9419                                 InvalidInstruction(4);
9420                         break;
9421                 }
9422                 case 0x21:
9423                 {
9424                                 InvalidInstruction(4);
9425                         break;
9426                 }
9427                 case 0x22:
9428                 {
9429                                 InvalidInstruction(4);
9430                         break;
9431                 }
9432                 case 0x23:
9433                 {
9434                                 InvalidInstruction(4);
9435                         break;
9436                 }
9437                 case 0x24:
9438                 {
9439                                 InvalidInstruction(4);
9440                         break;
9441                 }
9442                 case 0x25:
9443                 {
9444                                 InvalidInstruction(4);
9445                         break;
9446                 }
9447                 case 0x26:
9448                 {
9449                         sdwCyclesRemaining -= 23;
9450                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
9451                                 cpu.z80F |= (bTemp >> 7);
9452                                 bTemp = (bTemp << 1);
9453                                 cpu.z80F |= bPostORFlags[bTemp];
9454                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
9455                                 while (psMemWrite->lowAddr != 0xffffffff)
9456                                 {
9457                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
9458                                         {
9459                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
9460                                                 if (psMemWrite->memoryCall)
9461                                                 {
9462                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
9463                                                 }
9464                                                 else
9465                                                 {
9466                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
9467                                                 }
9468                                                 psMemWrite = NULL;
9469                                                 break;
9470                                         }
9471                                         ++psMemWrite;
9472                                 }
9473
9474                                 if (psMemWrite)
9475                                 {
9476                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
9477                                 }
9478
9479                         break;
9480                 }
9481                 case 0x27:
9482                 {
9483                                 InvalidInstruction(4);
9484                         break;
9485                 }
9486                 case 0x28:
9487                 {
9488                                 InvalidInstruction(4);
9489                         break;
9490                 }
9491                 case 0x29:
9492                 {
9493                                 InvalidInstruction(4);
9494                         break;
9495                 }
9496                 case 0x2a:
9497                 {
9498                                 InvalidInstruction(4);
9499                         break;
9500                 }
9501                 case 0x2b:
9502                 {
9503                                 InvalidInstruction(4);
9504                         break;
9505                 }
9506                 case 0x2c:
9507                 {
9508                                 InvalidInstruction(4);
9509                         break;
9510                 }
9511                 case 0x2d:
9512                 {
9513                                 InvalidInstruction(4);
9514                         break;
9515                 }
9516                 case 0x2e:
9517                 {
9518                         sdwCyclesRemaining -= 23;
9519                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
9520                                 cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
9521                                 bTemp = (bTemp >> 1) | (bTemp & 0x80);
9522                                 cpu.z80F |= bPostORFlags[bTemp];
9523                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
9524                                 while (psMemWrite->lowAddr != 0xffffffff)
9525                                 {
9526                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
9527                                         {
9528                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
9529                                                 if (psMemWrite->memoryCall)
9530                                                 {
9531                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
9532                                                 }
9533                                                 else
9534                                                 {
9535                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
9536                                                 }
9537                                                 psMemWrite = NULL;
9538                                                 break;
9539                                         }
9540                                         ++psMemWrite;
9541                                 }
9542
9543                                 if (psMemWrite)
9544                                 {
9545                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
9546                                 }
9547
9548                         break;
9549                 }
9550                 case 0x2f:
9551                 {
9552                                 InvalidInstruction(4);
9553                         break;
9554                 }
9555                 case 0x30:
9556                 {
9557                                 InvalidInstruction(4);
9558                         break;
9559                 }
9560                 case 0x31:
9561                 {
9562                                 InvalidInstruction(4);
9563                         break;
9564                 }
9565                 case 0x32:
9566                 {
9567                                 InvalidInstruction(4);
9568                         break;
9569                 }
9570                 case 0x33:
9571                 {
9572                                 InvalidInstruction(4);
9573                         break;
9574                 }
9575                 case 0x34:
9576                 {
9577                                 InvalidInstruction(4);
9578                         break;
9579                 }
9580                 case 0x35:
9581                 {
9582                                 InvalidInstruction(4);
9583                         break;
9584                 }
9585                 case 0x36:
9586                 {
9587                         sdwCyclesRemaining -= 23;
9588                                 InvalidInstruction(4);
9589                         break;
9590                 }
9591                 case 0x37:
9592                 {
9593                                 InvalidInstruction(4);
9594                         break;
9595                 }
9596                 case 0x38:
9597                 {
9598                                 InvalidInstruction(4);
9599                         break;
9600                 }
9601                 case 0x39:
9602                 {
9603                                 InvalidInstruction(4);
9604                         break;
9605                 }
9606                 case 0x3a:
9607                 {
9608                                 InvalidInstruction(4);
9609                         break;
9610                 }
9611                 case 0x3b:
9612                 {
9613                                 InvalidInstruction(4);
9614                         break;
9615                 }
9616                 case 0x3c:
9617                 {
9618                                 InvalidInstruction(4);
9619                         break;
9620                 }
9621                 case 0x3d:
9622                 {
9623                                 InvalidInstruction(4);
9624                         break;
9625                 }
9626                 case 0x3e:
9627                 {
9628                         sdwCyclesRemaining -= 23;
9629                                 cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
9630                                 cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
9631                                 bTemp = (bTemp >> 1);
9632                                 cpu.z80F |= bPostORFlags[bTemp];
9633                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
9634                                 while (psMemWrite->lowAddr != 0xffffffff)
9635                                 {
9636                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
9637                                         {
9638                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
9639                                                 if (psMemWrite->memoryCall)
9640                                                 {
9641                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
9642                                                 }
9643                                                 else
9644                                                 {
9645                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
9646                                                 }
9647                                                 psMemWrite = NULL;
9648                                                 break;
9649                                         }
9650                                         ++psMemWrite;
9651                                 }
9652
9653                                 if (psMemWrite)
9654                                 {
9655                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
9656                                 }
9657
9658                         break;
9659                 }
9660                 case 0x3f:
9661                 {
9662                                 InvalidInstruction(4);
9663                         break;
9664                 }
9665                 case 0x40:
9666                 {
9667                         sdwCyclesRemaining -= 20;
9668                                 InvalidInstruction(4);
9669                         break;
9670                 }
9671                 case 0x41:
9672                 {
9673                         sdwCyclesRemaining -= 20;
9674                                 InvalidInstruction(4);
9675                         break;
9676                 }
9677                 case 0x42:
9678                 {
9679                         sdwCyclesRemaining -= 20;
9680                                 InvalidInstruction(4);
9681                         break;
9682                 }
9683                 case 0x43:
9684                 {
9685                         sdwCyclesRemaining -= 20;
9686                                 InvalidInstruction(4);
9687                         break;
9688                 }
9689                 case 0x44:
9690                 {
9691                         sdwCyclesRemaining -= 20;
9692                                 InvalidInstruction(4);
9693                         break;
9694                 }
9695                 case 0x45:
9696                 {
9697                         sdwCyclesRemaining -= 20;
9698                                 InvalidInstruction(4);
9699                         break;
9700                 }
9701                 case 0x46:
9702                 {
9703                         sdwCyclesRemaining -= 20;
9704                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
9705                                 if (!(bTemp & 0x01))
9706                                 {
9707                                         cpu.z80F |= Z80_FLAG_ZERO;
9708                                 }
9709                         break;
9710                 }
9711                 case 0x47:
9712                 {
9713                         sdwCyclesRemaining -= 20;
9714                                 InvalidInstruction(4);
9715                         break;
9716                 }
9717                 case 0x48:
9718                 {
9719                         sdwCyclesRemaining -= 20;
9720                                 InvalidInstruction(4);
9721                         break;
9722                 }
9723                 case 0x49:
9724                 {
9725                         sdwCyclesRemaining -= 20;
9726                                 InvalidInstruction(4);
9727                         break;
9728                 }
9729                 case 0x4a:
9730                 {
9731                         sdwCyclesRemaining -= 20;
9732                                 InvalidInstruction(4);
9733                         break;
9734                 }
9735                 case 0x4b:
9736                 {
9737                         sdwCyclesRemaining -= 20;
9738                                 InvalidInstruction(4);
9739                         break;
9740                 }
9741                 case 0x4c:
9742                 {
9743                         sdwCyclesRemaining -= 20;
9744                                 InvalidInstruction(4);
9745                         break;
9746                 }
9747                 case 0x4d:
9748                 {
9749                         sdwCyclesRemaining -= 20;
9750                                 InvalidInstruction(4);
9751                         break;
9752                 }
9753                 case 0x4e:
9754                 {
9755                         sdwCyclesRemaining -= 20;
9756                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
9757                                 if (!(bTemp & 0x02))
9758                                 {
9759                                         cpu.z80F |= Z80_FLAG_ZERO;
9760                                 }
9761                         break;
9762                 }
9763                 case 0x4f:
9764                 {
9765                         sdwCyclesRemaining -= 20;
9766                                 InvalidInstruction(4);
9767                         break;
9768                 }
9769                 case 0x50:
9770                 {
9771                         sdwCyclesRemaining -= 20;
9772                                 InvalidInstruction(4);
9773                         break;
9774                 }
9775                 case 0x51:
9776                 {
9777                         sdwCyclesRemaining -= 20;
9778                                 InvalidInstruction(4);
9779                         break;
9780                 }
9781                 case 0x52:
9782                 {
9783                         sdwCyclesRemaining -= 20;
9784                                 InvalidInstruction(4);
9785                         break;
9786                 }
9787                 case 0x53:
9788                 {
9789                         sdwCyclesRemaining -= 20;
9790                                 InvalidInstruction(4);
9791                         break;
9792                 }
9793                 case 0x54:
9794                 {
9795                         sdwCyclesRemaining -= 20;
9796                                 InvalidInstruction(4);
9797                         break;
9798                 }
9799                 case 0x55:
9800                 {
9801                         sdwCyclesRemaining -= 20;
9802                                 InvalidInstruction(4);
9803                         break;
9804                 }
9805                 case 0x56:
9806                 {
9807                         sdwCyclesRemaining -= 20;
9808                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
9809                                 if (!(bTemp & 0x04))
9810                                 {
9811                                         cpu.z80F |= Z80_FLAG_ZERO;
9812                                 }
9813                         break;
9814                 }
9815                 case 0x57:
9816                 {
9817                         sdwCyclesRemaining -= 20;
9818                                 InvalidInstruction(4);
9819                         break;
9820                 }
9821                 case 0x58:
9822                 {
9823                         sdwCyclesRemaining -= 20;
9824                                 InvalidInstruction(4);
9825                         break;
9826                 }
9827                 case 0x59:
9828                 {
9829                         sdwCyclesRemaining -= 20;
9830                                 InvalidInstruction(4);
9831                         break;
9832                 }
9833                 case 0x5a:
9834                 {
9835                         sdwCyclesRemaining -= 20;
9836                                 InvalidInstruction(4);
9837                         break;
9838                 }
9839                 case 0x5b:
9840                 {
9841                         sdwCyclesRemaining -= 20;
9842                                 InvalidInstruction(4);
9843                         break;
9844                 }
9845                 case 0x5c:
9846                 {
9847                         sdwCyclesRemaining -= 20;
9848                                 InvalidInstruction(4);
9849                         break;
9850                 }
9851                 case 0x5d:
9852                 {
9853                         sdwCyclesRemaining -= 20;
9854                                 InvalidInstruction(4);
9855                         break;
9856                 }
9857                 case 0x5e:
9858                 {
9859                         sdwCyclesRemaining -= 20;
9860                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
9861                                 if (!(bTemp & 0x08))
9862                                 {
9863                                         cpu.z80F |= Z80_FLAG_ZERO;
9864                                 }
9865                         break;
9866                 }
9867                 case 0x5f:
9868                 {
9869                         sdwCyclesRemaining -= 20;
9870                                 InvalidInstruction(4);
9871                         break;
9872                 }
9873                 case 0x60:
9874                 {
9875                         sdwCyclesRemaining -= 20;
9876                                 InvalidInstruction(4);
9877                         break;
9878                 }
9879                 case 0x61:
9880                 {
9881                         sdwCyclesRemaining -= 20;
9882                                 InvalidInstruction(4);
9883                         break;
9884                 }
9885                 case 0x62:
9886                 {
9887                         sdwCyclesRemaining -= 20;
9888                                 InvalidInstruction(4);
9889                         break;
9890                 }
9891                 case 0x63:
9892                 {
9893                         sdwCyclesRemaining -= 20;
9894                                 InvalidInstruction(4);
9895                         break;
9896                 }
9897                 case 0x64:
9898                 {
9899                         sdwCyclesRemaining -= 20;
9900                                 InvalidInstruction(4);
9901                         break;
9902                 }
9903                 case 0x65:
9904                 {
9905                         sdwCyclesRemaining -= 20;
9906                                 InvalidInstruction(4);
9907                         break;
9908                 }
9909                 case 0x66:
9910                 {
9911                         sdwCyclesRemaining -= 20;
9912                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
9913                                 if (!(bTemp & 0x10))
9914                                 {
9915                                         cpu.z80F |= Z80_FLAG_ZERO;
9916                                 }
9917                         break;
9918                 }
9919                 case 0x67:
9920                 {
9921                         sdwCyclesRemaining -= 20;
9922                                 InvalidInstruction(4);
9923                         break;
9924                 }
9925                 case 0x68:
9926                 {
9927                         sdwCyclesRemaining -= 20;
9928                                 InvalidInstruction(4);
9929                         break;
9930                 }
9931                 case 0x69:
9932                 {
9933                         sdwCyclesRemaining -= 20;
9934                                 InvalidInstruction(4);
9935                         break;
9936                 }
9937                 case 0x6a:
9938                 {
9939                         sdwCyclesRemaining -= 20;
9940                                 InvalidInstruction(4);
9941                         break;
9942                 }
9943                 case 0x6b:
9944                 {
9945                         sdwCyclesRemaining -= 20;
9946                                 InvalidInstruction(4);
9947                         break;
9948                 }
9949                 case 0x6c:
9950                 {
9951                         sdwCyclesRemaining -= 20;
9952                                 InvalidInstruction(4);
9953                         break;
9954                 }
9955                 case 0x6d:
9956                 {
9957                         sdwCyclesRemaining -= 20;
9958                                 InvalidInstruction(4);
9959                         break;
9960                 }
9961                 case 0x6e:
9962                 {
9963                         sdwCyclesRemaining -= 20;
9964                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
9965                                 if (!(bTemp & 0x20))
9966                                 {
9967                                         cpu.z80F |= Z80_FLAG_ZERO;
9968                                 }
9969                         break;
9970                 }
9971                 case 0x6f:
9972                 {
9973                         sdwCyclesRemaining -= 20;
9974                                 InvalidInstruction(4);
9975                         break;
9976                 }
9977                 case 0x70:
9978                 {
9979                         sdwCyclesRemaining -= 20;
9980                                 InvalidInstruction(4);
9981                         break;
9982                 }
9983                 case 0x71:
9984                 {
9985                         sdwCyclesRemaining -= 20;
9986                                 InvalidInstruction(4);
9987                         break;
9988                 }
9989                 case 0x72:
9990                 {
9991                         sdwCyclesRemaining -= 20;
9992                                 InvalidInstruction(4);
9993                         break;
9994                 }
9995                 case 0x73:
9996                 {
9997                         sdwCyclesRemaining -= 20;
9998                                 InvalidInstruction(4);
9999                         break;
10000                 }
10001                 case 0x74:
10002                 {
10003                         sdwCyclesRemaining -= 20;
10004                                 InvalidInstruction(4);
10005                         break;
10006                 }
10007                 case 0x75:
10008                 {
10009                         sdwCyclesRemaining -= 20;
10010                                 InvalidInstruction(4);
10011                         break;
10012                 }
10013                 case 0x76:
10014                 {
10015                         sdwCyclesRemaining -= 20;
10016                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
10017                                 if (!(bTemp & 0x40))
10018                                 {
10019                                         cpu.z80F |= Z80_FLAG_ZERO;
10020                                 }
10021                         break;
10022                 }
10023                 case 0x77:
10024                 {
10025                         sdwCyclesRemaining -= 20;
10026                                 InvalidInstruction(4);
10027                         break;
10028                 }
10029                 case 0x78:
10030                 {
10031                         sdwCyclesRemaining -= 20;
10032                                 InvalidInstruction(4);
10033                         break;
10034                 }
10035                 case 0x79:
10036                 {
10037                         sdwCyclesRemaining -= 20;
10038                                 InvalidInstruction(4);
10039                         break;
10040                 }
10041                 case 0x7a:
10042                 {
10043                         sdwCyclesRemaining -= 20;
10044                                 InvalidInstruction(4);
10045                         break;
10046                 }
10047                 case 0x7b:
10048                 {
10049                         sdwCyclesRemaining -= 20;
10050                                 InvalidInstruction(4);
10051                         break;
10052                 }
10053                 case 0x7c:
10054                 {
10055                         sdwCyclesRemaining -= 20;
10056                                 InvalidInstruction(4);
10057                         break;
10058                 }
10059                 case 0x7d:
10060                 {
10061                         sdwCyclesRemaining -= 20;
10062                                 InvalidInstruction(4);
10063                         break;
10064                 }
10065                 case 0x7e:
10066                 {
10067                         sdwCyclesRemaining -= 20;
10068                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
10069                                 if (!(bTemp & 0x80))
10070                                 {
10071                                         cpu.z80F |= Z80_FLAG_ZERO;
10072                                 }
10073                         break;
10074                 }
10075                 case 0x7f:
10076                 {
10077                         sdwCyclesRemaining -= 20;
10078                                 InvalidInstruction(4);
10079                         break;
10080                 }
10081                 case 0x80:
10082                 {
10083                                 InvalidInstruction(4);
10084                         break;
10085                 }
10086                 case 0x81:
10087                 {
10088                                 InvalidInstruction(4);
10089                         break;
10090                 }
10091                 case 0x82:
10092                 {
10093                                 InvalidInstruction(4);
10094                         break;
10095                 }
10096                 case 0x83:
10097                 {
10098                                 InvalidInstruction(4);
10099                         break;
10100                 }
10101                 case 0x84:
10102                 {
10103                                 InvalidInstruction(4);
10104                         break;
10105                 }
10106                 case 0x85:
10107                 {
10108                                 InvalidInstruction(4);
10109                         break;
10110                 }
10111                 case 0x86:
10112                 {
10113                         sdwCyclesRemaining -= 23;
10114                                 bTemp &= 0xfe;
10115                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
10116                                 while (psMemWrite->lowAddr != 0xffffffff)
10117                                 {
10118                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10119                                         {
10120                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10121                                                 if (psMemWrite->memoryCall)
10122                                                 {
10123                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10124                                                 }
10125                                                 else
10126                                                 {
10127                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10128                                                 }
10129                                                 psMemWrite = NULL;
10130                                                 break;
10131                                         }
10132                                         ++psMemWrite;
10133                                 }
10134
10135                                 if (psMemWrite)
10136                                 {
10137                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
10138                                 }
10139
10140                         break;
10141                 }
10142                 case 0x87:
10143                 {
10144                                 InvalidInstruction(4);
10145                         break;
10146                 }
10147                 case 0x88:
10148                 {
10149                                 InvalidInstruction(4);
10150                         break;
10151                 }
10152                 case 0x89:
10153                 {
10154                                 InvalidInstruction(4);
10155                         break;
10156                 }
10157                 case 0x8a:
10158                 {
10159                                 InvalidInstruction(4);
10160                         break;
10161                 }
10162                 case 0x8b:
10163                 {
10164                                 InvalidInstruction(4);
10165                         break;
10166                 }
10167                 case 0x8c:
10168                 {
10169                                 InvalidInstruction(4);
10170                         break;
10171                 }
10172                 case 0x8d:
10173                 {
10174                                 InvalidInstruction(4);
10175                         break;
10176                 }
10177                 case 0x8e:
10178                 {
10179                         sdwCyclesRemaining -= 23;
10180                                 bTemp &= 0xfd;
10181                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
10182                                 while (psMemWrite->lowAddr != 0xffffffff)
10183                                 {
10184                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10185                                         {
10186                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10187                                                 if (psMemWrite->memoryCall)
10188                                                 {
10189                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10190                                                 }
10191                                                 else
10192                                                 {
10193                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10194                                                 }
10195                                                 psMemWrite = NULL;
10196                                                 break;
10197                                         }
10198                                         ++psMemWrite;
10199                                 }
10200
10201                                 if (psMemWrite)
10202                                 {
10203                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
10204                                 }
10205
10206                         break;
10207                 }
10208                 case 0x8f:
10209                 {
10210                                 InvalidInstruction(4);
10211                         break;
10212                 }
10213                 case 0x90:
10214                 {
10215                                 InvalidInstruction(4);
10216                         break;
10217                 }
10218                 case 0x91:
10219                 {
10220                                 InvalidInstruction(4);
10221                         break;
10222                 }
10223                 case 0x92:
10224                 {
10225                                 InvalidInstruction(4);
10226                         break;
10227                 }
10228                 case 0x93:
10229                 {
10230                                 InvalidInstruction(4);
10231                         break;
10232                 }
10233                 case 0x94:
10234                 {
10235                                 InvalidInstruction(4);
10236                         break;
10237                 }
10238                 case 0x95:
10239                 {
10240                                 InvalidInstruction(4);
10241                         break;
10242                 }
10243                 case 0x96:
10244                 {
10245                         sdwCyclesRemaining -= 23;
10246                                 bTemp &= 0xfb;
10247                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
10248                                 while (psMemWrite->lowAddr != 0xffffffff)
10249                                 {
10250                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10251                                         {
10252                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10253                                                 if (psMemWrite->memoryCall)
10254                                                 {
10255                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10256                                                 }
10257                                                 else
10258                                                 {
10259                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10260                                                 }
10261                                                 psMemWrite = NULL;
10262                                                 break;
10263                                         }
10264                                         ++psMemWrite;
10265                                 }
10266
10267                                 if (psMemWrite)
10268                                 {
10269                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
10270                                 }
10271
10272                         break;
10273                 }
10274                 case 0x97:
10275                 {
10276                                 InvalidInstruction(4);
10277                         break;
10278                 }
10279                 case 0x98:
10280                 {
10281                                 InvalidInstruction(4);
10282                         break;
10283                 }
10284                 case 0x99:
10285                 {
10286                                 InvalidInstruction(4);
10287                         break;
10288                 }
10289                 case 0x9a:
10290                 {
10291                                 InvalidInstruction(4);
10292                         break;
10293                 }
10294                 case 0x9b:
10295                 {
10296                                 InvalidInstruction(4);
10297                         break;
10298                 }
10299                 case 0x9c:
10300                 {
10301                                 InvalidInstruction(4);
10302                         break;
10303                 }
10304                 case 0x9d:
10305                 {
10306                                 InvalidInstruction(4);
10307                         break;
10308                 }
10309                 case 0x9e:
10310                 {
10311                         sdwCyclesRemaining -= 23;
10312                                 bTemp &= 0xf7;
10313                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
10314                                 while (psMemWrite->lowAddr != 0xffffffff)
10315                                 {
10316                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10317                                         {
10318                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10319                                                 if (psMemWrite->memoryCall)
10320                                                 {
10321                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10322                                                 }
10323                                                 else
10324                                                 {
10325                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10326                                                 }
10327                                                 psMemWrite = NULL;
10328                                                 break;
10329                                         }
10330                                         ++psMemWrite;
10331                                 }
10332
10333                                 if (psMemWrite)
10334                                 {
10335                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
10336                                 }
10337
10338                         break;
10339                 }
10340                 case 0x9f:
10341                 {
10342                                 InvalidInstruction(4);
10343                         break;
10344                 }
10345                 case 0xa0:
10346                 {
10347                                 InvalidInstruction(4);
10348                         break;
10349                 }
10350                 case 0xa1:
10351                 {
10352                                 InvalidInstruction(4);
10353                         break;
10354                 }
10355                 case 0xa2:
10356                 {
10357                                 InvalidInstruction(4);
10358                         break;
10359                 }
10360                 case 0xa3:
10361                 {
10362                                 InvalidInstruction(4);
10363                         break;
10364                 }
10365                 case 0xa4:
10366                 {
10367                                 InvalidInstruction(4);
10368                         break;
10369                 }
10370                 case 0xa5:
10371                 {
10372                                 InvalidInstruction(4);
10373                         break;
10374                 }
10375                 case 0xa6:
10376                 {
10377                         sdwCyclesRemaining -= 23;
10378                                 bTemp &= 0xef;
10379                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
10380                                 while (psMemWrite->lowAddr != 0xffffffff)
10381                                 {
10382                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10383                                         {
10384                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10385                                                 if (psMemWrite->memoryCall)
10386                                                 {
10387                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10388                                                 }
10389                                                 else
10390                                                 {
10391                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10392                                                 }
10393                                                 psMemWrite = NULL;
10394                                                 break;
10395                                         }
10396                                         ++psMemWrite;
10397                                 }
10398
10399                                 if (psMemWrite)
10400                                 {
10401                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
10402                                 }
10403
10404                         break;
10405                 }
10406                 case 0xa7:
10407                 {
10408                                 InvalidInstruction(4);
10409                         break;
10410                 }
10411                 case 0xa8:
10412                 {
10413                                 InvalidInstruction(4);
10414                         break;
10415                 }
10416                 case 0xa9:
10417                 {
10418                                 InvalidInstruction(4);
10419                         break;
10420                 }
10421                 case 0xaa:
10422                 {
10423                                 InvalidInstruction(4);
10424                         break;
10425                 }
10426                 case 0xab:
10427                 {
10428                                 InvalidInstruction(4);
10429                         break;
10430                 }
10431                 case 0xac:
10432                 {
10433                                 InvalidInstruction(4);
10434                         break;
10435                 }
10436                 case 0xad:
10437                 {
10438                                 InvalidInstruction(4);
10439                         break;
10440                 }
10441                 case 0xae:
10442                 {
10443                         sdwCyclesRemaining -= 23;
10444                                 bTemp &= 0xdf;
10445                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
10446                                 while (psMemWrite->lowAddr != 0xffffffff)
10447                                 {
10448                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10449                                         {
10450                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10451                                                 if (psMemWrite->memoryCall)
10452                                                 {
10453                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10454                                                 }
10455                                                 else
10456                                                 {
10457                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10458                                                 }
10459                                                 psMemWrite = NULL;
10460                                                 break;
10461                                         }
10462                                         ++psMemWrite;
10463                                 }
10464
10465                                 if (psMemWrite)
10466                                 {
10467                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
10468                                 }
10469
10470                         break;
10471                 }
10472                 case 0xaf:
10473                 {
10474                                 InvalidInstruction(4);
10475                         break;
10476                 }
10477                 case 0xb0:
10478                 {
10479                                 InvalidInstruction(4);
10480                         break;
10481                 }
10482                 case 0xb1:
10483                 {
10484                                 InvalidInstruction(4);
10485                         break;
10486                 }
10487                 case 0xb2:
10488                 {
10489                                 InvalidInstruction(4);
10490                         break;
10491                 }
10492                 case 0xb3:
10493                 {
10494                                 InvalidInstruction(4);
10495                         break;
10496                 }
10497                 case 0xb4:
10498                 {
10499                                 InvalidInstruction(4);
10500                         break;
10501                 }
10502                 case 0xb5:
10503                 {
10504                                 InvalidInstruction(4);
10505                         break;
10506                 }
10507                 case 0xb6:
10508                 {
10509                         sdwCyclesRemaining -= 23;
10510                                 bTemp &= 0xbf;
10511                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
10512                                 while (psMemWrite->lowAddr != 0xffffffff)
10513                                 {
10514                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10515                                         {
10516                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10517                                                 if (psMemWrite->memoryCall)
10518                                                 {
10519                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10520                                                 }
10521                                                 else
10522                                                 {
10523                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10524                                                 }
10525                                                 psMemWrite = NULL;
10526                                                 break;
10527                                         }
10528                                         ++psMemWrite;
10529                                 }
10530
10531                                 if (psMemWrite)
10532                                 {
10533                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
10534                                 }
10535
10536                         break;
10537                 }
10538                 case 0xb7:
10539                 {
10540                                 InvalidInstruction(4);
10541                         break;
10542                 }
10543                 case 0xb8:
10544                 {
10545                                 InvalidInstruction(4);
10546                         break;
10547                 }
10548                 case 0xb9:
10549                 {
10550                                 InvalidInstruction(4);
10551                         break;
10552                 }
10553                 case 0xba:
10554                 {
10555                                 InvalidInstruction(4);
10556                         break;
10557                 }
10558                 case 0xbb:
10559                 {
10560                                 InvalidInstruction(4);
10561                         break;
10562                 }
10563                 case 0xbc:
10564                 {
10565                                 InvalidInstruction(4);
10566                         break;
10567                 }
10568                 case 0xbd:
10569                 {
10570                                 InvalidInstruction(4);
10571                         break;
10572                 }
10573                 case 0xbe:
10574                 {
10575                         sdwCyclesRemaining -= 23;
10576                                 bTemp &= 0x7f;
10577                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
10578                                 while (psMemWrite->lowAddr != 0xffffffff)
10579                                 {
10580                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10581                                         {
10582                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10583                                                 if (psMemWrite->memoryCall)
10584                                                 {
10585                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10586                                                 }
10587                                                 else
10588                                                 {
10589                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10590                                                 }
10591                                                 psMemWrite = NULL;
10592                                                 break;
10593                                         }
10594                                         ++psMemWrite;
10595                                 }
10596
10597                                 if (psMemWrite)
10598                                 {
10599                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
10600                                 }
10601
10602                         break;
10603                 }
10604                 case 0xbf:
10605                 {
10606                                 InvalidInstruction(4);
10607                         break;
10608                 }
10609                 case 0xc0:
10610                 {
10611                                 InvalidInstruction(4);
10612                         break;
10613                 }
10614                 case 0xc1:
10615                 {
10616                                 InvalidInstruction(4);
10617                         break;
10618                 }
10619                 case 0xc2:
10620                 {
10621                                 InvalidInstruction(4);
10622                         break;
10623                 }
10624                 case 0xc3:
10625                 {
10626                                 InvalidInstruction(4);
10627                         break;
10628                 }
10629                 case 0xc4:
10630                 {
10631                                 InvalidInstruction(4);
10632                         break;
10633                 }
10634                 case 0xc5:
10635                 {
10636                                 InvalidInstruction(4);
10637                         break;
10638                 }
10639                 case 0xc6:
10640                 {
10641                         sdwCyclesRemaining -= 23;
10642                                 bTemp |= 0x01;
10643                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
10644                                 while (psMemWrite->lowAddr != 0xffffffff)
10645                                 {
10646                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10647                                         {
10648                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10649                                                 if (psMemWrite->memoryCall)
10650                                                 {
10651                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10652                                                 }
10653                                                 else
10654                                                 {
10655                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10656                                                 }
10657                                                 psMemWrite = NULL;
10658                                                 break;
10659                                         }
10660                                         ++psMemWrite;
10661                                 }
10662
10663                                 if (psMemWrite)
10664                                 {
10665                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
10666                                 }
10667
10668                         break;
10669                 }
10670                 case 0xc7:
10671                 {
10672                                 InvalidInstruction(4);
10673                         break;
10674                 }
10675                 case 0xc8:
10676                 {
10677                                 InvalidInstruction(4);
10678                         break;
10679                 }
10680                 case 0xc9:
10681                 {
10682                                 InvalidInstruction(4);
10683                         break;
10684                 }
10685                 case 0xca:
10686                 {
10687                                 InvalidInstruction(4);
10688                         break;
10689                 }
10690                 case 0xcb:
10691                 {
10692                                 InvalidInstruction(4);
10693                         break;
10694                 }
10695                 case 0xcc:
10696                 {
10697                                 InvalidInstruction(4);
10698                         break;
10699                 }
10700                 case 0xcd:
10701                 {
10702                                 InvalidInstruction(4);
10703                         break;
10704                 }
10705                 case 0xce:
10706                 {
10707                         sdwCyclesRemaining -= 23;
10708                                 bTemp |= 0x02;
10709                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
10710                                 while (psMemWrite->lowAddr != 0xffffffff)
10711                                 {
10712                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10713                                         {
10714                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10715                                                 if (psMemWrite->memoryCall)
10716                                                 {
10717                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10718                                                 }
10719                                                 else
10720                                                 {
10721                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10722                                                 }
10723                                                 psMemWrite = NULL;
10724                                                 break;
10725                                         }
10726                                         ++psMemWrite;
10727                                 }
10728
10729                                 if (psMemWrite)
10730                                 {
10731                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
10732                                 }
10733
10734                         break;
10735                 }
10736                 case 0xcf:
10737                 {
10738                                 InvalidInstruction(4);
10739                         break;
10740                 }
10741                 case 0xd0:
10742                 {
10743                                 InvalidInstruction(4);
10744                         break;
10745                 }
10746                 case 0xd1:
10747                 {
10748                                 InvalidInstruction(4);
10749                         break;
10750                 }
10751                 case 0xd2:
10752                 {
10753                                 InvalidInstruction(4);
10754                         break;
10755                 }
10756                 case 0xd3:
10757                 {
10758                                 InvalidInstruction(4);
10759                         break;
10760                 }
10761                 case 0xd4:
10762                 {
10763                                 InvalidInstruction(4);
10764                         break;
10765                 }
10766                 case 0xd5:
10767                 {
10768                                 InvalidInstruction(4);
10769                         break;
10770                 }
10771                 case 0xd6:
10772                 {
10773                         sdwCyclesRemaining -= 23;
10774                                 bTemp |= 0x04;
10775                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
10776                                 while (psMemWrite->lowAddr != 0xffffffff)
10777                                 {
10778                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10779                                         {
10780                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10781                                                 if (psMemWrite->memoryCall)
10782                                                 {
10783                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10784                                                 }
10785                                                 else
10786                                                 {
10787                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10788                                                 }
10789                                                 psMemWrite = NULL;
10790                                                 break;
10791                                         }
10792                                         ++psMemWrite;
10793                                 }
10794
10795                                 if (psMemWrite)
10796                                 {
10797                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
10798                                 }
10799
10800                         break;
10801                 }
10802                 case 0xd7:
10803                 {
10804                                 InvalidInstruction(4);
10805                         break;
10806                 }
10807                 case 0xd8:
10808                 {
10809                                 InvalidInstruction(4);
10810                         break;
10811                 }
10812                 case 0xd9:
10813                 {
10814                                 InvalidInstruction(4);
10815                         break;
10816                 }
10817                 case 0xda:
10818                 {
10819                                 InvalidInstruction(4);
10820                         break;
10821                 }
10822                 case 0xdb:
10823                 {
10824                                 InvalidInstruction(4);
10825                         break;
10826                 }
10827                 case 0xdc:
10828                 {
10829                                 InvalidInstruction(4);
10830                         break;
10831                 }
10832                 case 0xdd:
10833                 {
10834                                 InvalidInstruction(4);
10835                         break;
10836                 }
10837                 case 0xde:
10838                 {
10839                         sdwCyclesRemaining -= 23;
10840                                 bTemp |= 0x08;
10841                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
10842                                 while (psMemWrite->lowAddr != 0xffffffff)
10843                                 {
10844                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10845                                         {
10846                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10847                                                 if (psMemWrite->memoryCall)
10848                                                 {
10849                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10850                                                 }
10851                                                 else
10852                                                 {
10853                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10854                                                 }
10855                                                 psMemWrite = NULL;
10856                                                 break;
10857                                         }
10858                                         ++psMemWrite;
10859                                 }
10860
10861                                 if (psMemWrite)
10862                                 {
10863                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
10864                                 }
10865
10866                         break;
10867                 }
10868                 case 0xdf:
10869                 {
10870                                 InvalidInstruction(4);
10871                         break;
10872                 }
10873                 case 0xe0:
10874                 {
10875                                 InvalidInstruction(4);
10876                         break;
10877                 }
10878                 case 0xe1:
10879                 {
10880                                 InvalidInstruction(4);
10881                         break;
10882                 }
10883                 case 0xe2:
10884                 {
10885                                 InvalidInstruction(4);
10886                         break;
10887                 }
10888                 case 0xe3:
10889                 {
10890                                 InvalidInstruction(4);
10891                         break;
10892                 }
10893                 case 0xe4:
10894                 {
10895                                 InvalidInstruction(4);
10896                         break;
10897                 }
10898                 case 0xe5:
10899                 {
10900                                 InvalidInstruction(4);
10901                         break;
10902                 }
10903                 case 0xe6:
10904                 {
10905                         sdwCyclesRemaining -= 23;
10906                                 bTemp |= 0x10;
10907                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
10908                                 while (psMemWrite->lowAddr != 0xffffffff)
10909                                 {
10910                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10911                                         {
10912                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10913                                                 if (psMemWrite->memoryCall)
10914                                                 {
10915                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10916                                                 }
10917                                                 else
10918                                                 {
10919                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10920                                                 }
10921                                                 psMemWrite = NULL;
10922                                                 break;
10923                                         }
10924                                         ++psMemWrite;
10925                                 }
10926
10927                                 if (psMemWrite)
10928                                 {
10929                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
10930                                 }
10931
10932                         break;
10933                 }
10934                 case 0xe7:
10935                 {
10936                                 InvalidInstruction(4);
10937                         break;
10938                 }
10939                 case 0xe8:
10940                 {
10941                                 InvalidInstruction(4);
10942                         break;
10943                 }
10944                 case 0xe9:
10945                 {
10946                                 InvalidInstruction(4);
10947                         break;
10948                 }
10949                 case 0xea:
10950                 {
10951                                 InvalidInstruction(4);
10952                         break;
10953                 }
10954                 case 0xeb:
10955                 {
10956                                 InvalidInstruction(4);
10957                         break;
10958                 }
10959                 case 0xec:
10960                 {
10961                                 InvalidInstruction(4);
10962                         break;
10963                 }
10964                 case 0xed:
10965                 {
10966                                 InvalidInstruction(4);
10967                         break;
10968                 }
10969                 case 0xee:
10970                 {
10971                         sdwCyclesRemaining -= 23;
10972                                 bTemp |= 0x20;
10973                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
10974                                 while (psMemWrite->lowAddr != 0xffffffff)
10975                                 {
10976                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10977                                         {
10978                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10979                                                 if (psMemWrite->memoryCall)
10980                                                 {
10981                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10982                                                 }
10983                                                 else
10984                                                 {
10985                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10986                                                 }
10987                                                 psMemWrite = NULL;
10988                                                 break;
10989                                         }
10990                                         ++psMemWrite;
10991                                 }
10992
10993                                 if (psMemWrite)
10994                                 {
10995                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
10996                                 }
10997
10998                         break;
10999                 }
11000                 case 0xef:
11001                 {
11002                                 InvalidInstruction(4);
11003                         break;
11004                 }
11005                 case 0xf0:
11006                 {
11007                                 InvalidInstruction(4);
11008                         break;
11009                 }
11010                 case 0xf1:
11011                 {
11012                                 InvalidInstruction(4);
11013                         break;
11014                 }
11015                 case 0xf2:
11016                 {
11017                                 InvalidInstruction(4);
11018                         break;
11019                 }
11020                 case 0xf3:
11021                 {
11022                                 InvalidInstruction(4);
11023                         break;
11024                 }
11025                 case 0xf4:
11026                 {
11027                                 InvalidInstruction(4);
11028                         break;
11029                 }
11030                 case 0xf5:
11031                 {
11032                                 InvalidInstruction(4);
11033                         break;
11034                 }
11035                 case 0xf6:
11036                 {
11037                         sdwCyclesRemaining -= 23;
11038                                 bTemp |= 0x40;
11039                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
11040                                 while (psMemWrite->lowAddr != 0xffffffff)
11041                                 {
11042                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
11043                                         {
11044                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11045                                                 if (psMemWrite->memoryCall)
11046                                                 {
11047                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
11048                                                 }
11049                                                 else
11050                                                 {
11051                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
11052                                                 }
11053                                                 psMemWrite = NULL;
11054                                                 break;
11055                                         }
11056                                         ++psMemWrite;
11057                                 }
11058
11059                                 if (psMemWrite)
11060                                 {
11061                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
11062                                 }
11063
11064                         break;
11065                 }
11066                 case 0xf7:
11067                 {
11068                                 InvalidInstruction(4);
11069                         break;
11070                 }
11071                 case 0xf8:
11072                 {
11073                                 InvalidInstruction(4);
11074                         break;
11075                 }
11076                 case 0xf9:
11077                 {
11078                                 InvalidInstruction(4);
11079                         break;
11080                 }
11081                 case 0xfa:
11082                 {
11083                                 InvalidInstruction(4);
11084                         break;
11085                 }
11086                 case 0xfb:
11087                 {
11088                                 InvalidInstruction(4);
11089                         break;
11090                 }
11091                 case 0xfc:
11092                 {
11093                                 InvalidInstruction(4);
11094                         break;
11095                 }
11096                 case 0xfd:
11097                 {
11098                                 InvalidInstruction(4);
11099                         break;
11100                 }
11101                 case 0xfe:
11102                 {
11103                         sdwCyclesRemaining -= 23;
11104                                 bTemp |= 0x80;
11105                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
11106                                 while (psMemWrite->lowAddr != 0xffffffff)
11107                                 {
11108                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
11109                                         {
11110                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11111                                                 if (psMemWrite->memoryCall)
11112                                                 {
11113                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
11114                                                 }
11115                                                 else
11116                                                 {
11117                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
11118                                                 }
11119                                                 psMemWrite = NULL;
11120                                                 break;
11121                                         }
11122                                         ++psMemWrite;
11123                                 }
11124
11125                                 if (psMemWrite)
11126                                 {
11127                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
11128                                 }
11129
11130                         break;
11131                 }
11132                 case 0xff:
11133                 {
11134                                 InvalidInstruction(4);
11135                         break;
11136                 }
11137         }
11138 }
11139 void FDHandler(void)
11140 {
11141         switch (*pbPC++)
11142         {
11143                 case 0x00:
11144                 {
11145                                 InvalidInstruction(2);
11146                         break;
11147                 }
11148                 case 0x01:
11149                 {
11150                                 InvalidInstruction(2);
11151                         break;
11152                 }
11153                 case 0x02:
11154                 {
11155                                 InvalidInstruction(2);
11156                         break;
11157                 }
11158                 case 0x03:
11159                 {
11160                                 InvalidInstruction(2);
11161                         break;
11162                 }
11163                 case 0x04:
11164                 {
11165                                 InvalidInstruction(2);
11166                         break;
11167                 }
11168                 case 0x05:
11169                 {
11170                                 InvalidInstruction(2);
11171                         break;
11172                 }
11173                 case 0x06:
11174                 {
11175                                 InvalidInstruction(2);
11176                         break;
11177                 }
11178                 case 0x07:
11179                 {
11180                                 InvalidInstruction(2);
11181                         break;
11182                 }
11183                 case 0x08:
11184                 {
11185                                 InvalidInstruction(2);
11186                         break;
11187                 }
11188                 case 0x09:
11189                 {
11190                         sdwCyclesRemaining -= 15;
11191                         cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
11192                         dwTemp = cpu.z80IY + cpu.z80BC;
11193                         cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IY ^ dwTemp ^ cpu.z80BC) >> 8) & Z80_FLAG_HALF_CARRY);
11194                         cpu.z80IY = dwTemp & 0xffff;
11195                         break;
11196                 }
11197                 case 0x0a:
11198                 {
11199                                 InvalidInstruction(2);
11200                         break;
11201                 }
11202                 case 0x0b:
11203                 {
11204                                 InvalidInstruction(2);
11205                         break;
11206                 }
11207                 case 0x0c:
11208                 {
11209                                 InvalidInstruction(2);
11210                         break;
11211                 }
11212                 case 0x0d:
11213                 {
11214                                 InvalidInstruction(2);
11215                         break;
11216                 }
11217                 case 0x0e:
11218                 {
11219                                 InvalidInstruction(2);
11220                         break;
11221                 }
11222                 case 0x0f:
11223                 {
11224                                 InvalidInstruction(2);
11225                         break;
11226                 }
11227                 case 0x10:
11228                 {
11229                                 InvalidInstruction(2);
11230                         break;
11231                 }
11232                 case 0x11:
11233                 {
11234                                 InvalidInstruction(2);
11235                         break;
11236                 }
11237                 case 0x12:
11238                 {
11239                                 InvalidInstruction(2);
11240                         break;
11241                 }
11242                 case 0x13:
11243                 {
11244                                 InvalidInstruction(2);
11245                         break;
11246                 }
11247                 case 0x14:
11248                 {
11249                                 InvalidInstruction(2);
11250                         break;
11251                 }
11252                 case 0x15:
11253                 {
11254                                 InvalidInstruction(2);
11255                         break;
11256                 }
11257                 case 0x16:
11258                 {
11259                                 InvalidInstruction(2);
11260                         break;
11261                 }
11262                 case 0x17:
11263                 {
11264                                 InvalidInstruction(2);
11265                         break;
11266                 }
11267                 case 0x18:
11268                 {
11269                                 InvalidInstruction(2);
11270                         break;
11271                 }
11272                 case 0x19:
11273                 {
11274                         sdwCyclesRemaining -= 15;
11275                         cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
11276                         dwTemp = cpu.z80IY + cpu.z80DE;
11277                         cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IY ^ dwTemp ^ cpu.z80DE) >> 8) & Z80_FLAG_HALF_CARRY);
11278                         cpu.z80IY = dwTemp & 0xffff;
11279                         break;
11280                 }
11281                 case 0x1a:
11282                 {
11283                                 InvalidInstruction(2);
11284                         break;
11285                 }
11286                 case 0x1b:
11287                 {
11288                                 InvalidInstruction(2);
11289                         break;
11290                 }
11291                 case 0x1c:
11292                 {
11293                                 InvalidInstruction(2);
11294                         break;
11295                 }
11296                 case 0x1d:
11297                 {
11298                                 InvalidInstruction(2);
11299                         break;
11300                 }
11301                 case 0x1e:
11302                 {
11303                                 InvalidInstruction(2);
11304                         break;
11305                 }
11306                 case 0x1f:
11307                 {
11308                                 InvalidInstruction(2);
11309                         break;
11310                 }
11311                 case 0x20:
11312                 {
11313                                 InvalidInstruction(2);
11314                         break;
11315                 }
11316                 case 0x21:
11317                 {
11318                         sdwCyclesRemaining -= 14;
11319                 cpu.z80IY = *pbPC++;
11320                 cpu.z80IY |= ((UINT32) *pbPC++ << 8);
11321                         break;
11322                 }
11323                 case 0x22:
11324                 {
11325                         sdwCyclesRemaining -= 20;
11326                                 dwAddr = *pbPC++;
11327                                 dwAddr |= ((UINT32) *pbPC++ << 8);
11328                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
11329                                 while (psMemWrite->lowAddr != 0xffffffff)
11330                                 {
11331                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
11332                                         {
11333                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11334                                                 if (psMemWrite->memoryCall)
11335                                                 {
11336                                                         psMemWrite->memoryCall(dwAddr, (cpu.z80IY & 0xff), psMemWrite);
11337                                                         psMemWrite->memoryCall(dwAddr + 1, (cpu.z80IY >> 8), psMemWrite);
11338                                                 }
11339                                                 else
11340                                                 {
11341                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = cpu.z80IY;
11342                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr) + 1) = cpu.z80IY >> 8;
11343                                                 }
11344                                                 psMemWrite = NULL;
11345                                                 break;
11346                                         }
11347                                         ++psMemWrite;
11348                                 }
11349
11350                                 if (psMemWrite)
11351                                 {
11352                                         cpu.z80Base[dwAddr] = (UINT8) cpu.z80IY;
11353                                         cpu.z80Base[dwAddr + 1] = (UINT8) ((UINT32) cpu.z80IY >> 8);
11354                                 }
11355
11356                         break;
11357                 }
11358                 case 0x23:
11359                 {
11360                         sdwCyclesRemaining -= 10;
11361                                 cpu.z80IY++;
11362                                 cpu.z80IY &= 0xffff;
11363                         break;
11364                 }
11365                 case 0x24:
11366                 {
11367                         sdwCyclesRemaining -= 9;
11368                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
11369                                 cpu.z80F |= bPostIncFlags[cpu.z80YH++];
11370                         break;
11371                 }
11372                 case 0x25:
11373                 {
11374                         sdwCyclesRemaining -= 9;
11375                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
11376                                 cpu.z80F |= bPostDecFlags[cpu.z80YH--];
11377                         break;
11378                 }
11379                 case 0x26:
11380                 {
11381                         sdwCyclesRemaining -= 9;
11382                         cpu.z80YH = *pbPC++;
11383                         break;
11384                 }
11385                 case 0x27:
11386                 {
11387                                 InvalidInstruction(2);
11388                         break;
11389                 }
11390                 case 0x28:
11391                 {
11392                                 InvalidInstruction(2);
11393                         break;
11394                 }
11395                 case 0x29:
11396                 {
11397                         sdwCyclesRemaining -= 15;
11398                         cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
11399                         dwTemp = cpu.z80IY + cpu.z80IY;
11400                         cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IY ^ dwTemp ^ cpu.z80HL) >> 8) & Z80_FLAG_HALF_CARRY);
11401                         cpu.z80IY = dwTemp & 0xffff;
11402                         break;
11403                 }
11404                 case 0x2a:
11405                 {
11406                         sdwCyclesRemaining -= 20;
11407                                 dwAddr = *pbPC++;
11408                                 dwAddr |= ((UINT32) *pbPC++ << 8);
11409                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
11410                                 while (psMemRead->lowAddr != 0xffffffff)
11411                                 {
11412                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
11413                                         {
11414                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11415                                                 if (psMemRead->memoryCall)
11416                                                 {
11417                                                         cpu.z80IY = psMemRead->memoryCall(dwAddr, psMemRead);
11418                                                         cpu.z80IY |= (UINT32) ((UINT32) psMemRead->memoryCall(dwAddr + 1, psMemRead) << 8);
11419                                                 }
11420                                                 else
11421                                                 {
11422                                                         cpu.z80IY = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
11423                                                         cpu.z80IY |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr + 1)) << 8);
11424                                                 }
11425                                                 psMemRead = NULL;
11426                                                 break;
11427                                         }
11428                                         ++psMemRead;
11429                                 }
11430
11431                                 if (psMemRead)
11432                                 {
11433                                         cpu.z80IY = cpu.z80Base[dwAddr];
11434                                         cpu.z80IY |= (UINT32) ((UINT32) cpu.z80Base[dwAddr + 1] << 8);
11435                                 }
11436
11437                         break;
11438                 }
11439                 case 0x2b:
11440                 {
11441                         sdwCyclesRemaining -= 10;
11442                                 cpu.z80IY--;
11443                                 cpu.z80IY &= 0xffff;
11444                         break;
11445                 }
11446                 case 0x2c:
11447                 {
11448                         sdwCyclesRemaining -= 9;
11449                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
11450                                 cpu.z80F |= bPostIncFlags[cpu.z80YL++];
11451                         break;
11452                 }
11453                 case 0x2d:
11454                 {
11455                         sdwCyclesRemaining -= 9;
11456                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
11457                                 cpu.z80F |= bPostDecFlags[cpu.z80YL--];
11458                         break;
11459                 }
11460                 case 0x2e:
11461                 {
11462                         sdwCyclesRemaining -= 9;
11463                         cpu.z80YL = *pbPC++;
11464                         break;
11465                 }
11466                 case 0x2f:
11467                 {
11468                                 InvalidInstruction(2);
11469                         break;
11470                 }
11471                 case 0x30:
11472                 {
11473                                 InvalidInstruction(2);
11474                         break;
11475                 }
11476                 case 0x31:
11477                 {
11478                                 InvalidInstruction(2);
11479                         break;
11480                 }
11481                 case 0x32:
11482                 {
11483                                 InvalidInstruction(2);
11484                         break;
11485                 }
11486                 case 0x33:
11487                 {
11488                                 InvalidInstruction(2);
11489                         break;
11490                 }
11491                 case 0x34:
11492                 {
11493                         sdwCyclesRemaining -= 23;
11494                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
11495                                 dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
11496                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
11497                                 while (psMemRead->lowAddr != 0xffffffff)
11498                                 {
11499                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
11500                                         {
11501                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11502                                                 if (psMemRead->memoryCall)
11503                                                 {
11504                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
11505                                                 }
11506                                                 else
11507                                                 {
11508                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
11509                                                 }
11510                                                 psMemRead = NULL;
11511                                                 break;
11512                                         }
11513                                         ++psMemRead;
11514                                 }
11515
11516                                 if (psMemRead)
11517                                 {
11518                                         bTemp = cpu.z80Base[dwAddr];
11519                                 }
11520
11521                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
11522                                 cpu.z80F |= bPostIncFlags[bTemp++];
11523                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
11524                                 while (psMemWrite->lowAddr != 0xffffffff)
11525                                 {
11526                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
11527                                         {
11528                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11529                                                 if (psMemWrite->memoryCall)
11530                                                 {
11531                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
11532                                                 }
11533                                                 else
11534                                                 {
11535                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
11536                                                 }
11537                                                 psMemWrite = NULL;
11538                                                 break;
11539                                         }
11540                                         ++psMemWrite;
11541                                 }
11542
11543                                 if (psMemWrite)
11544                                 {
11545                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
11546                                 }
11547
11548                         break;
11549                 }
11550                 case 0x35:
11551                 {
11552                         sdwCyclesRemaining -= 23;
11553                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
11554                                 dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
11555                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
11556                                 while (psMemRead->lowAddr != 0xffffffff)
11557                                 {
11558                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
11559                                         {
11560                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11561                                                 if (psMemRead->memoryCall)
11562                                                 {
11563                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
11564                                                 }
11565                                                 else
11566                                                 {
11567                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
11568                                                 }
11569                                                 psMemRead = NULL;
11570                                                 break;
11571                                         }
11572                                         ++psMemRead;
11573                                 }
11574
11575                                 if (psMemRead)
11576                                 {
11577                                         bTemp = cpu.z80Base[dwAddr];
11578                                 }
11579
11580                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
11581                                 cpu.z80F |= bPostDecFlags[bTemp--];
11582                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
11583                                 while (psMemWrite->lowAddr != 0xffffffff)
11584                                 {
11585                                         if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
11586                                         {
11587                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11588                                                 if (psMemWrite->memoryCall)
11589                                                 {
11590                                                         psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
11591                                                 }
11592                                                 else
11593                                                 {
11594                                                         *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
11595                                                 }
11596                                                 psMemWrite = NULL;
11597                                                 break;
11598                                         }
11599                                         ++psMemWrite;
11600                                 }
11601
11602                                 if (psMemWrite)
11603                                 {
11604                                         cpu.z80Base[dwAddr] = (UINT8) bTemp;
11605                                 }
11606
11607                         break;
11608                 }
11609                 case 0x36:
11610                 {
11611                         sdwCyclesRemaining -= 19;
11612                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
11613                                 sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
11614                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
11615                                 while (psMemWrite->lowAddr != 0xffffffff)
11616                                 {
11617                                         if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
11618                                         {
11619                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11620                                                 if (psMemWrite->memoryCall)
11621                                                 {
11622                                                         psMemWrite->memoryCall(sdwAddr, *pbPC++, psMemWrite);
11623                                                 }
11624                                                 else
11625                                                 {
11626                                                         *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = *pbPC++;
11627                                                 }
11628                                                 psMemWrite = NULL;
11629                                                 break;
11630                                         }
11631                                         ++psMemWrite;
11632                                 }
11633
11634                                 if (psMemWrite)
11635                                 {
11636                                         cpu.z80Base[sdwAddr] = (UINT8) *pbPC++;
11637                                 }
11638
11639                         break;
11640                 }
11641                 case 0x37:
11642                 {
11643                                 InvalidInstruction(2);
11644                         break;
11645                 }
11646                 case 0x38:
11647                 {
11648                                 InvalidInstruction(2);
11649                         break;
11650                 }
11651                 case 0x39:
11652                 {
11653                         sdwCyclesRemaining -= 15;
11654                         cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
11655                         dwTemp = cpu.z80IY + cpu.z80sp;
11656                         cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IY ^ dwTemp ^ cpu.z80sp) >> 8) & Z80_FLAG_HALF_CARRY);
11657                         cpu.z80IY = dwTemp & 0xffff;
11658                         break;
11659                 }
11660                 case 0x3a:
11661                 {
11662                                 InvalidInstruction(2);
11663                         break;
11664                 }
11665                 case 0x3b:
11666                 {
11667                                 InvalidInstruction(2);
11668                         break;
11669                 }
11670                 case 0x3c:
11671                 {
11672                                 InvalidInstruction(2);
11673                         break;
11674                 }
11675                 case 0x3d:
11676                 {
11677                                 InvalidInstruction(2);
11678                         break;
11679                 }
11680                 case 0x3e:
11681                 {
11682                                 InvalidInstruction(2);
11683                         break;
11684                 }
11685                 case 0x3f:
11686                 {
11687                                 InvalidInstruction(2);
11688                         break;
11689                 }
11690                 case 0x40:
11691                 {
11692                                 InvalidInstruction(2);
11693                         break;
11694                 }
11695                 case 0x41:
11696                 {
11697                                 InvalidInstruction(2);
11698                         break;
11699                 }
11700                 case 0x42:
11701                 {
11702                                 InvalidInstruction(2);
11703                         break;
11704                 }
11705                 case 0x43:
11706                 {
11707                                 InvalidInstruction(2);
11708                         break;
11709                 }
11710                 case 0x44:
11711                 {
11712                         sdwCyclesRemaining -= 9;
11713                         cpu.z80B = cpu.z80YH;
11714                         break;
11715                 }
11716                 case 0x45:
11717                 {
11718                         sdwCyclesRemaining -= 9;
11719                         cpu.z80B = cpu.z80YL;
11720                         break;
11721                 }
11722                 case 0x46:
11723                 {
11724                         sdwCyclesRemaining -= 19;
11725                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
11726                                 sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
11727                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
11728                                 while (psMemRead->lowAddr != 0xffffffff)
11729                                 {
11730                                         if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
11731                                         {
11732                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11733                                                 if (psMemRead->memoryCall)
11734                                                 {
11735                                                         cpu.z80B = psMemRead->memoryCall(sdwAddr, psMemRead);
11736                                                 }
11737                                                 else
11738                                                 {
11739                                                         cpu.z80B = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
11740                                                 }
11741                                                 psMemRead = NULL;
11742                                                 break;
11743                                         }
11744                                         ++psMemRead;
11745                                 }
11746
11747                                 if (psMemRead)
11748                                 {
11749                                         cpu.z80B = cpu.z80Base[sdwAddr];
11750                                 }
11751
11752                         break;
11753                 }
11754                 case 0x47:
11755                 {
11756                                 InvalidInstruction(2);
11757                         break;
11758                 }
11759                 case 0x48:
11760                 {
11761                                 InvalidInstruction(2);
11762                         break;
11763                 }
11764                 case 0x49:
11765                 {
11766                                 InvalidInstruction(2);
11767                         break;
11768                 }
11769                 case 0x4a:
11770                 {
11771                                 InvalidInstruction(2);
11772                         break;
11773                 }
11774                 case 0x4b:
11775                 {
11776                                 InvalidInstruction(2);
11777                         break;
11778                 }
11779                 case 0x4c:
11780                 {
11781                         sdwCyclesRemaining -= 9;
11782                         cpu.z80C = cpu.z80YH;
11783                         break;
11784                 }
11785                 case 0x4d:
11786                 {
11787                         sdwCyclesRemaining -= 9;
11788                         cpu.z80C = cpu.z80YL;
11789                         break;
11790                 }
11791                 case 0x4e:
11792                 {
11793                         sdwCyclesRemaining -= 19;
11794                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
11795                                 sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
11796                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
11797                                 while (psMemRead->lowAddr != 0xffffffff)
11798                                 {
11799                                         if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
11800                                         {
11801                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11802                                                 if (psMemRead->memoryCall)
11803                                                 {
11804                                                         cpu.z80C = psMemRead->memoryCall(sdwAddr, psMemRead);
11805                                                 }
11806                                                 else
11807                                                 {
11808                                                         cpu.z80C = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
11809                                                 }
11810                                                 psMemRead = NULL;
11811                                                 break;
11812                                         }
11813                                         ++psMemRead;
11814                                 }
11815
11816                                 if (psMemRead)
11817                                 {
11818                                         cpu.z80C = cpu.z80Base[sdwAddr];
11819                                 }
11820
11821                         break;
11822                 }
11823                 case 0x4f:
11824                 {
11825                                 InvalidInstruction(2);
11826                         break;
11827                 }
11828                 case 0x50:
11829                 {
11830                                 InvalidInstruction(2);
11831                         break;
11832                 }
11833                 case 0x51:
11834                 {
11835                                 InvalidInstruction(2);
11836                         break;
11837                 }
11838                 case 0x52:
11839                 {
11840                                 InvalidInstruction(2);
11841                         break;
11842                 }
11843                 case 0x53:
11844                 {
11845                                 InvalidInstruction(2);
11846                         break;
11847                 }
11848                 case 0x54:
11849                 {
11850                         sdwCyclesRemaining -= 9;
11851                         cpu.z80D = cpu.z80YH;
11852                         break;
11853                 }
11854                 case 0x55:
11855                 {
11856                         sdwCyclesRemaining -= 9;
11857                         cpu.z80D = cpu.z80YL;
11858                         break;
11859                 }
11860                 case 0x56:
11861                 {
11862                         sdwCyclesRemaining -= 19;
11863                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
11864                                 sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
11865                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
11866                                 while (psMemRead->lowAddr != 0xffffffff)
11867                                 {
11868                                         if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
11869                                         {
11870                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11871                                                 if (psMemRead->memoryCall)
11872                                                 {
11873                                                         cpu.z80D = psMemRead->memoryCall(sdwAddr, psMemRead);
11874                                                 }
11875                                                 else
11876                                                 {
11877                                                         cpu.z80D = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
11878                                                 }
11879                                                 psMemRead = NULL;
11880                                                 break;
11881                                         }
11882                                         ++psMemRead;
11883                                 }
11884
11885                                 if (psMemRead)
11886                                 {
11887                                         cpu.z80D = cpu.z80Base[sdwAddr];
11888                                 }
11889
11890                         break;
11891                 }
11892                 case 0x57:
11893                 {
11894                                 InvalidInstruction(2);
11895                         break;
11896                 }
11897                 case 0x58:
11898                 {
11899                                 InvalidInstruction(2);
11900                         break;
11901                 }
11902                 case 0x59:
11903                 {
11904                                 InvalidInstruction(2);
11905                         break;
11906                 }
11907                 case 0x5a:
11908                 {
11909                                 InvalidInstruction(2);
11910                         break;
11911                 }
11912                 case 0x5b:
11913                 {
11914                                 InvalidInstruction(2);
11915                         break;
11916                 }
11917                 case 0x5c:
11918                 {
11919                         sdwCyclesRemaining -= 9;
11920                         cpu.z80E = cpu.z80YH;
11921                         break;
11922                 }
11923                 case 0x5d:
11924                 {
11925                         sdwCyclesRemaining -= 9;
11926                         cpu.z80E = cpu.z80YL;
11927                         break;
11928                 }
11929                 case 0x5e:
11930                 {
11931                         sdwCyclesRemaining -= 19;
11932                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
11933                                 sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
11934                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
11935                                 while (psMemRead->lowAddr != 0xffffffff)
11936                                 {
11937                                         if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
11938                                         {
11939                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11940                                                 if (psMemRead->memoryCall)
11941                                                 {
11942                                                         cpu.z80E = psMemRead->memoryCall(sdwAddr, psMemRead);
11943                                                 }
11944                                                 else
11945                                                 {
11946                                                         cpu.z80E = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
11947                                                 }
11948                                                 psMemRead = NULL;
11949                                                 break;
11950                                         }
11951                                         ++psMemRead;
11952                                 }
11953
11954                                 if (psMemRead)
11955                                 {
11956                                         cpu.z80E = cpu.z80Base[sdwAddr];
11957                                 }
11958
11959                         break;
11960                 }
11961                 case 0x5f:
11962                 {
11963                                 InvalidInstruction(2);
11964                         break;
11965                 }
11966                 case 0x60:
11967                 {
11968                         sdwCyclesRemaining -= 9;
11969                         cpu.z80YH = cpu.z80B;
11970                         break;
11971                 }
11972                 case 0x61:
11973                 {
11974                         sdwCyclesRemaining -= 9;
11975                         cpu.z80YH = cpu.z80C;
11976                         break;
11977                 }
11978                 case 0x62:
11979                 {
11980                         sdwCyclesRemaining -= 9;
11981                         cpu.z80YH = cpu.z80D;
11982                         break;
11983                 }
11984                 case 0x63:
11985                 {
11986                         sdwCyclesRemaining -= 9;
11987                         cpu.z80YH = cpu.z80E;
11988                         break;
11989                 }
11990                 case 0x64:
11991                 {
11992                         sdwCyclesRemaining -= 9;
11993                         break;
11994                 }
11995                 case 0x65:
11996                 {
11997                         sdwCyclesRemaining -= 9;
11998                         cpu.z80YH = cpu.z80YL;
11999                         break;
12000                 }
12001                 case 0x66:
12002                 {
12003                         sdwCyclesRemaining -= 19;
12004                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
12005                                 sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
12006                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
12007                                 while (psMemRead->lowAddr != 0xffffffff)
12008                                 {
12009                                         if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
12010                                         {
12011                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12012                                                 if (psMemRead->memoryCall)
12013                                                 {
12014                                                         cpu.z80H = psMemRead->memoryCall(sdwAddr, psMemRead);
12015                                                 }
12016                                                 else
12017                                                 {
12018                                                         cpu.z80H = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
12019                                                 }
12020                                                 psMemRead = NULL;
12021                                                 break;
12022                                         }
12023                                         ++psMemRead;
12024                                 }
12025
12026                                 if (psMemRead)
12027                                 {
12028                                         cpu.z80H = cpu.z80Base[sdwAddr];
12029                                 }
12030
12031                         break;
12032                 }
12033                 case 0x67:
12034                 {
12035                         sdwCyclesRemaining -= 9;
12036                         cpu.z80YH = cpu.z80A;
12037                         break;
12038                 }
12039                 case 0x68:
12040                 {
12041                         sdwCyclesRemaining -= 9;
12042                         cpu.z80YL = cpu.z80B;
12043                         break;
12044                 }
12045                 case 0x69:
12046                 {
12047                         sdwCyclesRemaining -= 9;
12048                         cpu.z80YL = cpu.z80C;
12049                         break;
12050                 }
12051                 case 0x6a:
12052                 {
12053                         sdwCyclesRemaining -= 9;
12054                         cpu.z80YL = cpu.z80D;
12055                         break;
12056                 }
12057                 case 0x6b:
12058                 {
12059                         sdwCyclesRemaining -= 9;
12060                         cpu.z80YL = cpu.z80E;
12061                         break;
12062                 }
12063                 case 0x6c:
12064                 {
12065                         sdwCyclesRemaining -= 9;
12066                         cpu.z80YL = cpu.z80YH;
12067                         break;
12068                 }
12069                 case 0x6d:
12070                 {
12071                         sdwCyclesRemaining -= 9;
12072                         break;
12073                 }
12074                 case 0x6e:
12075                 {
12076                         sdwCyclesRemaining -= 19;
12077                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
12078                                 sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
12079                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
12080                                 while (psMemRead->lowAddr != 0xffffffff)
12081                                 {
12082                                         if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
12083                                         {
12084                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12085                                                 if (psMemRead->memoryCall)
12086                                                 {
12087                                                         cpu.z80L = psMemRead->memoryCall(sdwAddr, psMemRead);
12088                                                 }
12089                                                 else
12090                                                 {
12091                                                         cpu.z80L = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
12092                                                 }
12093                                                 psMemRead = NULL;
12094                                                 break;
12095                                         }
12096                                         ++psMemRead;
12097                                 }
12098
12099                                 if (psMemRead)
12100                                 {
12101                                         cpu.z80L = cpu.z80Base[sdwAddr];
12102                                 }
12103
12104                         break;
12105                 }
12106                 case 0x6f:
12107                 {
12108                         sdwCyclesRemaining -= 9;
12109                         cpu.z80YL = cpu.z80A;
12110                         break;
12111                 }
12112                 case 0x70:
12113                 {
12114                         sdwCyclesRemaining -= 19;
12115                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
12116                                 sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
12117                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
12118                                 while (psMemWrite->lowAddr != 0xffffffff)
12119                                 {
12120                                         if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
12121                                         {
12122                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12123                                                 if (psMemWrite->memoryCall)
12124                                                 {
12125                                                         psMemWrite->memoryCall(sdwAddr, cpu.z80B, psMemWrite);
12126                                                 }
12127                                                 else
12128                                                 {
12129                                                         *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80B;
12130                                                 }
12131                                                 psMemWrite = NULL;
12132                                                 break;
12133                                         }
12134                                         ++psMemWrite;
12135                                 }
12136
12137                                 if (psMemWrite)
12138                                 {
12139                                         cpu.z80Base[sdwAddr] = (UINT8) cpu.z80B;
12140                                 }
12141
12142                         break;
12143                 }
12144                 case 0x71:
12145                 {
12146                         sdwCyclesRemaining -= 19;
12147                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
12148                                 sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
12149                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
12150                                 while (psMemWrite->lowAddr != 0xffffffff)
12151                                 {
12152                                         if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
12153                                         {
12154                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12155                                                 if (psMemWrite->memoryCall)
12156                                                 {
12157                                                         psMemWrite->memoryCall(sdwAddr, cpu.z80C, psMemWrite);
12158                                                 }
12159                                                 else
12160                                                 {
12161                                                         *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80C;
12162                                                 }
12163                                                 psMemWrite = NULL;
12164                                                 break;
12165                                         }
12166                                         ++psMemWrite;
12167                                 }
12168
12169                                 if (psMemWrite)
12170                                 {
12171                                         cpu.z80Base[sdwAddr] = (UINT8) cpu.z80C;
12172                                 }
12173
12174                         break;
12175                 }
12176                 case 0x72:
12177                 {
12178                         sdwCyclesRemaining -= 19;
12179                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
12180                                 sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
12181                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
12182                                 while (psMemWrite->lowAddr != 0xffffffff)
12183                                 {
12184                                         if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
12185                                         {
12186                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12187                                                 if (psMemWrite->memoryCall)
12188                                                 {
12189                                                         psMemWrite->memoryCall(sdwAddr, cpu.z80D, psMemWrite);
12190                                                 }
12191                                                 else
12192                                                 {
12193                                                         *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80D;
12194                                                 }
12195                                                 psMemWrite = NULL;
12196                                                 break;
12197                                         }
12198                                         ++psMemWrite;
12199                                 }
12200
12201                                 if (psMemWrite)
12202                                 {
12203                                         cpu.z80Base[sdwAddr] = (UINT8) cpu.z80D;
12204                                 }
12205
12206                         break;
12207                 }
12208                 case 0x73:
12209                 {
12210                         sdwCyclesRemaining -= 19;
12211                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
12212                                 sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
12213                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
12214                                 while (psMemWrite->lowAddr != 0xffffffff)
12215                                 {
12216                                         if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
12217                                         {
12218                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12219                                                 if (psMemWrite->memoryCall)
12220                                                 {
12221                                                         psMemWrite->memoryCall(sdwAddr, cpu.z80E, psMemWrite);
12222                                                 }
12223                                                 else
12224                                                 {
12225                                                         *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80E;
12226                                                 }
12227                                                 psMemWrite = NULL;
12228                                                 break;
12229                                         }
12230                                         ++psMemWrite;
12231                                 }
12232
12233                                 if (psMemWrite)
12234                                 {
12235                                         cpu.z80Base[sdwAddr] = (UINT8) cpu.z80E;
12236                                 }
12237
12238                         break;
12239                 }
12240                 case 0x74:
12241                 {
12242                         sdwCyclesRemaining -= 19;
12243                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
12244                                 sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
12245                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
12246                                 while (psMemWrite->lowAddr != 0xffffffff)
12247                                 {
12248                                         if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
12249                                         {
12250                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12251                                                 if (psMemWrite->memoryCall)
12252                                                 {
12253                                                         psMemWrite->memoryCall(sdwAddr, cpu.z80H, psMemWrite);
12254                                                 }
12255                                                 else
12256                                                 {
12257                                                         *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80H;
12258                                                 }
12259                                                 psMemWrite = NULL;
12260                                                 break;
12261                                         }
12262                                         ++psMemWrite;
12263                                 }
12264
12265                                 if (psMemWrite)
12266                                 {
12267                                         cpu.z80Base[sdwAddr] = (UINT8) cpu.z80H;
12268                                 }
12269
12270                         break;
12271                 }
12272                 case 0x75:
12273                 {
12274                         sdwCyclesRemaining -= 19;
12275                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
12276                                 sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
12277                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
12278                                 while (psMemWrite->lowAddr != 0xffffffff)
12279                                 {
12280                                         if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
12281                                         {
12282                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12283                                                 if (psMemWrite->memoryCall)
12284                                                 {
12285                                                         psMemWrite->memoryCall(sdwAddr, cpu.z80L, psMemWrite);
12286                                                 }
12287                                                 else
12288                                                 {
12289                                                         *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80L;
12290                                                 }
12291                                                 psMemWrite = NULL;
12292                                                 break;
12293                                         }
12294                                         ++psMemWrite;
12295                                 }
12296
12297                                 if (psMemWrite)
12298                                 {
12299                                         cpu.z80Base[sdwAddr] = (UINT8) cpu.z80L;
12300                                 }
12301
12302                         break;
12303                 }
12304                 case 0x76:
12305                 {
12306                         sdwCyclesRemaining -= 19;
12307                                 InvalidInstruction(2);
12308                         break;
12309                 }
12310                 case 0x77:
12311                 {
12312                         sdwCyclesRemaining -= 19;
12313                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
12314                                 sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
12315                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
12316                                 while (psMemWrite->lowAddr != 0xffffffff)
12317                                 {
12318                                         if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
12319                                         {
12320                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12321                                                 if (psMemWrite->memoryCall)
12322                                                 {
12323                                                         psMemWrite->memoryCall(sdwAddr, cpu.z80A, psMemWrite);
12324                                                 }
12325                                                 else
12326                                                 {
12327                                                         *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80A;
12328                                                 }
12329                                                 psMemWrite = NULL;
12330                                                 break;
12331                                         }
12332                                         ++psMemWrite;
12333                                 }
12334
12335                                 if (psMemWrite)
12336                                 {
12337                                         cpu.z80Base[sdwAddr] = (UINT8) cpu.z80A;
12338                                 }
12339
12340                         break;
12341                 }
12342                 case 0x78:
12343                 {
12344                                 InvalidInstruction(2);
12345                         break;
12346                 }
12347                 case 0x79:
12348                 {
12349                                 InvalidInstruction(2);
12350                         break;
12351                 }
12352                 case 0x7a:
12353                 {
12354                                 InvalidInstruction(2);
12355                         break;
12356                 }
12357                 case 0x7b:
12358                 {
12359                                 InvalidInstruction(2);
12360                         break;
12361                 }
12362                 case 0x7c:
12363                 {
12364                         sdwCyclesRemaining -= 9;
12365                         cpu.z80A = cpu.z80YH;
12366                         break;
12367                 }
12368                 case 0x7d:
12369                 {
12370                         sdwCyclesRemaining -= 9;
12371                         cpu.z80A = cpu.z80YL;
12372                         break;
12373                 }
12374                 case 0x7e:
12375                 {
12376                         sdwCyclesRemaining -= 19;
12377                                 sdwAddr = (INT8) *pbPC++;       // Get the offset
12378                                 sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
12379                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
12380                                 while (psMemRead->lowAddr != 0xffffffff)
12381                                 {
12382                                         if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
12383                                         {
12384                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12385                                                 if (psMemRead->memoryCall)
12386                                                 {
12387                                                         cpu.z80A = psMemRead->memoryCall(sdwAddr, psMemRead);
12388                                                 }
12389                                                 else
12390                                                 {
12391                                                         cpu.z80A = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
12392                                                 }
12393                                                 psMemRead = NULL;
12394                                                 break;
12395                                         }
12396                                         ++psMemRead;
12397                                 }
12398
12399                                 if (psMemRead)
12400                                 {
12401                                         cpu.z80A = cpu.z80Base[sdwAddr];
12402                                 }
12403
12404                         break;
12405                 }
12406                 case 0x7f:
12407                 {
12408                                 InvalidInstruction(2);
12409                         break;
12410                 }
12411                 case 0x80:
12412                 {
12413                                 InvalidInstruction(2);
12414                         break;
12415                 }
12416                 case 0x81:
12417                 {
12418                                 InvalidInstruction(2);
12419                         break;
12420                 }
12421                 case 0x82:
12422                 {
12423                                 InvalidInstruction(2);
12424                         break;
12425                 }
12426                 case 0x83:
12427                 {
12428                                 InvalidInstruction(2);
12429                         break;
12430                 }
12431                 case 0x84:
12432                 {
12433                         sdwCyclesRemaining -= 9;
12434                                 bTemp2 = cpu.z80A + cpu.z80YH;
12435                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
12436                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12437                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80YH];
12438                                 InvalidInstruction(2);
12439                         break;
12440                 }
12441                 case 0x85:
12442                 {
12443                         sdwCyclesRemaining -= 9;
12444                                 bTemp2 = cpu.z80A + cpu.z80YL;
12445                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
12446                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12447                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80YL];
12448                                 InvalidInstruction(2);
12449                         break;
12450                 }
12451                 case 0x86:
12452                 {
12453                         sdwCyclesRemaining -= 19;
12454                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
12455                                 dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
12456                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
12457                                 while (psMemRead->lowAddr != 0xffffffff)
12458                                 {
12459                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
12460                                         {
12461                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12462                                                 if (psMemRead->memoryCall)
12463                                                 {
12464                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
12465                                                 }
12466                                                 else
12467                                                 {
12468                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
12469                                                 }
12470                                                 psMemRead = NULL;
12471                                                 break;
12472                                         }
12473                                         ++psMemRead;
12474                                 }
12475
12476                                 if (psMemRead)
12477                                 {
12478                                         bTemp = cpu.z80Base[dwAddr];
12479                                 }
12480
12481                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
12482                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12483                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp];
12484                                 cpu.z80A += bTemp;
12485                         break;
12486                 }
12487                 case 0x87:
12488                 {
12489                                 InvalidInstruction(2);
12490                         break;
12491                 }
12492                 case 0x88:
12493                 {
12494                                 InvalidInstruction(2);
12495                         break;
12496                 }
12497                 case 0x89:
12498                 {
12499                                 InvalidInstruction(2);
12500                         break;
12501                 }
12502                 case 0x8a:
12503                 {
12504                                 InvalidInstruction(2);
12505                         break;
12506                 }
12507                 case 0x8b:
12508                 {
12509                                 InvalidInstruction(2);
12510                         break;
12511                 }
12512                 case 0x8c:
12513                 {
12514                         sdwCyclesRemaining -= 9;
12515                                 bTemp2 = cpu.z80A + cpu.z80YH + (cpu.z80F & Z80_FLAG_CARRY);
12516                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
12517                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12518                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80YH | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
12519                                 InvalidInstruction(2);
12520                         break;
12521                 }
12522                 case 0x8d:
12523                 {
12524                         sdwCyclesRemaining -= 9;
12525                                 bTemp2 = cpu.z80A + cpu.z80YL + (cpu.z80F & Z80_FLAG_CARRY);
12526                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
12527                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12528                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80YL | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
12529                                 InvalidInstruction(2);
12530                         break;
12531                 }
12532                 case 0x8e:
12533                 {
12534                         sdwCyclesRemaining -= 19;
12535                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
12536                                 dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
12537                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
12538                                 while (psMemRead->lowAddr != 0xffffffff)
12539                                 {
12540                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
12541                                         {
12542                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12543                                                 if (psMemRead->memoryCall)
12544                                                 {
12545                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
12546                                                 }
12547                                                 else
12548                                                 {
12549                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
12550                                                 }
12551                                                 psMemRead = NULL;
12552                                                 break;
12553                                         }
12554                                         ++psMemRead;
12555                                 }
12556
12557                                 if (psMemRead)
12558                                 {
12559                                         bTemp = cpu.z80Base[dwAddr];
12560                                 }
12561
12562                                 bTemp2 = (cpu.z80F & Z80_FLAG_CARRY);
12563                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
12564                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12565                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
12566                                 cpu.z80A += bTemp + bTemp2;
12567                         break;
12568                 }
12569                 case 0x8f:
12570                 {
12571                                 InvalidInstruction(2);
12572                         break;
12573                 }
12574                 case 0x90:
12575                 {
12576                                 InvalidInstruction(2);
12577                         break;
12578                 }
12579                 case 0x91:
12580                 {
12581                                 InvalidInstruction(2);
12582                         break;
12583                 }
12584                 case 0x92:
12585                 {
12586                                 InvalidInstruction(2);
12587                         break;
12588                 }
12589                 case 0x93:
12590                 {
12591                                 InvalidInstruction(2);
12592                         break;
12593                 }
12594                 case 0x94:
12595                 {
12596                         sdwCyclesRemaining -= 9;
12597                                 bTemp2 = cpu.z80A - cpu.z80YH;
12598                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
12599                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12600                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80YH];
12601                                 InvalidInstruction(2);
12602                         break;
12603                 }
12604                 case 0x95:
12605                 {
12606                         sdwCyclesRemaining -= 9;
12607                                 bTemp2 = cpu.z80A - cpu.z80YL;
12608                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
12609                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12610                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80YL];
12611                                 InvalidInstruction(2);
12612                         break;
12613                 }
12614                 case 0x96:
12615                 {
12616                         sdwCyclesRemaining -= 19;
12617                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
12618                                 dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
12619                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
12620                                 while (psMemRead->lowAddr != 0xffffffff)
12621                                 {
12622                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
12623                                         {
12624                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12625                                                 if (psMemRead->memoryCall)
12626                                                 {
12627                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
12628                                                 }
12629                                                 else
12630                                                 {
12631                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
12632                                                 }
12633                                                 psMemRead = NULL;
12634                                                 break;
12635                                         }
12636                                         ++psMemRead;
12637                                 }
12638
12639                                 if (psMemRead)
12640                                 {
12641                                         bTemp = cpu.z80Base[dwAddr];
12642                                 }
12643
12644                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
12645                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12646                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
12647                                 cpu.z80A -= bTemp;
12648                         break;
12649                 }
12650                 case 0x97:
12651                 {
12652                                 InvalidInstruction(2);
12653                         break;
12654                 }
12655                 case 0x98:
12656                 {
12657                                 InvalidInstruction(2);
12658                         break;
12659                 }
12660                 case 0x99:
12661                 {
12662                                 InvalidInstruction(2);
12663                         break;
12664                 }
12665                 case 0x9a:
12666                 {
12667                                 InvalidInstruction(2);
12668                         break;
12669                 }
12670                 case 0x9b:
12671                 {
12672                                 InvalidInstruction(2);
12673                         break;
12674                 }
12675                 case 0x9c:
12676                 {
12677                         sdwCyclesRemaining -= 9;
12678                                 bTemp2 = cpu.z80A - cpu.z80YH - (cpu.z80F & Z80_FLAG_CARRY);
12679                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
12680                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12681                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80YH | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
12682                                 InvalidInstruction(2);
12683                         break;
12684                 }
12685                 case 0x9d:
12686                 {
12687                         sdwCyclesRemaining -= 9;
12688                                 bTemp2 = cpu.z80A - cpu.z80YL - (cpu.z80F & Z80_FLAG_CARRY);
12689                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
12690                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12691                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80YL | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
12692                                 InvalidInstruction(2);
12693                         break;
12694                 }
12695                 case 0x9e:
12696                 {
12697                         sdwCyclesRemaining -= 19;
12698                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
12699                                 dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
12700                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
12701                                 while (psMemRead->lowAddr != 0xffffffff)
12702                                 {
12703                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
12704                                         {
12705                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12706                                                 if (psMemRead->memoryCall)
12707                                                 {
12708                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
12709                                                 }
12710                                                 else
12711                                                 {
12712                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
12713                                                 }
12714                                                 psMemRead = NULL;
12715                                                 break;
12716                                         }
12717                                         ++psMemRead;
12718                                 }
12719
12720                                 if (psMemRead)
12721                                 {
12722                                         bTemp = cpu.z80Base[dwAddr];
12723                                 }
12724
12725                                 bTemp2 = cpu.z80A;
12726                                 cpu.z80A = cpu.z80A - bTemp - (cpu.z80F & Z80_FLAG_CARRY);
12727                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
12728                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12729                                                                 pbSubSbcTable[((UINT32) bTemp2 << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
12730                         break;
12731                 }
12732                 case 0x9f:
12733                 {
12734                                 InvalidInstruction(2);
12735                         break;
12736                 }
12737                 case 0xa0:
12738                 {
12739                                 InvalidInstruction(2);
12740                         break;
12741                 }
12742                 case 0xa1:
12743                 {
12744                                 InvalidInstruction(2);
12745                         break;
12746                 }
12747                 case 0xa2:
12748                 {
12749                                 InvalidInstruction(2);
12750                         break;
12751                 }
12752                 case 0xa3:
12753                 {
12754                                 InvalidInstruction(2);
12755                         break;
12756                 }
12757                 case 0xa4:
12758                 {
12759                         sdwCyclesRemaining -= 9;
12760                                 cpu.z80A &= cpu.z80YH;
12761                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
12762                                 cpu.z80F |= bPostANDFlags[cpu.z80A];
12763
12764                                 InvalidInstruction(2);
12765                         break;
12766                 }
12767                 case 0xa5:
12768                 {
12769                         sdwCyclesRemaining -= 9;
12770                                 cpu.z80A &= cpu.z80YL;
12771                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
12772                                 cpu.z80F |= bPostANDFlags[cpu.z80A];
12773
12774                                 InvalidInstruction(2);
12775                         break;
12776                 }
12777                 case 0xa6:
12778                 {
12779                         sdwCyclesRemaining -= 19;
12780                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
12781                                 dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
12782                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
12783                                 while (psMemRead->lowAddr != 0xffffffff)
12784                                 {
12785                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
12786                                         {
12787                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12788                                                 if (psMemRead->memoryCall)
12789                                                 {
12790                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
12791                                                 }
12792                                                 else
12793                                                 {
12794                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
12795                                                 }
12796                                                 psMemRead = NULL;
12797                                                 break;
12798                                         }
12799                                         ++psMemRead;
12800                                 }
12801
12802                                 if (psMemRead)
12803                                 {
12804                                         bTemp = cpu.z80Base[dwAddr];
12805                                 }
12806
12807                                 cpu.z80A &= bTemp;
12808                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
12809                                 cpu.z80F |= bPostANDFlags[cpu.z80A];
12810
12811                         break;
12812                 }
12813                 case 0xa7:
12814                 {
12815                                 InvalidInstruction(2);
12816                         break;
12817                 }
12818                 case 0xa8:
12819                 {
12820                                 InvalidInstruction(2);
12821                         break;
12822                 }
12823                 case 0xa9:
12824                 {
12825                                 InvalidInstruction(2);
12826                         break;
12827                 }
12828                 case 0xaa:
12829                 {
12830                                 InvalidInstruction(2);
12831                         break;
12832                 }
12833                 case 0xab:
12834                 {
12835                                 InvalidInstruction(2);
12836                         break;
12837                 }
12838                 case 0xac:
12839                 {
12840                         sdwCyclesRemaining -= 9;
12841                                 cpu.z80A ^= cpu.z80YH;
12842                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
12843                                 cpu.z80F |= bPostORFlags[cpu.z80A];
12844
12845                                 InvalidInstruction(2);
12846                         break;
12847                 }
12848                 case 0xad:
12849                 {
12850                         sdwCyclesRemaining -= 9;
12851                                 cpu.z80A ^= cpu.z80YL;
12852                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
12853                                 cpu.z80F |= bPostORFlags[cpu.z80A];
12854
12855                                 InvalidInstruction(2);
12856                         break;
12857                 }
12858                 case 0xae:
12859                 {
12860                         sdwCyclesRemaining -= 19;
12861                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
12862                                 dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
12863                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
12864                                 while (psMemRead->lowAddr != 0xffffffff)
12865                                 {
12866                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
12867                                         {
12868                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12869                                                 if (psMemRead->memoryCall)
12870                                                 {
12871                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
12872                                                 }
12873                                                 else
12874                                                 {
12875                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
12876                                                 }
12877                                                 psMemRead = NULL;
12878                                                 break;
12879                                         }
12880                                         ++psMemRead;
12881                                 }
12882
12883                                 if (psMemRead)
12884                                 {
12885                                         bTemp = cpu.z80Base[dwAddr];
12886                                 }
12887
12888                                 cpu.z80A ^= bTemp;
12889                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
12890                                 cpu.z80F |= bPostORFlags[cpu.z80A];
12891
12892                         break;
12893                 }
12894                 case 0xaf:
12895                 {
12896                                 InvalidInstruction(2);
12897                         break;
12898                 }
12899                 case 0xb0:
12900                 {
12901                                 InvalidInstruction(2);
12902                         break;
12903                 }
12904                 case 0xb1:
12905                 {
12906                                 InvalidInstruction(2);
12907                         break;
12908                 }
12909                 case 0xb2:
12910                 {
12911                                 InvalidInstruction(2);
12912                         break;
12913                 }
12914                 case 0xb3:
12915                 {
12916                                 InvalidInstruction(2);
12917                         break;
12918                 }
12919                 case 0xb4:
12920                 {
12921                         sdwCyclesRemaining -= 9;
12922                                 cpu.z80A |= cpu.z80YH;
12923                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
12924                                 cpu.z80F |= bPostORFlags[cpu.z80A];
12925
12926                                 InvalidInstruction(2);
12927                         break;
12928                 }
12929                 case 0xb5:
12930                 {
12931                         sdwCyclesRemaining -= 9;
12932                                 cpu.z80A |= cpu.z80YL;
12933                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
12934                                 cpu.z80F |= bPostORFlags[cpu.z80A];
12935
12936                                 InvalidInstruction(2);
12937                         break;
12938                 }
12939                 case 0xb6:
12940                 {
12941                         sdwCyclesRemaining -= 19;
12942                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
12943                                 dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
12944                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
12945                                 while (psMemRead->lowAddr != 0xffffffff)
12946                                 {
12947                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
12948                                         {
12949                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12950                                                 if (psMemRead->memoryCall)
12951                                                 {
12952                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
12953                                                 }
12954                                                 else
12955                                                 {
12956                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
12957                                                 }
12958                                                 psMemRead = NULL;
12959                                                 break;
12960                                         }
12961                                         ++psMemRead;
12962                                 }
12963
12964                                 if (psMemRead)
12965                                 {
12966                                         bTemp = cpu.z80Base[dwAddr];
12967                                 }
12968
12969                                 cpu.z80A |= bTemp;
12970                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
12971                                 cpu.z80F |= bPostORFlags[cpu.z80A];
12972
12973                         break;
12974                 }
12975                 case 0xb7:
12976                 {
12977                                 InvalidInstruction(2);
12978                         break;
12979                 }
12980                 case 0xb8:
12981                 {
12982                                 InvalidInstruction(2);
12983                         break;
12984                 }
12985                 case 0xb9:
12986                 {
12987                                 InvalidInstruction(2);
12988                         break;
12989                 }
12990                 case 0xba:
12991                 {
12992                                 InvalidInstruction(2);
12993                         break;
12994                 }
12995                 case 0xbb:
12996                 {
12997                                 InvalidInstruction(2);
12998                         break;
12999                 }
13000                 case 0xbc:
13001                 {
13002                         sdwCyclesRemaining -= 9;
13003                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
13004                                 cpu.z80F |= bPostORFlags[cpu.z80A];
13005
13006                                 InvalidInstruction(2);
13007                         break;
13008                 }
13009                 case 0xbd:
13010                 {
13011                         sdwCyclesRemaining -= 9;
13012                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
13013                                 cpu.z80F |= bPostORFlags[cpu.z80A];
13014
13015                                 InvalidInstruction(2);
13016                         break;
13017                 }
13018                 case 0xbe:
13019                 {
13020                         sdwCyclesRemaining -= 19;
13021                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
13022                                 dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
13023                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
13024                                 while (psMemRead->lowAddr != 0xffffffff)
13025                                 {
13026                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
13027                                         {
13028                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13029                                                 if (psMemRead->memoryCall)
13030                                                 {
13031                                                         bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
13032                                                 }
13033                                                 else
13034                                                 {
13035                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
13036                                                 }
13037                                                 psMemRead = NULL;
13038                                                 break;
13039                                         }
13040                                         ++psMemRead;
13041                                 }
13042
13043                                 if (psMemRead)
13044                                 {
13045                                         bTemp = cpu.z80Base[dwAddr];
13046                                 }
13047
13048                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
13049                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
13050                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
13051                         break;
13052                 }
13053                 case 0xbf:
13054                 {
13055                                 InvalidInstruction(2);
13056                         break;
13057                 }
13058                 case 0xc0:
13059                 {
13060                                 InvalidInstruction(2);
13061                         break;
13062                 }
13063                 case 0xc1:
13064                 {
13065                                 InvalidInstruction(2);
13066                         break;
13067                 }
13068                 case 0xc2:
13069                 {
13070                                 InvalidInstruction(2);
13071                         break;
13072                 }
13073                 case 0xc3:
13074                 {
13075                                 InvalidInstruction(2);
13076                         break;
13077                 }
13078                 case 0xc4:
13079                 {
13080                                 InvalidInstruction(2);
13081                         break;
13082                 }
13083                 case 0xc5:
13084                 {
13085                                 InvalidInstruction(2);
13086                         break;
13087                 }
13088                 case 0xc6:
13089                 {
13090                                 InvalidInstruction(2);
13091                         break;
13092                 }
13093                 case 0xc7:
13094                 {
13095                                 InvalidInstruction(2);
13096                         break;
13097                 }
13098                 case 0xc8:
13099                 {
13100                                 InvalidInstruction(2);
13101                         break;
13102                 }
13103                 case 0xc9:
13104                 {
13105                                 InvalidInstruction(2);
13106                         break;
13107                 }
13108                 case 0xca:
13109                 {
13110                                 InvalidInstruction(2);
13111                         break;
13112                 }
13113                 case 0xcb:
13114                 {
13115                                 DDFDCBHandler(1);
13116                         break;
13117                 }
13118                 case 0xcc:
13119                 {
13120                                 InvalidInstruction(2);
13121                         break;
13122                 }
13123                 case 0xcd:
13124                 {
13125                                 InvalidInstruction(2);
13126                         break;
13127                 }
13128                 case 0xce:
13129                 {
13130                                 InvalidInstruction(2);
13131                         break;
13132                 }
13133                 case 0xcf:
13134                 {
13135                                 InvalidInstruction(2);
13136                         break;
13137                 }
13138                 case 0xd0:
13139                 {
13140                                 InvalidInstruction(2);
13141                         break;
13142                 }
13143                 case 0xd1:
13144                 {
13145                                 InvalidInstruction(2);
13146                         break;
13147                 }
13148                 case 0xd2:
13149                 {
13150                                 InvalidInstruction(2);
13151                         break;
13152                 }
13153                 case 0xd3:
13154                 {
13155                                 InvalidInstruction(2);
13156                         break;
13157                 }
13158                 case 0xd4:
13159                 {
13160                                 InvalidInstruction(2);
13161                         break;
13162                 }
13163                 case 0xd5:
13164                 {
13165                                 InvalidInstruction(2);
13166                         break;
13167                 }
13168                 case 0xd6:
13169                 {
13170                                 InvalidInstruction(2);
13171                         break;
13172                 }
13173                 case 0xd7:
13174                 {
13175                                 InvalidInstruction(2);
13176                         break;
13177                 }
13178                 case 0xd8:
13179                 {
13180                                 InvalidInstruction(2);
13181                         break;
13182                 }
13183                 case 0xd9:
13184                 {
13185                                 InvalidInstruction(2);
13186                         break;
13187                 }
13188                 case 0xda:
13189                 {
13190                                 InvalidInstruction(2);
13191                         break;
13192                 }
13193                 case 0xdb:
13194                 {
13195                                 InvalidInstruction(2);
13196                         break;
13197                 }
13198                 case 0xdc:
13199                 {
13200                                 InvalidInstruction(2);
13201                         break;
13202                 }
13203                 case 0xdd:
13204                 {
13205                                 InvalidInstruction(2);
13206                         break;
13207                 }
13208                 case 0xde:
13209                 {
13210                                 InvalidInstruction(2);
13211                         break;
13212                 }
13213                 case 0xdf:
13214                 {
13215                                 InvalidInstruction(2);
13216                         break;
13217                 }
13218                 case 0xe0:
13219                 {
13220                                 InvalidInstruction(2);
13221                         break;
13222                 }
13223                 case 0xe1:
13224                 {
13225                         sdwCyclesRemaining -= 14;
13226                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
13227                                 while (psMemRead->lowAddr != 0xffffffff)
13228                                 {
13229                                         if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
13230                                         {
13231                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13232                                                 if (psMemRead->memoryCall)
13233                                                 {
13234                                                         cpu.z80IY = psMemRead->memoryCall(cpu.z80sp, psMemRead);
13235                                                         cpu.z80IY |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
13236                                                 }
13237                                                 else
13238                                                 {
13239                                                         cpu.z80IY = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
13240                                                         cpu.z80IY |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
13241                                                 }
13242                                                 psMemRead = NULL;
13243                                                 break;
13244                                         }
13245                                         ++psMemRead;
13246                                 }
13247
13248                                 if (psMemRead)
13249                                 {
13250                                         cpu.z80IY = cpu.z80Base[cpu.z80sp];
13251                                         cpu.z80IY |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
13252                                 }
13253
13254                                         cpu.z80sp += 2;
13255                                         pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
13256                         break;
13257                 }
13258                 case 0xe2:
13259                 {
13260                                 InvalidInstruction(2);
13261                         break;
13262                 }
13263                 case 0xe3:
13264                 {
13265                         sdwCyclesRemaining -= 23;
13266                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
13267                                 while (psMemRead->lowAddr != 0xffffffff)
13268                                 {
13269                                         if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
13270                                         {
13271                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13272                                                 if (psMemRead->memoryCall)
13273                                                 {
13274                                                         dwAddr = psMemRead->memoryCall(cpu.z80sp, psMemRead);
13275                                                         dwAddr |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
13276                                                 }
13277                                                 else
13278                                                 {
13279                                                         dwAddr = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
13280                                                         dwAddr |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
13281                                                 }
13282                                                 psMemRead = NULL;
13283                                                 break;
13284                                         }
13285                                         ++psMemRead;
13286                                 }
13287
13288                                 if (psMemRead)
13289                                 {
13290                                         dwAddr = cpu.z80Base[cpu.z80sp];
13291                                         dwAddr |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
13292                                 }
13293
13294                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
13295                                 while (psMemWrite->lowAddr != 0xffffffff)
13296                                 {
13297                                         if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
13298                                         {
13299                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13300                                                 if (psMemWrite->memoryCall)
13301                                                 {
13302                                                         psMemWrite->memoryCall(cpu.z80sp, (cpu.z80IY & 0xff), psMemWrite);
13303                                                         psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80IY >> 8), psMemWrite);
13304                                                 }
13305                                                 else
13306                                                 {
13307                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80IY;
13308                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80IY >> 8;
13309                                                 }
13310                                                 psMemWrite = NULL;
13311                                                 break;
13312                                         }
13313                                         ++psMemWrite;
13314                                 }
13315
13316                                 if (psMemWrite)
13317                                 {
13318                                         cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80IY;
13319                                         cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80IY >> 8);
13320                                 }
13321
13322                                 cpu.z80IY = dwAddr;
13323                         break;
13324                 }
13325                 case 0xe4:
13326                 {
13327                                 InvalidInstruction(2);
13328                         break;
13329                 }
13330                 case 0xe5:
13331                 {
13332                         sdwCyclesRemaining -= 15;
13333                                         cpu.z80sp -= 2;
13334                                         pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
13335                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
13336                                 while (psMemWrite->lowAddr != 0xffffffff)
13337                                 {
13338                                         if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
13339                                         {
13340                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13341                                                 if (psMemWrite->memoryCall)
13342                                                 {
13343                                                         psMemWrite->memoryCall(cpu.z80sp, (cpu.z80IY & 0xff), psMemWrite);
13344                                                         psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80IY >> 8), psMemWrite);
13345                                                 }
13346                                                 else
13347                                                 {
13348                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80IY;
13349                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80IY >> 8;
13350                                                 }
13351                                                 psMemWrite = NULL;
13352                                                 break;
13353                                         }
13354                                         ++psMemWrite;
13355                                 }
13356
13357                                 if (psMemWrite)
13358                                 {
13359                                         cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80IY;
13360                                         cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80IY >> 8);
13361                                 }
13362
13363                         break;
13364                 }
13365                 case 0xe6:
13366                 {
13367                                 InvalidInstruction(2);
13368                         break;
13369                 }
13370                 case 0xe7:
13371                 {
13372                                 InvalidInstruction(2);
13373                         break;
13374                 }
13375                 case 0xe8:
13376                 {
13377                                 InvalidInstruction(2);
13378                         break;
13379                 }
13380                 case 0xe9:
13381                 {
13382                         sdwCyclesRemaining -= 8;
13383                                 pbPC = cpu.z80Base + cpu.z80IY;
13384                         break;
13385                 }
13386                 case 0xea:
13387                 {
13388                                 InvalidInstruction(2);
13389                         break;
13390                 }
13391                 case 0xeb:
13392                 {
13393                                 InvalidInstruction(2);
13394                         break;
13395                 }
13396                 case 0xec:
13397                 {
13398                                 InvalidInstruction(2);
13399                         break;
13400                 }
13401                 case 0xed:
13402                 {
13403                                 InvalidInstruction(2);
13404                         break;
13405                 }
13406                 case 0xee:
13407                 {
13408                                 InvalidInstruction(2);
13409                         break;
13410                 }
13411                 case 0xef:
13412                 {
13413                                 InvalidInstruction(2);
13414                         break;
13415                 }
13416                 case 0xf0:
13417                 {
13418                                 InvalidInstruction(2);
13419                         break;
13420                 }
13421                 case 0xf1:
13422                 {
13423                                 InvalidInstruction(2);
13424                         break;
13425                 }
13426                 case 0xf2:
13427                 {
13428                                 InvalidInstruction(2);
13429                         break;
13430                 }
13431                 case 0xf3:
13432                 {
13433                                 InvalidInstruction(2);
13434                         break;
13435                 }
13436                 case 0xf4:
13437                 {
13438                                 InvalidInstruction(2);
13439                         break;
13440                 }
13441                 case 0xf5:
13442                 {
13443                                 InvalidInstruction(2);
13444                         break;
13445                 }
13446                 case 0xf6:
13447                 {
13448                                 InvalidInstruction(2);
13449                         break;
13450                 }
13451                 case 0xf7:
13452                 {
13453                                 InvalidInstruction(2);
13454                         break;
13455                 }
13456                 case 0xf8:
13457                 {
13458                                 InvalidInstruction(2);
13459                         break;
13460                 }
13461                 case 0xf9:
13462                 {
13463                         sdwCyclesRemaining -= 10;
13464                                 cpu.z80sp = cpu.z80IY;
13465                         break;
13466                 }
13467                 case 0xfa:
13468                 {
13469                                 InvalidInstruction(2);
13470                         break;
13471                 }
13472                 case 0xfb:
13473                 {
13474                                 InvalidInstruction(2);
13475                         break;
13476                 }
13477                 case 0xfc:
13478                 {
13479                                 InvalidInstruction(2);
13480                         break;
13481                 }
13482                 case 0xfd:
13483                 {
13484                                 InvalidInstruction(2);
13485                         break;
13486                 }
13487                 case 0xfe:
13488                 {
13489                                 InvalidInstruction(2);
13490                         break;
13491                 }
13492                 case 0xff:
13493                 {
13494                                 InvalidInstruction(2);
13495                         break;
13496                 }
13497         }
13498 }
13499 /* Main execution entry point */
13500
13501 UINT32 mz80exec(UINT32 dwCycles)
13502 {
13503         UINT8 bOpcode;
13504
13505         dwReturnCode = 0x80000000; /* Assume it'll work */
13506         sdwCyclesRemaining = dwCycles;
13507         dwOriginalCycles = dwCycles;
13508                 if (cpu.z80halted)
13509                 {
13510                 dwElapsedTicks += dwCycles;
13511                 return(0x80000000);
13512                 }
13513
13514         pbPC = cpu.z80Base + cpu.z80pc;
13515
13516         while (sdwCyclesRemaining > 0)
13517         {
13518                 bOpcode = *pbPC++;
13519                 switch (bOpcode)
13520                 {
13521                         case 0x00:
13522                         {
13523                                 sdwCyclesRemaining -= 4;
13524                                 /* Intentionally not doing anything - NOP! */
13525                                 break;
13526                         }
13527                         case 0x01:
13528                         {
13529                                 sdwCyclesRemaining -= 10;
13530                                 cpu.z80BC = *pbPC++;    /* LSB First */
13531                                 cpu.z80BC |= (((UINT32) *pbPC++ << 8)); /* Now the MSB */
13532                                 break;
13533                         }
13534                         case 0x02:
13535                         {
13536                                 sdwCyclesRemaining -= 7;
13537                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
13538                                 while (psMemWrite->lowAddr != 0xffffffff)
13539                                 {
13540                                         if ((cpu.z80BC >= psMemWrite->lowAddr) && (cpu.z80BC <= psMemWrite->highAddr))
13541                                         {
13542                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13543                                                 if (psMemWrite->memoryCall)
13544                                                 {
13545                                                         psMemWrite->memoryCall(cpu.z80BC, cpu.z80A, psMemWrite);
13546                                                 }
13547                                                 else
13548                                                 {
13549                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80BC - psMemWrite->lowAddr)) = cpu.z80A;
13550                                                 }
13551                                                 psMemWrite = NULL;
13552                                                 break;
13553                                         }
13554                                         ++psMemWrite;
13555                                 }
13556
13557                                 if (psMemWrite)
13558                                 {
13559                                         cpu.z80Base[cpu.z80BC] = (UINT8) cpu.z80A;
13560                                 }
13561
13562                                 break;
13563                         }
13564                         case 0x03:
13565                         {
13566                                 sdwCyclesRemaining -= 6;
13567                                 cpu.z80BC++;
13568                                 cpu.z80BC &= 0xffff;
13569                                 break;
13570                         }
13571                         case 0x04:
13572                         {
13573                                 sdwCyclesRemaining -= 4;
13574                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
13575                                 cpu.z80F |= bPostIncFlags[cpu.z80B++];
13576                                 break;
13577                         }
13578                         case 0x05:
13579                         {
13580                                 sdwCyclesRemaining -= 4;
13581                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
13582                                 cpu.z80F |= bPostDecFlags[cpu.z80B--];
13583                                 break;
13584                         }
13585                         case 0x06:
13586                         {
13587                                 sdwCyclesRemaining -= 7;
13588                                 cpu.z80B = *pbPC++;     /* Get immediate byte into register */
13589                                 break;
13590                         }
13591                         case 0x07:
13592                         {
13593                                 sdwCyclesRemaining -= 4;
13594                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
13595                                 cpu.z80F |= (cpu.z80A >> 7);
13596                                 cpu.z80A = (cpu.z80A << 1) | (cpu.z80A >> 7);
13597                                 break;
13598                         }
13599                         case 0x08:
13600                         {
13601                                 sdwCyclesRemaining -= 4;
13602                                 dwAddr = (UINT32) cpu.z80AF;
13603                                 cpu.z80AF = cpu.z80afprime;
13604                                 cpu.z80afprime = dwAddr;
13605                                 break;
13606                         }
13607                         case 0x09:
13608                         {
13609                                 sdwCyclesRemaining -= 11;
13610                         cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
13611                         dwTemp = cpu.z80HL + cpu.z80BC;
13612                         cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80HL ^ dwTemp ^ cpu.z80BC) >> 8) & Z80_FLAG_HALF_CARRY);
13613                         cpu.z80HL = dwTemp & 0xffff;
13614                                 break;
13615                         }
13616                         case 0x0a:
13617                         {
13618                                 sdwCyclesRemaining -= 7;
13619                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
13620                                 while (psMemRead->lowAddr != 0xffffffff)
13621                                 {
13622                                         if ((cpu.z80BC >= psMemRead->lowAddr) && (cpu.z80BC <= psMemRead->highAddr))
13623                                         {
13624                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13625                                                 if (psMemRead->memoryCall)
13626                                                 {
13627                                                         cpu.z80A = psMemRead->memoryCall(cpu.z80BC, psMemRead);
13628                                                 }
13629                                                 else
13630                                                 {
13631                                                         cpu.z80A = *((UINT8 *) psMemRead->pUserArea + (cpu.z80BC - psMemRead->lowAddr));
13632                                                 }
13633                                                 psMemRead = NULL;
13634                                                 break;
13635                                         }
13636                                         ++psMemRead;
13637                                 }
13638
13639                                 if (psMemRead)
13640                                 {
13641                                         cpu.z80A = cpu.z80Base[cpu.z80BC];
13642                                 }
13643
13644                                 break;
13645                         }
13646                         case 0x0b:
13647                         {
13648                                 sdwCyclesRemaining -= 6;
13649                                 cpu.z80BC--;
13650                                 cpu.z80BC &= 0xffff;
13651                                 break;
13652                         }
13653                         case 0x0c:
13654                         {
13655                                 sdwCyclesRemaining -= 4;
13656                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
13657                                 cpu.z80F |= bPostIncFlags[cpu.z80C++];
13658                                 break;
13659                         }
13660                         case 0x0d:
13661                         {
13662                                 sdwCyclesRemaining -= 4;
13663                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
13664                                 cpu.z80F |= bPostDecFlags[cpu.z80C--];
13665                                 break;
13666                         }
13667                         case 0x0e:
13668                         {
13669                                 sdwCyclesRemaining -= 7;
13670                                 cpu.z80C = *pbPC++;     /* Get immediate byte into register */
13671                                 break;
13672                         }
13673                         case 0x0f:
13674                         {
13675                                 sdwCyclesRemaining -= 4;
13676                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
13677                                 cpu.z80F |= (cpu.z80A & Z80_FLAG_CARRY);
13678                                 cpu.z80A = (cpu.z80A >> 1) | (cpu.z80A << 7);
13679                                 break;
13680                         }
13681                         case 0x10:
13682                         {
13683                                 sdwCyclesRemaining -= 8;
13684                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
13685                                 if (--cpu.z80B)
13686                                 {
13687                                         dwElapsedTicks += 5;    /* 5 More for jump taken */
13688                                         cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13689                                         sdwAddr = (sdwAddr + (INT32) cpu.z80pc) & 0xffff;
13690                                         pbPC = cpu.z80Base + sdwAddr;   /* Normalize the address */
13691                                 }
13692                                 break;
13693                         }
13694                         case 0x11:
13695                         {
13696                                 sdwCyclesRemaining -= 10;
13697                                 cpu.z80DE = *pbPC++;    /* LSB First */
13698                                 cpu.z80DE |= (((UINT32) *pbPC++ << 8)); /* Now the MSB */
13699                                 break;
13700                         }
13701                         case 0x12:
13702                         {
13703                                 sdwCyclesRemaining -= 7;
13704                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
13705                                 while (psMemWrite->lowAddr != 0xffffffff)
13706                                 {
13707                                         if ((cpu.z80DE >= psMemWrite->lowAddr) && (cpu.z80DE <= psMemWrite->highAddr))
13708                                         {
13709                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13710                                                 if (psMemWrite->memoryCall)
13711                                                 {
13712                                                         psMemWrite->memoryCall(cpu.z80DE, cpu.z80A, psMemWrite);
13713                                                 }
13714                                                 else
13715                                                 {
13716                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80DE - psMemWrite->lowAddr)) = cpu.z80A;
13717                                                 }
13718                                                 psMemWrite = NULL;
13719                                                 break;
13720                                         }
13721                                         ++psMemWrite;
13722                                 }
13723
13724                                 if (psMemWrite)
13725                                 {
13726                                         cpu.z80Base[cpu.z80DE] = (UINT8) cpu.z80A;
13727                                 }
13728
13729                                 break;
13730                         }
13731                         case 0x13:
13732                         {
13733                                 sdwCyclesRemaining -= 6;
13734                                 cpu.z80DE++;
13735                                 cpu.z80DE &= 0xffff;
13736                                 break;
13737                         }
13738                         case 0x14:
13739                         {
13740                                 sdwCyclesRemaining -= 4;
13741                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
13742                                 cpu.z80F |= bPostIncFlags[cpu.z80D++];
13743                                 break;
13744                         }
13745                         case 0x15:
13746                         {
13747                                 sdwCyclesRemaining -= 4;
13748                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
13749                                 cpu.z80F |= bPostDecFlags[cpu.z80D--];
13750                                 break;
13751                         }
13752                         case 0x16:
13753                         {
13754                                 sdwCyclesRemaining -= 7;
13755                                 cpu.z80D = *pbPC++;     /* Get immediate byte into register */
13756                                 break;
13757                         }
13758                         case 0x17:
13759                         {
13760                                 sdwCyclesRemaining -= 4;
13761                                 bTemp = cpu.z80A >> 7;
13762                                 cpu.z80A = (cpu.z80A << 1) | (cpu.z80F & Z80_FLAG_CARRY);
13763                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY)) | bTemp;
13764                                 break;
13765                         }
13766                         case 0x18:
13767                         {
13768                                 sdwCyclesRemaining -= 12;
13769                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
13770                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13771                                 sdwAddr = (sdwAddr + (INT32) cpu.z80pc) & 0xffff;
13772                                 {
13773                                 sdwCyclesRemaining -= 5;
13774                                         pbPC = cpu.z80Base + sdwAddr;   /* Normalize the address */
13775                                 }
13776                                 break;
13777                         }
13778                         case 0x19:
13779                         {
13780                                 sdwCyclesRemaining -= 11;
13781                         cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
13782                         dwTemp = cpu.z80HL + cpu.z80DE;
13783                         cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80HL ^ dwTemp ^ cpu.z80DE) >> 8) & Z80_FLAG_HALF_CARRY);
13784                         cpu.z80HL = dwTemp & 0xffff;
13785                                 break;
13786                         }
13787                         case 0x1a:
13788                         {
13789                                 sdwCyclesRemaining -= 7;
13790                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
13791                                 while (psMemRead->lowAddr != 0xffffffff)
13792                                 {
13793                                         if ((cpu.z80DE >= psMemRead->lowAddr) && (cpu.z80DE <= psMemRead->highAddr))
13794                                         {
13795                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13796                                                 if (psMemRead->memoryCall)
13797                                                 {
13798                                                         cpu.z80A = psMemRead->memoryCall(cpu.z80DE, psMemRead);
13799                                                 }
13800                                                 else
13801                                                 {
13802                                                         cpu.z80A = *((UINT8 *) psMemRead->pUserArea + (cpu.z80DE - psMemRead->lowAddr));
13803                                                 }
13804                                                 psMemRead = NULL;
13805                                                 break;
13806                                         }
13807                                         ++psMemRead;
13808                                 }
13809
13810                                 if (psMemRead)
13811                                 {
13812                                         cpu.z80A = cpu.z80Base[cpu.z80DE];
13813                                 }
13814
13815                                 break;
13816                         }
13817                         case 0x1b:
13818                         {
13819                                 sdwCyclesRemaining -= 6;
13820                                 cpu.z80DE--;
13821                                 cpu.z80DE &= 0xffff;
13822                                 break;
13823                         }
13824                         case 0x1c:
13825                         {
13826                                 sdwCyclesRemaining -= 4;
13827                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
13828                                 cpu.z80F |= bPostIncFlags[cpu.z80E++];
13829                                 break;
13830                         }
13831                         case 0x1d:
13832                         {
13833                                 sdwCyclesRemaining -= 4;
13834                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
13835                                 cpu.z80F |= bPostDecFlags[cpu.z80E--];
13836                                 break;
13837                         }
13838                         case 0x1e:
13839                         {
13840                                 sdwCyclesRemaining -= 7;
13841                                 cpu.z80E = *pbPC++;     /* Get immediate byte into register */
13842                                 break;
13843                         }
13844                         case 0x1f:
13845                         {
13846                                 sdwCyclesRemaining -= 4;
13847                                 bTemp = (cpu.z80F & Z80_FLAG_CARRY) << 7;
13848                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY)) | (cpu.z80A & Z80_FLAG_CARRY);
13849                                 cpu.z80A = ((cpu.z80A >> 1) | bTemp);
13850                                 break;
13851                         }
13852                         case 0x20:
13853                         {
13854                                 sdwCyclesRemaining -= 7;
13855                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
13856                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13857                                 sdwAddr = (sdwAddr + (INT32) cpu.z80pc) & 0xffff;
13858                                 if (!(cpu.z80F & Z80_FLAG_ZERO))
13859                                 {
13860                                 sdwCyclesRemaining -= 5;
13861                                         pbPC = cpu.z80Base + sdwAddr;   /* Normalize the address */
13862                                 }
13863                                 break;
13864                         }
13865                         case 0x21:
13866                         {
13867                                 sdwCyclesRemaining -= 10;
13868                                 cpu.z80HL = *pbPC++;    /* LSB First */
13869                                 cpu.z80HL |= (((UINT32) *pbPC++ << 8)); /* Now the MSB */
13870                                 break;
13871                         }
13872                         case 0x22:
13873                         {
13874                                 sdwCyclesRemaining -= 16;
13875                                 dwTemp = *pbPC++;
13876                                 dwTemp |= ((UINT32) *pbPC++ << 8);
13877                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
13878                                 while (psMemWrite->lowAddr != 0xffffffff)
13879                                 {
13880                                         if ((dwTemp >= psMemWrite->lowAddr) && (dwTemp <= psMemWrite->highAddr))
13881                                         {
13882                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13883                                                 if (psMemWrite->memoryCall)
13884                                                 {
13885                                                         psMemWrite->memoryCall(dwTemp, (cpu.z80HL & 0xff), psMemWrite);
13886                                                         psMemWrite->memoryCall(dwTemp + 1, (cpu.z80HL >> 8), psMemWrite);
13887                                                 }
13888                                                 else
13889                                                 {
13890                                                         *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr)) = cpu.z80HL;
13891                                                         *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr) + 1) = cpu.z80HL >> 8;
13892                                                 }
13893                                                 psMemWrite = NULL;
13894                                                 break;
13895                                         }
13896                                         ++psMemWrite;
13897                                 }
13898
13899                                 if (psMemWrite)
13900                                 {
13901                                         cpu.z80Base[dwTemp] = (UINT8) cpu.z80HL;
13902                                         cpu.z80Base[dwTemp + 1] = (UINT8) ((UINT32) cpu.z80HL >> 8);
13903                                 }
13904
13905                                 break;
13906                         }
13907                         case 0x23:
13908                         {
13909                                 sdwCyclesRemaining -= 6;
13910                                 cpu.z80HL++;
13911                                 cpu.z80HL &= 0xffff;
13912                                 break;
13913                         }
13914                         case 0x24:
13915                         {
13916                                 sdwCyclesRemaining -= 4;
13917                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
13918                                 cpu.z80F |= bPostIncFlags[cpu.z80H++];
13919                                 break;
13920                         }
13921                         case 0x25:
13922                         {
13923                                 sdwCyclesRemaining -= 4;
13924                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
13925                                 cpu.z80F |= bPostDecFlags[cpu.z80H--];
13926                                 break;
13927                         }
13928                         case 0x26:
13929                         {
13930                                 sdwCyclesRemaining -= 7;
13931                                 cpu.z80H = *pbPC++;     /* Get immediate byte into register */
13932                                 break;
13933                         }
13934                         case 0x27:
13935                         {
13936                                 sdwCyclesRemaining -= 4;
13937                                 dwAddr = (((cpu.z80F & Z80_FLAG_CARRY) | 
13938                                                 ((cpu.z80F & Z80_FLAG_HALF_CARRY) >> 3) | 
13939                                                 ((cpu.z80F & Z80_FLAG_NEGATIVE) << 1)) << 8) | cpu.z80A;
13940                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
13941                                 cpu.z80F |= (wDAATable[dwAddr] >> 8);
13942                                 cpu.z80A = wDAATable[dwAddr] & 0xff;
13943                                 break;
13944                         }
13945                         case 0x28:
13946                         {
13947                                 sdwCyclesRemaining -= 7;
13948                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
13949                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13950                                 sdwAddr = (sdwAddr + (INT32) cpu.z80pc) & 0xffff;
13951                                 if (cpu.z80F & Z80_FLAG_ZERO)
13952                                 {
13953                                 sdwCyclesRemaining -= 5;
13954                                         pbPC = cpu.z80Base + sdwAddr;   /* Normalize the address */
13955                                 }
13956                                 break;
13957                         }
13958                         case 0x29:
13959                         {
13960                                 sdwCyclesRemaining -= 11;
13961                         cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
13962                         dwTemp = cpu.z80HL + cpu.z80HL;
13963                         cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80HL ^ dwTemp ^ cpu.z80HL) >> 8) & Z80_FLAG_HALF_CARRY);
13964                         cpu.z80HL = dwTemp & 0xffff;
13965                                 break;
13966                         }
13967                         case 0x2a:
13968                         {
13969                                 sdwCyclesRemaining -= 16;
13970                                 dwAddr = *pbPC++;
13971                                 dwAddr |= ((UINT32) *pbPC++ << 8);
13972                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
13973                                 while (psMemRead->lowAddr != 0xffffffff)
13974                                 {
13975                                         if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
13976                                         {
13977                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13978                                                 if (psMemRead->memoryCall)
13979                                                 {
13980                                                         cpu.z80HL = psMemRead->memoryCall(dwAddr, psMemRead);
13981                                                         cpu.z80HL |= (UINT32) ((UINT32) psMemRead->memoryCall(dwAddr + 1, psMemRead) << 8);
13982                                                 }
13983                                                 else
13984                                                 {
13985                                                         cpu.z80HL = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
13986                                                         cpu.z80HL |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr + 1)) << 8);
13987                                                 }
13988                                                 psMemRead = NULL;
13989                                                 break;
13990                                         }
13991                                         ++psMemRead;
13992                                 }
13993
13994                                 if (psMemRead)
13995                                 {
13996                                         cpu.z80HL = cpu.z80Base[dwAddr];
13997                                         cpu.z80HL |= (UINT32) ((UINT32) cpu.z80Base[dwAddr + 1] << 8);
13998                                 }
13999
14000                                 break;
14001                         }
14002                         case 0x2b:
14003                         {
14004                                 sdwCyclesRemaining -= 6;
14005                                 cpu.z80HL--;
14006                                 cpu.z80HL &= 0xffff;
14007                                 break;
14008                         }
14009                         case 0x2c:
14010                         {
14011                                 sdwCyclesRemaining -= 4;
14012                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
14013                                 cpu.z80F |= bPostIncFlags[cpu.z80L++];
14014                                 break;
14015                         }
14016                         case 0x2d:
14017                         {
14018                                 sdwCyclesRemaining -= 4;
14019                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
14020                                 cpu.z80F |= bPostDecFlags[cpu.z80L--];
14021                                 break;
14022                         }
14023                         case 0x2e:
14024                         {
14025                                 sdwCyclesRemaining -= 7;
14026                                 cpu.z80L = *pbPC++;     /* Get immediate byte into register */
14027                                 break;
14028                         }
14029                         case 0x2f:
14030                         {
14031                                 sdwCyclesRemaining -= 4;
14032                                 cpu.z80A ^= 0xff;
14033                                 cpu.z80F |= (Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
14034                                 break;
14035                         }
14036                         case 0x30:
14037                         {
14038                                 sdwCyclesRemaining -= 7;
14039                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
14040                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14041                                 sdwAddr = (sdwAddr + (INT32) cpu.z80pc) & 0xffff;
14042                                 if (!(cpu.z80F & Z80_FLAG_CARRY))
14043                                 {
14044                                 sdwCyclesRemaining -= 5;
14045                                         pbPC = cpu.z80Base + sdwAddr;   /* Normalize the address */
14046                                 }
14047                                 break;
14048                         }
14049                         case 0x31:
14050                         {
14051                                 sdwCyclesRemaining -= 10;
14052                                 cpu.z80sp = *pbPC++;    /* LSB First */
14053                                 cpu.z80sp |= (((UINT32) *pbPC++ << 8)); /* Now the MSB */
14054                                 break;
14055                         }
14056                         case 0x32:
14057                         {
14058                                 sdwCyclesRemaining -= 13;
14059                                 dwTemp = *pbPC++;
14060                                 dwTemp |= ((UINT32) *pbPC++ << 8);
14061                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
14062                                 while (psMemWrite->lowAddr != 0xffffffff)
14063                                 {
14064                                         if ((dwTemp >= psMemWrite->lowAddr) && (dwTemp <= psMemWrite->highAddr))
14065                                         {
14066                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14067                                                 if (psMemWrite->memoryCall)
14068                                                 {
14069                                                         psMemWrite->memoryCall(dwTemp, cpu.z80A, psMemWrite);
14070                                                 }
14071                                                 else
14072                                                 {
14073                                                         *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr)) = cpu.z80A;
14074                                                 }
14075                                                 psMemWrite = NULL;
14076                                                 break;
14077                                         }
14078                                         ++psMemWrite;
14079                                 }
14080
14081                                 if (psMemWrite)
14082                                 {
14083                                         cpu.z80Base[dwTemp] = (UINT8) cpu.z80A;
14084                                 }
14085
14086                                 break;
14087                         }
14088                         case 0x33:
14089                         {
14090                                 sdwCyclesRemaining -= 6;
14091                                 cpu.z80sp++;
14092                                 cpu.z80sp &= 0xffff;
14093                                 break;
14094                         }
14095                         case 0x34:
14096                         {
14097                                 sdwCyclesRemaining -= 11;
14098                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
14099                                 while (psMemRead->lowAddr != 0xffffffff)
14100                                 {
14101                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
14102                                         {
14103                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14104                                                 if (psMemRead->memoryCall)
14105                                                 {
14106                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
14107                                                 }
14108                                                 else
14109                                                 {
14110                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
14111                                                 }
14112                                                 psMemRead = NULL;
14113                                                 break;
14114                                         }
14115                                         ++psMemRead;
14116                                 }
14117
14118                                 if (psMemRead)
14119                                 {
14120                                         bTemp = cpu.z80Base[cpu.z80HL];
14121                                 }
14122
14123                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
14124                                 cpu.z80F |= bPostIncFlags[bTemp];
14125                                 bTemp++;
14126                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
14127                                 while (psMemWrite->lowAddr != 0xffffffff)
14128                                 {
14129                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
14130                                         {
14131                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14132                                                 if (psMemWrite->memoryCall)
14133                                                 {
14134                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
14135                                                 }
14136                                                 else
14137                                                 {
14138                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
14139                                                 }
14140                                                 psMemWrite = NULL;
14141                                                 break;
14142                                         }
14143                                         ++psMemWrite;
14144                                 }
14145
14146                                 if (psMemWrite)
14147                                 {
14148                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
14149                                 }
14150
14151                                 break;
14152                         }
14153                         case 0x35:
14154                         {
14155                                 sdwCyclesRemaining -= 11;
14156                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
14157                                 while (psMemRead->lowAddr != 0xffffffff)
14158                                 {
14159                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
14160                                         {
14161                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14162                                                 if (psMemRead->memoryCall)
14163                                                 {
14164                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
14165                                                 }
14166                                                 else
14167                                                 {
14168                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
14169                                                 }
14170                                                 psMemRead = NULL;
14171                                                 break;
14172                                         }
14173                                         ++psMemRead;
14174                                 }
14175
14176                                 if (psMemRead)
14177                                 {
14178                                         bTemp = cpu.z80Base[cpu.z80HL];
14179                                 }
14180
14181                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
14182                                 cpu.z80F |= bPostDecFlags[bTemp];
14183                                 bTemp--;
14184                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
14185                                 while (psMemWrite->lowAddr != 0xffffffff)
14186                                 {
14187                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
14188                                         {
14189                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14190                                                 if (psMemWrite->memoryCall)
14191                                                 {
14192                                                         psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
14193                                                 }
14194                                                 else
14195                                                 {
14196                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
14197                                                 }
14198                                                 psMemWrite = NULL;
14199                                                 break;
14200                                         }
14201                                         ++psMemWrite;
14202                                 }
14203
14204                                 if (psMemWrite)
14205                                 {
14206                                         cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
14207                                 }
14208
14209                                 break;
14210                         }
14211                         case 0x36:
14212                         {
14213                                 sdwCyclesRemaining -= 10;
14214                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
14215                                 while (psMemWrite->lowAddr != 0xffffffff)
14216                                 {
14217                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
14218                                         {
14219                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14220                                                 if (psMemWrite->memoryCall)
14221                                                 {
14222                                                         psMemWrite->memoryCall(cpu.z80HL, *pbPC++, psMemWrite);
14223                                                 }
14224                                                 else
14225                                                 {
14226                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = *pbPC++;
14227                                                 }
14228                                                 psMemWrite = NULL;
14229                                                 break;
14230                                         }
14231                                         ++psMemWrite;
14232                                 }
14233
14234                                 if (psMemWrite)
14235                                 {
14236                                         cpu.z80Base[cpu.z80HL] = (UINT8) *pbPC++;
14237                                 }
14238
14239                                 break;
14240                         }
14241                         case 0x37:
14242                         {
14243                                 sdwCyclesRemaining -= 4;
14244                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE);
14245                                 cpu.z80F |= Z80_FLAG_CARRY;
14246                                 break;
14247                         }
14248                         case 0x38:
14249                         {
14250                                 sdwCyclesRemaining -= 7;
14251                                 sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
14252                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14253                                 sdwAddr = (sdwAddr + (INT32) cpu.z80pc) & 0xffff;
14254                                 if (cpu.z80F & Z80_FLAG_CARRY)
14255                                 {
14256                                 sdwCyclesRemaining -= 5;
14257                                         pbPC = cpu.z80Base + sdwAddr;   /* Normalize the address */
14258                                 }
14259                                 break;
14260                         }
14261                         case 0x39:
14262                         {
14263                                 sdwCyclesRemaining -= 11;
14264                         cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
14265                         dwTemp = cpu.z80HL + cpu.z80sp;
14266                         cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80HL ^ dwTemp ^ cpu.z80sp) >> 8) & Z80_FLAG_HALF_CARRY);
14267                         cpu.z80HL = dwTemp & 0xffff;
14268                                 break;
14269                         }
14270                         case 0x3a:
14271                         {
14272                                 sdwCyclesRemaining -= 13;
14273                                 dwTemp = *pbPC++;
14274                                 dwTemp |= (((UINT32) *pbPC++) << 8);
14275                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
14276                                 while (psMemRead->lowAddr != 0xffffffff)
14277                                 {
14278                                         if ((dwTemp >= psMemRead->lowAddr) && (dwTemp <= psMemRead->highAddr))
14279                                         {
14280                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14281                                                 if (psMemRead->memoryCall)
14282                                                 {
14283                                                         cpu.z80A = psMemRead->memoryCall(dwTemp, psMemRead);
14284                                                 }
14285                                                 else
14286                                                 {
14287                                                         cpu.z80A = *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr));
14288                                                 }
14289                                                 psMemRead = NULL;
14290                                                 break;
14291                                         }
14292                                         ++psMemRead;
14293                                 }
14294
14295                                 if (psMemRead)
14296                                 {
14297                                         cpu.z80A = cpu.z80Base[dwTemp];
14298                                 }
14299
14300                                 break;
14301                         }
14302                         case 0x3b:
14303                         {
14304                                 sdwCyclesRemaining -= 6;
14305                                 cpu.z80sp--;
14306                                 cpu.z80sp &= 0xffff;
14307                                 break;
14308                         }
14309                         case 0x3c:
14310                         {
14311                                 sdwCyclesRemaining -= 4;
14312                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
14313                                 cpu.z80F |= bPostIncFlags[cpu.z80A++];
14314                                 break;
14315                         }
14316                         case 0x3d:
14317                         {
14318                                 sdwCyclesRemaining -= 4;
14319                                 cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
14320                                 cpu.z80F |= bPostDecFlags[cpu.z80A--];
14321                                 break;
14322                         }
14323                         case 0x3e:
14324                         {
14325                                 sdwCyclesRemaining -= 7;
14326                                 cpu.z80A = *pbPC++;     /* Get immediate byte into register */
14327                                 break;
14328                         }
14329                         case 0x3f:
14330                         {
14331                                 sdwCyclesRemaining -= 4;
14332                                 bTemp = (cpu.z80F & Z80_FLAG_CARRY) << 4;
14333                                 cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE);
14334                                 cpu.z80F ^= Z80_FLAG_CARRY;
14335                                 break;
14336                         }
14337                         case 0x40:
14338                         {
14339                                 sdwCyclesRemaining -= 4;
14340                                 break;
14341                         }
14342                         case 0x41:
14343                         {
14344                                 sdwCyclesRemaining -= 4;
14345                                 cpu.z80B = cpu.z80C;
14346                                 break;
14347                         }
14348                         case 0x42:
14349                         {
14350                                 sdwCyclesRemaining -= 4;
14351                                 cpu.z80B = cpu.z80D;
14352                                 break;
14353                         }
14354                         case 0x43:
14355                         {
14356                                 sdwCyclesRemaining -= 4;
14357                                 cpu.z80B = cpu.z80E;
14358                                 break;
14359                         }
14360                         case 0x44:
14361                         {
14362                                 sdwCyclesRemaining -= 4;
14363                                 cpu.z80B = cpu.z80H;
14364                                 break;
14365                         }
14366                         case 0x45:
14367                         {
14368                                 sdwCyclesRemaining -= 4;
14369                                 cpu.z80B = cpu.z80L;
14370                                 break;
14371                         }
14372                         case 0x46:
14373                         {
14374                                 sdwCyclesRemaining -= 7;
14375                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
14376                                 while (psMemRead->lowAddr != 0xffffffff)
14377                                 {
14378                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
14379                                         {
14380                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14381                                                 if (psMemRead->memoryCall)
14382                                                 {
14383                                                         cpu.z80B = psMemRead->memoryCall(cpu.z80HL, psMemRead);
14384                                                 }
14385                                                 else
14386                                                 {
14387                                                         cpu.z80B = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
14388                                                 }
14389                                                 psMemRead = NULL;
14390                                                 break;
14391                                         }
14392                                         ++psMemRead;
14393                                 }
14394
14395                                 if (psMemRead)
14396                                 {
14397                                         cpu.z80B = cpu.z80Base[cpu.z80HL];
14398                                 }
14399
14400                                 break;
14401                         }
14402                         case 0x47:
14403                         {
14404                                 sdwCyclesRemaining -= 4;
14405                                 cpu.z80B = cpu.z80A;
14406                                 break;
14407                         }
14408                         case 0x48:
14409                         {
14410                                 sdwCyclesRemaining -= 4;
14411                                 cpu.z80C = cpu.z80B;
14412                                 break;
14413                         }
14414                         case 0x49:
14415                         {
14416                                 sdwCyclesRemaining -= 4;
14417                                 break;
14418                         }
14419                         case 0x4a:
14420                         {
14421                                 sdwCyclesRemaining -= 4;
14422                                 cpu.z80C = cpu.z80D;
14423                                 break;
14424                         }
14425                         case 0x4b:
14426                         {
14427                                 sdwCyclesRemaining -= 4;
14428                                 cpu.z80C = cpu.z80E;
14429                                 break;
14430                         }
14431                         case 0x4c:
14432                         {
14433                                 sdwCyclesRemaining -= 4;
14434                                 cpu.z80C = cpu.z80H;
14435                                 break;
14436                         }
14437                         case 0x4d:
14438                         {
14439                                 sdwCyclesRemaining -= 4;
14440                                 cpu.z80C = cpu.z80L;
14441                                 break;
14442                         }
14443                         case 0x4e:
14444                         {
14445                                 sdwCyclesRemaining -= 7;
14446                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
14447                                 while (psMemRead->lowAddr != 0xffffffff)
14448                                 {
14449                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
14450                                         {
14451                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14452                                                 if (psMemRead->memoryCall)
14453                                                 {
14454                                                         cpu.z80C = psMemRead->memoryCall(cpu.z80HL, psMemRead);
14455                                                 }
14456                                                 else
14457                                                 {
14458                                                         cpu.z80C = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
14459                                                 }
14460                                                 psMemRead = NULL;
14461                                                 break;
14462                                         }
14463                                         ++psMemRead;
14464                                 }
14465
14466                                 if (psMemRead)
14467                                 {
14468                                         cpu.z80C = cpu.z80Base[cpu.z80HL];
14469                                 }
14470
14471                                 break;
14472                         }
14473                         case 0x4f:
14474                         {
14475                                 sdwCyclesRemaining -= 4;
14476                                 cpu.z80C = cpu.z80A;
14477                                 break;
14478                         }
14479                         case 0x50:
14480                         {
14481                                 sdwCyclesRemaining -= 4;
14482                                 cpu.z80D = cpu.z80B;
14483                                 break;
14484                         }
14485                         case 0x51:
14486                         {
14487                                 sdwCyclesRemaining -= 4;
14488                                 cpu.z80D = cpu.z80C;
14489                                 break;
14490                         }
14491                         case 0x52:
14492                         {
14493                                 sdwCyclesRemaining -= 4;
14494                                 break;
14495                         }
14496                         case 0x53:
14497                         {
14498                                 sdwCyclesRemaining -= 4;
14499                                 cpu.z80D = cpu.z80E;
14500                                 break;
14501                         }
14502                         case 0x54:
14503                         {
14504                                 sdwCyclesRemaining -= 4;
14505                                 cpu.z80D = cpu.z80H;
14506                                 break;
14507                         }
14508                         case 0x55:
14509                         {
14510                                 sdwCyclesRemaining -= 4;
14511                                 cpu.z80D = cpu.z80L;
14512                                 break;
14513                         }
14514                         case 0x56:
14515                         {
14516                                 sdwCyclesRemaining -= 7;
14517                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
14518                                 while (psMemRead->lowAddr != 0xffffffff)
14519                                 {
14520                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
14521                                         {
14522                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14523                                                 if (psMemRead->memoryCall)
14524                                                 {
14525                                                         cpu.z80D = psMemRead->memoryCall(cpu.z80HL, psMemRead);
14526                                                 }
14527                                                 else
14528                                                 {
14529                                                         cpu.z80D = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
14530                                                 }
14531                                                 psMemRead = NULL;
14532                                                 break;
14533                                         }
14534                                         ++psMemRead;
14535                                 }
14536
14537                                 if (psMemRead)
14538                                 {
14539                                         cpu.z80D = cpu.z80Base[cpu.z80HL];
14540                                 }
14541
14542                                 break;
14543                         }
14544                         case 0x57:
14545                         {
14546                                 sdwCyclesRemaining -= 4;
14547                                 cpu.z80D = cpu.z80A;
14548                                 break;
14549                         }
14550                         case 0x58:
14551                         {
14552                                 sdwCyclesRemaining -= 4;
14553                                 cpu.z80E = cpu.z80B;
14554                                 break;
14555                         }
14556                         case 0x59:
14557                         {
14558                                 sdwCyclesRemaining -= 4;
14559                                 cpu.z80E = cpu.z80C;
14560                                 break;
14561                         }
14562                         case 0x5a:
14563                         {
14564                                 sdwCyclesRemaining -= 4;
14565                                 cpu.z80E = cpu.z80D;
14566                                 break;
14567                         }
14568                         case 0x5b:
14569                         {
14570                                 sdwCyclesRemaining -= 4;
14571                                 break;
14572                         }
14573                         case 0x5c:
14574                         {
14575                                 sdwCyclesRemaining -= 4;
14576                                 cpu.z80E = cpu.z80H;
14577                                 break;
14578                         }
14579                         case 0x5d:
14580                         {
14581                                 sdwCyclesRemaining -= 4;
14582                                 cpu.z80E = cpu.z80L;
14583                                 break;
14584                         }
14585                         case 0x5e:
14586                         {
14587                                 sdwCyclesRemaining -= 7;
14588                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
14589                                 while (psMemRead->lowAddr != 0xffffffff)
14590                                 {
14591                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
14592                                         {
14593                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14594                                                 if (psMemRead->memoryCall)
14595                                                 {
14596                                                         cpu.z80E = psMemRead->memoryCall(cpu.z80HL, psMemRead);
14597                                                 }
14598                                                 else
14599                                                 {
14600                                                         cpu.z80E = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
14601                                                 }
14602                                                 psMemRead = NULL;
14603                                                 break;
14604                                         }
14605                                         ++psMemRead;
14606                                 }
14607
14608                                 if (psMemRead)
14609                                 {
14610                                         cpu.z80E = cpu.z80Base[cpu.z80HL];
14611                                 }
14612
14613                                 break;
14614                         }
14615                         case 0x5f:
14616                         {
14617                                 sdwCyclesRemaining -= 4;
14618                                 cpu.z80E = cpu.z80A;
14619                                 break;
14620                         }
14621                         case 0x60:
14622                         {
14623                                 sdwCyclesRemaining -= 4;
14624                                 cpu.z80H = cpu.z80B;
14625                                 break;
14626                         }
14627                         case 0x61:
14628                         {
14629                                 sdwCyclesRemaining -= 4;
14630                                 cpu.z80H = cpu.z80C;
14631                                 break;
14632                         }
14633                         case 0x62:
14634                         {
14635                                 sdwCyclesRemaining -= 4;
14636                                 cpu.z80H = cpu.z80D;
14637                                 break;
14638                         }
14639                         case 0x63:
14640                         {
14641                                 sdwCyclesRemaining -= 4;
14642                                 cpu.z80H = cpu.z80E;
14643                                 break;
14644                         }
14645                         case 0x64:
14646                         {
14647                                 sdwCyclesRemaining -= 4;
14648                                 break;
14649                         }
14650                         case 0x65:
14651                         {
14652                                 sdwCyclesRemaining -= 4;
14653                                 cpu.z80H = cpu.z80L;
14654                                 break;
14655                         }
14656                         case 0x66:
14657                         {
14658                                 sdwCyclesRemaining -= 7;
14659                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
14660                                 while (psMemRead->lowAddr != 0xffffffff)
14661                                 {
14662                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
14663                                         {
14664                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14665                                                 if (psMemRead->memoryCall)
14666                                                 {
14667                                                         cpu.z80H = psMemRead->memoryCall(cpu.z80HL, psMemRead);
14668                                                 }
14669                                                 else
14670                                                 {
14671                                                         cpu.z80H = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
14672                                                 }
14673                                                 psMemRead = NULL;
14674                                                 break;
14675                                         }
14676                                         ++psMemRead;
14677                                 }
14678
14679                                 if (psMemRead)
14680                                 {
14681                                         cpu.z80H = cpu.z80Base[cpu.z80HL];
14682                                 }
14683
14684                                 break;
14685                         }
14686                         case 0x67:
14687                         {
14688                                 sdwCyclesRemaining -= 4;
14689                                 cpu.z80H = cpu.z80A;
14690                                 break;
14691                         }
14692                         case 0x68:
14693                         {
14694                                 sdwCyclesRemaining -= 4;
14695                                 cpu.z80L = cpu.z80B;
14696                                 break;
14697                         }
14698                         case 0x69:
14699                         {
14700                                 sdwCyclesRemaining -= 4;
14701                                 cpu.z80L = cpu.z80C;
14702                                 break;
14703                         }
14704                         case 0x6a:
14705                         {
14706                                 sdwCyclesRemaining -= 4;
14707                                 cpu.z80L = cpu.z80D;
14708                                 break;
14709                         }
14710                         case 0x6b:
14711                         {
14712                                 sdwCyclesRemaining -= 4;
14713                                 cpu.z80L = cpu.z80E;
14714                                 break;
14715                         }
14716                         case 0x6c:
14717                         {
14718                                 sdwCyclesRemaining -= 4;
14719                                 cpu.z80L = cpu.z80H;
14720                                 break;
14721                         }
14722                         case 0x6d:
14723                         {
14724                                 sdwCyclesRemaining -= 4;
14725                                 break;
14726                         }
14727                         case 0x6e:
14728                         {
14729                                 sdwCyclesRemaining -= 7;
14730                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
14731                                 while (psMemRead->lowAddr != 0xffffffff)
14732                                 {
14733                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
14734                                         {
14735                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14736                                                 if (psMemRead->memoryCall)
14737                                                 {
14738                                                         cpu.z80L = psMemRead->memoryCall(cpu.z80HL, psMemRead);
14739                                                 }
14740                                                 else
14741                                                 {
14742                                                         cpu.z80L = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
14743                                                 }
14744                                                 psMemRead = NULL;
14745                                                 break;
14746                                         }
14747                                         ++psMemRead;
14748                                 }
14749
14750                                 if (psMemRead)
14751                                 {
14752                                         cpu.z80L = cpu.z80Base[cpu.z80HL];
14753                                 }
14754
14755                                 break;
14756                         }
14757                         case 0x6f:
14758                         {
14759                                 sdwCyclesRemaining -= 4;
14760                                 cpu.z80L = cpu.z80A;
14761                                 break;
14762                         }
14763                         case 0x70:
14764                         {
14765                                 sdwCyclesRemaining -= 7;
14766                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
14767                                 while (psMemWrite->lowAddr != 0xffffffff)
14768                                 {
14769                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
14770                                         {
14771                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14772                                                 if (psMemWrite->memoryCall)
14773                                                 {
14774                                                         psMemWrite->memoryCall(cpu.z80HL, cpu.z80B, psMemWrite);
14775                                                 }
14776                                                 else
14777                                                 {
14778                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80B;
14779                                                 }
14780                                                 psMemWrite = NULL;
14781                                                 break;
14782                                         }
14783                                         ++psMemWrite;
14784                                 }
14785
14786                                 if (psMemWrite)
14787                                 {
14788                                         cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80B;
14789                                 }
14790
14791                                 break;
14792                         }
14793                         case 0x71:
14794                         {
14795                                 sdwCyclesRemaining -= 7;
14796                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
14797                                 while (psMemWrite->lowAddr != 0xffffffff)
14798                                 {
14799                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
14800                                         {
14801                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14802                                                 if (psMemWrite->memoryCall)
14803                                                 {
14804                                                         psMemWrite->memoryCall(cpu.z80HL, cpu.z80C, psMemWrite);
14805                                                 }
14806                                                 else
14807                                                 {
14808                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80C;
14809                                                 }
14810                                                 psMemWrite = NULL;
14811                                                 break;
14812                                         }
14813                                         ++psMemWrite;
14814                                 }
14815
14816                                 if (psMemWrite)
14817                                 {
14818                                         cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80C;
14819                                 }
14820
14821                                 break;
14822                         }
14823                         case 0x72:
14824                         {
14825                                 sdwCyclesRemaining -= 7;
14826                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
14827                                 while (psMemWrite->lowAddr != 0xffffffff)
14828                                 {
14829                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
14830                                         {
14831                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14832                                                 if (psMemWrite->memoryCall)
14833                                                 {
14834                                                         psMemWrite->memoryCall(cpu.z80HL, cpu.z80D, psMemWrite);
14835                                                 }
14836                                                 else
14837                                                 {
14838                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80D;
14839                                                 }
14840                                                 psMemWrite = NULL;
14841                                                 break;
14842                                         }
14843                                         ++psMemWrite;
14844                                 }
14845
14846                                 if (psMemWrite)
14847                                 {
14848                                         cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80D;
14849                                 }
14850
14851                                 break;
14852                         }
14853                         case 0x73:
14854                         {
14855                                 sdwCyclesRemaining -= 7;
14856                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
14857                                 while (psMemWrite->lowAddr != 0xffffffff)
14858                                 {
14859                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
14860                                         {
14861                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14862                                                 if (psMemWrite->memoryCall)
14863                                                 {
14864                                                         psMemWrite->memoryCall(cpu.z80HL, cpu.z80E, psMemWrite);
14865                                                 }
14866                                                 else
14867                                                 {
14868                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80E;
14869                                                 }
14870                                                 psMemWrite = NULL;
14871                                                 break;
14872                                         }
14873                                         ++psMemWrite;
14874                                 }
14875
14876                                 if (psMemWrite)
14877                                 {
14878                                         cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80E;
14879                                 }
14880
14881                                 break;
14882                         }
14883                         case 0x74:
14884                         {
14885                                 sdwCyclesRemaining -= 7;
14886                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
14887                                 while (psMemWrite->lowAddr != 0xffffffff)
14888                                 {
14889                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
14890                                         {
14891                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14892                                                 if (psMemWrite->memoryCall)
14893                                                 {
14894                                                         psMemWrite->memoryCall(cpu.z80HL, cpu.z80H, psMemWrite);
14895                                                 }
14896                                                 else
14897                                                 {
14898                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80H;
14899                                                 }
14900                                                 psMemWrite = NULL;
14901                                                 break;
14902                                         }
14903                                         ++psMemWrite;
14904                                 }
14905
14906                                 if (psMemWrite)
14907                                 {
14908                                         cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80H;
14909                                 }
14910
14911                                 break;
14912                         }
14913                         case 0x75:
14914                         {
14915                                 sdwCyclesRemaining -= 7;
14916                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
14917                                 while (psMemWrite->lowAddr != 0xffffffff)
14918                                 {
14919                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
14920                                         {
14921                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14922                                                 if (psMemWrite->memoryCall)
14923                                                 {
14924                                                         psMemWrite->memoryCall(cpu.z80HL, cpu.z80L, psMemWrite);
14925                                                 }
14926                                                 else
14927                                                 {
14928                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80L;
14929                                                 }
14930                                                 psMemWrite = NULL;
14931                                                 break;
14932                                         }
14933                                         ++psMemWrite;
14934                                 }
14935
14936                                 if (psMemWrite)
14937                                 {
14938                                         cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80L;
14939                                 }
14940
14941                                 break;
14942                         }
14943                         case 0x76:
14944                         {
14945                                 sdwCyclesRemaining -= 4;
14946                                 cpu.z80halted = 1;
14947                                 dwElapsedTicks += sdwCyclesRemaining;
14948                                 sdwCyclesRemaining = 0;
14949                                 break;
14950                         }
14951                         case 0x77:
14952                         {
14953                                 sdwCyclesRemaining -= 7;
14954                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
14955                                 while (psMemWrite->lowAddr != 0xffffffff)
14956                                 {
14957                                         if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
14958                                         {
14959                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14960                                                 if (psMemWrite->memoryCall)
14961                                                 {
14962                                                         psMemWrite->memoryCall(cpu.z80HL, cpu.z80A, psMemWrite);
14963                                                 }
14964                                                 else
14965                                                 {
14966                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80A;
14967                                                 }
14968                                                 psMemWrite = NULL;
14969                                                 break;
14970                                         }
14971                                         ++psMemWrite;
14972                                 }
14973
14974                                 if (psMemWrite)
14975                                 {
14976                                         cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80A;
14977                                 }
14978
14979                                 break;
14980                         }
14981                         case 0x78:
14982                         {
14983                                 sdwCyclesRemaining -= 4;
14984                                 cpu.z80A = cpu.z80B;
14985                                 break;
14986                         }
14987                         case 0x79:
14988                         {
14989                                 sdwCyclesRemaining -= 4;
14990                                 cpu.z80A = cpu.z80C;
14991                                 break;
14992                         }
14993                         case 0x7a:
14994                         {
14995                                 sdwCyclesRemaining -= 4;
14996                                 cpu.z80A = cpu.z80D;
14997                                 break;
14998                         }
14999                         case 0x7b:
15000                         {
15001                                 sdwCyclesRemaining -= 4;
15002                                 cpu.z80A = cpu.z80E;
15003                                 break;
15004                         }
15005                         case 0x7c:
15006                         {
15007                                 sdwCyclesRemaining -= 4;
15008                                 cpu.z80A = cpu.z80H;
15009                                 break;
15010                         }
15011                         case 0x7d:
15012                         {
15013                                 sdwCyclesRemaining -= 4;
15014                                 cpu.z80A = cpu.z80L;
15015                                 break;
15016                         }
15017                         case 0x7e:
15018                         {
15019                                 sdwCyclesRemaining -= 7;
15020                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
15021                                 while (psMemRead->lowAddr != 0xffffffff)
15022                                 {
15023                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
15024                                         {
15025                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15026                                                 if (psMemRead->memoryCall)
15027                                                 {
15028                                                         cpu.z80A = psMemRead->memoryCall(cpu.z80HL, psMemRead);
15029                                                 }
15030                                                 else
15031                                                 {
15032                                                         cpu.z80A = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
15033                                                 }
15034                                                 psMemRead = NULL;
15035                                                 break;
15036                                         }
15037                                         ++psMemRead;
15038                                 }
15039
15040                                 if (psMemRead)
15041                                 {
15042                                         cpu.z80A = cpu.z80Base[cpu.z80HL];
15043                                 }
15044
15045                                 break;
15046                         }
15047                         case 0x7f:
15048                         {
15049                                 sdwCyclesRemaining -= 4;
15050                                 break;
15051                         }
15052                         case 0x80:
15053                         {
15054                                 sdwCyclesRemaining -= 4;
15055                                 bTemp2 = cpu.z80A + cpu.z80B;
15056                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15057                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15058                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80B];
15059                                 cpu.z80A = bTemp2;
15060                                 break;
15061                         }
15062                         case 0x81:
15063                         {
15064                                 sdwCyclesRemaining -= 4;
15065                                 bTemp2 = cpu.z80A + cpu.z80C;
15066                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15067                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15068                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80C];
15069                                 cpu.z80A = bTemp2;
15070                                 break;
15071                         }
15072                         case 0x82:
15073                         {
15074                                 sdwCyclesRemaining -= 4;
15075                                 bTemp2 = cpu.z80A + cpu.z80D;
15076                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15077                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15078                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80D];
15079                                 cpu.z80A = bTemp2;
15080                                 break;
15081                         }
15082                         case 0x83:
15083                         {
15084                                 sdwCyclesRemaining -= 4;
15085                                 bTemp2 = cpu.z80A + cpu.z80E;
15086                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15087                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15088                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80E];
15089                                 cpu.z80A = bTemp2;
15090                                 break;
15091                         }
15092                         case 0x84:
15093                         {
15094                                 sdwCyclesRemaining -= 4;
15095                                 bTemp2 = cpu.z80A + cpu.z80H;
15096                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15097                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15098                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80H];
15099                                 cpu.z80A = bTemp2;
15100                                 break;
15101                         }
15102                         case 0x85:
15103                         {
15104                                 sdwCyclesRemaining -= 4;
15105                                 bTemp2 = cpu.z80A + cpu.z80L;
15106                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15107                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15108                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80L];
15109                                 cpu.z80A = bTemp2;
15110                                 break;
15111                         }
15112                         case 0x86:
15113                         {
15114                                 sdwCyclesRemaining -= 7;
15115                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
15116                                 while (psMemRead->lowAddr != 0xffffffff)
15117                                 {
15118                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
15119                                         {
15120                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15121                                                 if (psMemRead->memoryCall)
15122                                                 {
15123                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
15124                                                 }
15125                                                 else
15126                                                 {
15127                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
15128                                                 }
15129                                                 psMemRead = NULL;
15130                                                 break;
15131                                         }
15132                                         ++psMemRead;
15133                                 }
15134
15135                                 if (psMemRead)
15136                                 {
15137                                         bTemp = cpu.z80Base[cpu.z80HL];
15138                                 }
15139
15140                                 bTemp2 = cpu.z80A + bTemp;
15141                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15142                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15143                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp];
15144                                 cpu.z80A = bTemp2;
15145                                 break;
15146                         }
15147                         case 0x87:
15148                         {
15149                                 sdwCyclesRemaining -= 4;
15150                                 bTemp2 = cpu.z80A + cpu.z80A;
15151                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15152                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15153                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80A];
15154                                 cpu.z80A = bTemp2;
15155                                 break;
15156                         }
15157                         case 0x88:
15158                         {
15159                                 sdwCyclesRemaining -= 4;
15160                                 bTemp2 = cpu.z80A + cpu.z80B + (cpu.z80F & Z80_FLAG_CARRY);
15161                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15162                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15163                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80B | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15164                                 cpu.z80A = bTemp2;
15165                                 break;
15166                         }
15167                         case 0x89:
15168                         {
15169                                 sdwCyclesRemaining -= 4;
15170                                 bTemp2 = cpu.z80A + cpu.z80C + (cpu.z80F & Z80_FLAG_CARRY);
15171                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15172                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15173                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80C | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15174                                 cpu.z80A = bTemp2;
15175                                 break;
15176                         }
15177                         case 0x8a:
15178                         {
15179                                 sdwCyclesRemaining -= 4;
15180                                 bTemp2 = cpu.z80A + cpu.z80D + (cpu.z80F & Z80_FLAG_CARRY);
15181                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15182                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15183                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80D | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15184                                 cpu.z80A = bTemp2;
15185                                 break;
15186                         }
15187                         case 0x8b:
15188                         {
15189                                 sdwCyclesRemaining -= 4;
15190                                 bTemp2 = cpu.z80A + cpu.z80E + (cpu.z80F & Z80_FLAG_CARRY);
15191                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15192                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15193                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80E | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15194                                 cpu.z80A = bTemp2;
15195                                 break;
15196                         }
15197                         case 0x8c:
15198                         {
15199                                 sdwCyclesRemaining -= 4;
15200                                 bTemp2 = cpu.z80A + cpu.z80H + (cpu.z80F & Z80_FLAG_CARRY);
15201                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15202                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15203                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80H | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15204                                 cpu.z80A = bTemp2;
15205                                 break;
15206                         }
15207                         case 0x8d:
15208                         {
15209                                 sdwCyclesRemaining -= 4;
15210                                 bTemp2 = cpu.z80A + cpu.z80L + (cpu.z80F & Z80_FLAG_CARRY);
15211                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15212                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15213                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80L | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15214                                 cpu.z80A = bTemp2;
15215                                 break;
15216                         }
15217                         case 0x8e:
15218                         {
15219                                 sdwCyclesRemaining -= 7;
15220                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
15221                                 while (psMemRead->lowAddr != 0xffffffff)
15222                                 {
15223                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
15224                                         {
15225                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15226                                                 if (psMemRead->memoryCall)
15227                                                 {
15228                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
15229                                                 }
15230                                                 else
15231                                                 {
15232                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
15233                                                 }
15234                                                 psMemRead = NULL;
15235                                                 break;
15236                                         }
15237                                         ++psMemRead;
15238                                 }
15239
15240                                 if (psMemRead)
15241                                 {
15242                                         bTemp = cpu.z80Base[cpu.z80HL];
15243                                 }
15244
15245                                 bTemp2 = cpu.z80A + bTemp + (cpu.z80F & Z80_FLAG_CARRY);
15246                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15247                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15248                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15249                                 cpu.z80A = bTemp2;
15250                                 break;
15251                         }
15252                         case 0x8f:
15253                         {
15254                                 sdwCyclesRemaining -= 4;
15255                                 bTemp2 = cpu.z80A + cpu.z80A + (cpu.z80F & Z80_FLAG_CARRY);
15256                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15257                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15258                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80A | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15259                                 cpu.z80A = bTemp2;
15260                                 break;
15261                         }
15262                         case 0x90:
15263                         {
15264                                 sdwCyclesRemaining -= 4;
15265                                 bTemp2 = cpu.z80A - cpu.z80B;
15266                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15267                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15268                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80B];
15269                                 cpu.z80A = bTemp2;
15270                                 break;
15271                         }
15272                         case 0x91:
15273                         {
15274                                 sdwCyclesRemaining -= 4;
15275                                 bTemp2 = cpu.z80A - cpu.z80C;
15276                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15277                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15278                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80C];
15279                                 cpu.z80A = bTemp2;
15280                                 break;
15281                         }
15282                         case 0x92:
15283                         {
15284                                 sdwCyclesRemaining -= 4;
15285                                 bTemp2 = cpu.z80A - cpu.z80D;
15286                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15287                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15288                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80D];
15289                                 cpu.z80A = bTemp2;
15290                                 break;
15291                         }
15292                         case 0x93:
15293                         {
15294                                 sdwCyclesRemaining -= 4;
15295                                 bTemp2 = cpu.z80A - cpu.z80E;
15296                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15297                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15298                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80E];
15299                                 cpu.z80A = bTemp2;
15300                                 break;
15301                         }
15302                         case 0x94:
15303                         {
15304                                 sdwCyclesRemaining -= 4;
15305                                 bTemp2 = cpu.z80A - cpu.z80H;
15306                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15307                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15308                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80H];
15309                                 cpu.z80A = bTemp2;
15310                                 break;
15311                         }
15312                         case 0x95:
15313                         {
15314                                 sdwCyclesRemaining -= 4;
15315                                 bTemp2 = cpu.z80A - cpu.z80L;
15316                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15317                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15318                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80L];
15319                                 cpu.z80A = bTemp2;
15320                                 break;
15321                         }
15322                         case 0x96:
15323                         {
15324                                 sdwCyclesRemaining -= 7;
15325                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
15326                                 while (psMemRead->lowAddr != 0xffffffff)
15327                                 {
15328                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
15329                                         {
15330                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15331                                                 if (psMemRead->memoryCall)
15332                                                 {
15333                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
15334                                                 }
15335                                                 else
15336                                                 {
15337                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
15338                                                 }
15339                                                 psMemRead = NULL;
15340                                                 break;
15341                                         }
15342                                         ++psMemRead;
15343                                 }
15344
15345                                 if (psMemRead)
15346                                 {
15347                                         bTemp = cpu.z80Base[cpu.z80HL];
15348                                 }
15349
15350                                 bTemp2 = cpu.z80A - bTemp;
15351                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15352                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15353                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
15354                                 cpu.z80A = bTemp2;
15355                                 break;
15356                         }
15357                         case 0x97:
15358                         {
15359                                 sdwCyclesRemaining -= 4;
15360                                 bTemp2 = cpu.z80A - cpu.z80A;
15361                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15362                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15363                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80A];
15364                                 cpu.z80A = bTemp2;
15365                                 break;
15366                         }
15367                         case 0x98:
15368                         {
15369                                 sdwCyclesRemaining -= 4;
15370                                 bTemp2 = cpu.z80A - cpu.z80B - (cpu.z80F & Z80_FLAG_CARRY);
15371                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15372                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15373                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80B | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15374                                 cpu.z80A = bTemp2;
15375                                 break;
15376                         }
15377                         case 0x99:
15378                         {
15379                                 sdwCyclesRemaining -= 4;
15380                                 bTemp2 = cpu.z80A - cpu.z80C - (cpu.z80F & Z80_FLAG_CARRY);
15381                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15382                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15383                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80C | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15384                                 cpu.z80A = bTemp2;
15385                                 break;
15386                         }
15387                         case 0x9a:
15388                         {
15389                                 sdwCyclesRemaining -= 4;
15390                                 bTemp2 = cpu.z80A - cpu.z80D - (cpu.z80F & Z80_FLAG_CARRY);
15391                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15392                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15393                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80D | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15394                                 cpu.z80A = bTemp2;
15395                                 break;
15396                         }
15397                         case 0x9b:
15398                         {
15399                                 sdwCyclesRemaining -= 4;
15400                                 bTemp2 = cpu.z80A - cpu.z80E - (cpu.z80F & Z80_FLAG_CARRY);
15401                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15402                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15403                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80E | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15404                                 cpu.z80A = bTemp2;
15405                                 break;
15406                         }
15407                         case 0x9c:
15408                         {
15409                                 sdwCyclesRemaining -= 4;
15410                                 bTemp2 = cpu.z80A - cpu.z80H - (cpu.z80F & Z80_FLAG_CARRY);
15411                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15412                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15413                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80H | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15414                                 cpu.z80A = bTemp2;
15415                                 break;
15416                         }
15417                         case 0x9d:
15418                         {
15419                                 sdwCyclesRemaining -= 4;
15420                                 bTemp2 = cpu.z80A - cpu.z80L - (cpu.z80F & Z80_FLAG_CARRY);
15421                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15422                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15423                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80L | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15424                                 cpu.z80A = bTemp2;
15425                                 break;
15426                         }
15427                         case 0x9e:
15428                         {
15429                                 sdwCyclesRemaining -= 7;
15430                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
15431                                 while (psMemRead->lowAddr != 0xffffffff)
15432                                 {
15433                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
15434                                         {
15435                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15436                                                 if (psMemRead->memoryCall)
15437                                                 {
15438                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
15439                                                 }
15440                                                 else
15441                                                 {
15442                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
15443                                                 }
15444                                                 psMemRead = NULL;
15445                                                 break;
15446                                         }
15447                                         ++psMemRead;
15448                                 }
15449
15450                                 if (psMemRead)
15451                                 {
15452                                         bTemp = cpu.z80Base[cpu.z80HL];
15453                                 }
15454
15455                                 bTemp2 = cpu.z80A - bTemp - (cpu.z80F & Z80_FLAG_CARRY);
15456                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15457                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15458                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15459                                 cpu.z80A = bTemp2;
15460                                 break;
15461                         }
15462                         case 0x9f:
15463                         {
15464                                 sdwCyclesRemaining -= 4;
15465                                 bTemp2 = cpu.z80A - cpu.z80A - (cpu.z80F & Z80_FLAG_CARRY);
15466                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15467                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15468                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80A | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15469                                 cpu.z80A = bTemp2;
15470                                 break;
15471                         }
15472                         case 0xa0:
15473                         {
15474                                 sdwCyclesRemaining -= 4;
15475                                 cpu.z80A &= cpu.z80B;
15476                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15477                                 cpu.z80F |= bPostANDFlags[cpu.z80A];
15478
15479                                 break;
15480                         }
15481                         case 0xa1:
15482                         {
15483                                 sdwCyclesRemaining -= 4;
15484                                 cpu.z80A &= cpu.z80C;
15485                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15486                                 cpu.z80F |= bPostANDFlags[cpu.z80A];
15487
15488                                 break;
15489                         }
15490                         case 0xa2:
15491                         {
15492                                 sdwCyclesRemaining -= 4;
15493                                 cpu.z80A &= cpu.z80D;
15494                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15495                                 cpu.z80F |= bPostANDFlags[cpu.z80A];
15496
15497                                 break;
15498                         }
15499                         case 0xa3:
15500                         {
15501                                 sdwCyclesRemaining -= 4;
15502                                 cpu.z80A &= cpu.z80E;
15503                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15504                                 cpu.z80F |= bPostANDFlags[cpu.z80A];
15505
15506                                 break;
15507                         }
15508                         case 0xa4:
15509                         {
15510                                 sdwCyclesRemaining -= 4;
15511                                 cpu.z80A &= cpu.z80H;
15512                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15513                                 cpu.z80F |= bPostANDFlags[cpu.z80A];
15514
15515                                 break;
15516                         }
15517                         case 0xa5:
15518                         {
15519                                 sdwCyclesRemaining -= 4;
15520                                 cpu.z80A &= cpu.z80L;
15521                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15522                                 cpu.z80F |= bPostANDFlags[cpu.z80A];
15523
15524                                 break;
15525                         }
15526                         case 0xa6:
15527                         {
15528                                 sdwCyclesRemaining -= 7;
15529                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
15530                                 while (psMemRead->lowAddr != 0xffffffff)
15531                                 {
15532                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
15533                                         {
15534                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15535                                                 if (psMemRead->memoryCall)
15536                                                 {
15537                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
15538                                                 }
15539                                                 else
15540                                                 {
15541                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
15542                                                 }
15543                                                 psMemRead = NULL;
15544                                                 break;
15545                                         }
15546                                         ++psMemRead;
15547                                 }
15548
15549                                 if (psMemRead)
15550                                 {
15551                                         bTemp = cpu.z80Base[cpu.z80HL];
15552                                 }
15553
15554                                 cpu.z80A &= bTemp;
15555                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15556                                 cpu.z80F |= bPostANDFlags[cpu.z80A];
15557
15558                                 break;
15559                         }
15560                         case 0xa7:
15561                         {
15562                                 sdwCyclesRemaining -= 4;
15563                                 cpu.z80A &= cpu.z80A;
15564                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15565                                 cpu.z80F |= bPostANDFlags[cpu.z80A];
15566
15567                                 break;
15568                         }
15569                         case 0xa8:
15570                         {
15571                                 sdwCyclesRemaining -= 4;
15572                                 cpu.z80A ^= cpu.z80B;
15573                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15574                                 cpu.z80F |= bPostORFlags[cpu.z80A];
15575
15576                                 break;
15577                         }
15578                         case 0xa9:
15579                         {
15580                                 sdwCyclesRemaining -= 4;
15581                                 cpu.z80A ^= cpu.z80C;
15582                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15583                                 cpu.z80F |= bPostORFlags[cpu.z80A];
15584
15585                                 break;
15586                         }
15587                         case 0xaa:
15588                         {
15589                                 sdwCyclesRemaining -= 4;
15590                                 cpu.z80A ^= cpu.z80D;
15591                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15592                                 cpu.z80F |= bPostORFlags[cpu.z80A];
15593
15594                                 break;
15595                         }
15596                         case 0xab:
15597                         {
15598                                 sdwCyclesRemaining -= 4;
15599                                 cpu.z80A ^= cpu.z80E;
15600                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15601                                 cpu.z80F |= bPostORFlags[cpu.z80A];
15602
15603                                 break;
15604                         }
15605                         case 0xac:
15606                         {
15607                                 sdwCyclesRemaining -= 4;
15608                                 cpu.z80A ^= cpu.z80H;
15609                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15610                                 cpu.z80F |= bPostORFlags[cpu.z80A];
15611
15612                                 break;
15613                         }
15614                         case 0xad:
15615                         {
15616                                 sdwCyclesRemaining -= 4;
15617                                 cpu.z80A ^= cpu.z80L;
15618                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15619                                 cpu.z80F |= bPostORFlags[cpu.z80A];
15620
15621                                 break;
15622                         }
15623                         case 0xae:
15624                         {
15625                                 sdwCyclesRemaining -= 7;
15626                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
15627                                 while (psMemRead->lowAddr != 0xffffffff)
15628                                 {
15629                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
15630                                         {
15631                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15632                                                 if (psMemRead->memoryCall)
15633                                                 {
15634                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
15635                                                 }
15636                                                 else
15637                                                 {
15638                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
15639                                                 }
15640                                                 psMemRead = NULL;
15641                                                 break;
15642                                         }
15643                                         ++psMemRead;
15644                                 }
15645
15646                                 if (psMemRead)
15647                                 {
15648                                         bTemp = cpu.z80Base[cpu.z80HL];
15649                                 }
15650
15651                                 cpu.z80A ^= bTemp;
15652                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15653                                 cpu.z80F |= bPostORFlags[cpu.z80A];
15654
15655                                 break;
15656                         }
15657                         case 0xaf:
15658                         {
15659                                 sdwCyclesRemaining -= 4;
15660                                 cpu.z80A ^= cpu.z80A;
15661                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15662                                 cpu.z80F |= bPostORFlags[cpu.z80A];
15663
15664                                 break;
15665                         }
15666                         case 0xb0:
15667                         {
15668                                 sdwCyclesRemaining -= 4;
15669                                 cpu.z80A |= cpu.z80B;
15670                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15671                                 cpu.z80F |= bPostORFlags[cpu.z80A];
15672
15673                                 break;
15674                         }
15675                         case 0xb1:
15676                         {
15677                                 sdwCyclesRemaining -= 4;
15678                                 cpu.z80A |= cpu.z80C;
15679                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15680                                 cpu.z80F |= bPostORFlags[cpu.z80A];
15681
15682                                 break;
15683                         }
15684                         case 0xb2:
15685                         {
15686                                 sdwCyclesRemaining -= 4;
15687                                 cpu.z80A |= cpu.z80D;
15688                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15689                                 cpu.z80F |= bPostORFlags[cpu.z80A];
15690
15691                                 break;
15692                         }
15693                         case 0xb3:
15694                         {
15695                                 sdwCyclesRemaining -= 4;
15696                                 cpu.z80A |= cpu.z80E;
15697                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15698                                 cpu.z80F |= bPostORFlags[cpu.z80A];
15699
15700                                 break;
15701                         }
15702                         case 0xb4:
15703                         {
15704                                 sdwCyclesRemaining -= 4;
15705                                 cpu.z80A |= cpu.z80H;
15706                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15707                                 cpu.z80F |= bPostORFlags[cpu.z80A];
15708
15709                                 break;
15710                         }
15711                         case 0xb5:
15712                         {
15713                                 sdwCyclesRemaining -= 4;
15714                                 cpu.z80A |= cpu.z80L;
15715                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15716                                 cpu.z80F |= bPostORFlags[cpu.z80A];
15717
15718                                 break;
15719                         }
15720                         case 0xb6:
15721                         {
15722                                 sdwCyclesRemaining -= 7;
15723                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
15724                                 while (psMemRead->lowAddr != 0xffffffff)
15725                                 {
15726                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
15727                                         {
15728                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15729                                                 if (psMemRead->memoryCall)
15730                                                 {
15731                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
15732                                                 }
15733                                                 else
15734                                                 {
15735                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
15736                                                 }
15737                                                 psMemRead = NULL;
15738                                                 break;
15739                                         }
15740                                         ++psMemRead;
15741                                 }
15742
15743                                 if (psMemRead)
15744                                 {
15745                                         bTemp = cpu.z80Base[cpu.z80HL];
15746                                 }
15747
15748                                 cpu.z80A |= bTemp;
15749                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15750                                 cpu.z80F |= bPostORFlags[cpu.z80A];
15751
15752                                 break;
15753                         }
15754                         case 0xb7:
15755                         {
15756                                 sdwCyclesRemaining -= 4;
15757                                 cpu.z80A |= cpu.z80A;
15758                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15759                                 cpu.z80F |= bPostORFlags[cpu.z80A];
15760
15761                                 break;
15762                         }
15763                         case 0xb8:
15764                         {
15765                                 sdwCyclesRemaining -= 4;
15766                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15767                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15768                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80B];
15769                                 break;
15770                         }
15771                         case 0xb9:
15772                         {
15773                                 sdwCyclesRemaining -= 4;
15774                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15775                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15776                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80C];
15777                                 break;
15778                         }
15779                         case 0xba:
15780                         {
15781                                 sdwCyclesRemaining -= 4;
15782                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15783                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15784                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80D];
15785                                 break;
15786                         }
15787                         case 0xbb:
15788                         {
15789                                 sdwCyclesRemaining -= 4;
15790                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15791                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15792                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80E];
15793                                 break;
15794                         }
15795                         case 0xbc:
15796                         {
15797                                 sdwCyclesRemaining -= 4;
15798                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15799                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15800                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80H];
15801                                 break;
15802                         }
15803                         case 0xbd:
15804                         {
15805                                 sdwCyclesRemaining -= 4;
15806                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15807                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15808                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80L];
15809                                 break;
15810                         }
15811                         case 0xbe:
15812                         {
15813                                 sdwCyclesRemaining -= 7;
15814                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
15815                                 while (psMemRead->lowAddr != 0xffffffff)
15816                                 {
15817                                         if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
15818                                         {
15819                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15820                                                 if (psMemRead->memoryCall)
15821                                                 {
15822                                                         bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
15823                                                 }
15824                                                 else
15825                                                 {
15826                                                         bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
15827                                                 }
15828                                                 psMemRead = NULL;
15829                                                 break;
15830                                         }
15831                                         ++psMemRead;
15832                                 }
15833
15834                                 if (psMemRead)
15835                                 {
15836                                         bTemp = cpu.z80Base[cpu.z80HL];
15837                                 }
15838
15839                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15840                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15841                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
15842                                 break;
15843                         }
15844                         case 0xbf:
15845                         {
15846                                 sdwCyclesRemaining -= 4;
15847                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15848                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15849                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80A];
15850                                 break;
15851                         }
15852                         case 0xc0:
15853                         {
15854                                 sdwCyclesRemaining -= 5;
15855                                 if (!(cpu.z80F & Z80_FLAG_ZERO))
15856                                 {
15857                                         dwElapsedTicks += 6;
15858                                 pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
15859                                 dwAddr = *pbSP++;       /* Pop LSB */
15860                                 dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
15861                                 cpu.z80sp += 2; /* Pop the word off */
15862                                 pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
15863                                 }
15864                                 break;
15865                         }
15866                         case 0xc1:
15867                         {
15868                                 sdwCyclesRemaining -= 10;
15869                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
15870                                 while (psMemRead->lowAddr != 0xffffffff)
15871                                 {
15872                                         if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
15873                                         {
15874                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15875                                                 if (psMemRead->memoryCall)
15876                                                 {
15877                                                         cpu.z80BC = psMemRead->memoryCall(cpu.z80sp, psMemRead);
15878                                                         cpu.z80BC |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
15879                                                 }
15880                                                 else
15881                                                 {
15882                                                         cpu.z80BC = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
15883                                                         cpu.z80BC |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
15884                                                 }
15885                                                 psMemRead = NULL;
15886                                                 break;
15887                                         }
15888                                         ++psMemRead;
15889                                 }
15890
15891                                 if (psMemRead)
15892                                 {
15893                                         cpu.z80BC = cpu.z80Base[cpu.z80sp];
15894                                         cpu.z80BC |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
15895                                 }
15896
15897                                         cpu.z80sp += 2;
15898                                         pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
15899                                 break;
15900                         }
15901                         case 0xc2:
15902                         {
15903                                 sdwCyclesRemaining -= 10;
15904                                         dwAddr = *pbPC++;       /* Get LSB first */
15905                                         dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
15906                                 if (!(cpu.z80F & Z80_FLAG_ZERO))
15907                                 {
15908                                         pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
15909                                 }
15910                                 break;
15911                         }
15912                         case 0xc3:
15913                         {
15914                                 sdwCyclesRemaining -= 10;
15915                                         dwAddr = *pbPC++;       /* Get LSB first */
15916                                         dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
15917                                 pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
15918                                 break;
15919                         }
15920                         case 0xc4:
15921                         {
15922                                 sdwCyclesRemaining -= 10;
15923                                 dwAddr = *pbPC++;       /* Get LSB first */
15924                                 dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
15925                                 if (!(cpu.z80F & Z80_FLAG_ZERO))
15926                                 {
15927                                         cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15928                                         pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
15929                                         *pbSP-- = cpu.z80pc >> 8;       /* MSB */
15930                                         *pbSP = (UINT8) cpu.z80pc;      /* LSB */
15931                                         cpu.z80sp -= 2; /* Back our stack up */
15932                                         pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
15933                                 }
15934                                 break;
15935                         }
15936                         case 0xc5:
15937                         {
15938                                 sdwCyclesRemaining -= 11;
15939                                         cpu.z80sp -= 2;
15940                                         pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
15941                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
15942                                 while (psMemWrite->lowAddr != 0xffffffff)
15943                                 {
15944                                         if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
15945                                         {
15946                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15947                                                 if (psMemWrite->memoryCall)
15948                                                 {
15949                                                         psMemWrite->memoryCall(cpu.z80sp, (cpu.z80BC & 0xff), psMemWrite);
15950                                                         psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80BC >> 8), psMemWrite);
15951                                                 }
15952                                                 else
15953                                                 {
15954                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80BC;
15955                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80BC >> 8;
15956                                                 }
15957                                                 psMemWrite = NULL;
15958                                                 break;
15959                                         }
15960                                         ++psMemWrite;
15961                                 }
15962
15963                                 if (psMemWrite)
15964                                 {
15965                                         cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80BC;
15966                                         cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80BC >> 8);
15967                                 }
15968
15969                                 break;
15970                         }
15971                         case 0xc6:
15972                         {
15973                                 sdwCyclesRemaining -= 7;
15974                                 bTemp = *pbPC++;
15975                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
15976                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15977                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp];
15978                                 cpu.z80A += bTemp;
15979                                 break;
15980                         }
15981                         case 0xc7:
15982                         {
15983                                 sdwCyclesRemaining -= 11;
15984                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15985                                 pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
15986                                 *pbSP-- = cpu.z80pc >> 8;       /* LSB */
15987                                 *pbSP = (UINT8) cpu.z80pc;      /* MSB */
15988                                 cpu.z80sp -= 2; /* Back our stack up */
15989                                 pbPC = cpu.z80Base + 0x00;      /* Normalize the address */
15990                                 break;
15991                         }
15992                         case 0xc8:
15993                         {
15994                                 sdwCyclesRemaining -= 5;
15995                                 if (cpu.z80F & Z80_FLAG_ZERO)
15996                                 {
15997                                         dwElapsedTicks += 6;
15998                                 pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
15999                                 dwAddr = *pbSP++;       /* Pop LSB */
16000                                 dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
16001                                 cpu.z80sp += 2; /* Pop the word off */
16002                                 pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
16003                                 }
16004                                 break;
16005                         }
16006                         case 0xc9:
16007                         {
16008                                 sdwCyclesRemaining -= 10;
16009                                 pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
16010                                 dwAddr = *pbSP++;       /* Pop LSB */
16011                                 dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
16012                                 cpu.z80sp += 2; /* Pop the word off */
16013                                 pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
16014                                 break;
16015                         }
16016                         case 0xca:
16017                         {
16018                                 sdwCyclesRemaining -= 10;
16019                                         dwAddr = *pbPC++;       /* Get LSB first */
16020                                         dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16021                                 if (cpu.z80F & Z80_FLAG_ZERO)
16022                                 {
16023                                         pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
16024                                 }
16025                                 break;
16026                         }
16027                         case 0xcb:
16028                         {
16029                                 CBHandler();
16030                                 break;
16031                         }
16032                         case 0xcc:
16033                         {
16034                                 sdwCyclesRemaining -= 10;
16035                                 dwAddr = *pbPC++;       /* Get LSB first */
16036                                 dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16037                                 if (cpu.z80F & Z80_FLAG_ZERO)
16038                                 {
16039                                         cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16040                                         pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
16041                                         *pbSP-- = cpu.z80pc >> 8;       /* MSB */
16042                                         *pbSP = (UINT8) cpu.z80pc;      /* LSB */
16043                                         cpu.z80sp -= 2; /* Back our stack up */
16044                                         pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
16045                                 }
16046                                 break;
16047                         }
16048                         case 0xcd:
16049                         {
16050                                 sdwCyclesRemaining -= 17;
16051                                 dwAddr = *pbPC++;       /* Get LSB first */
16052                                 dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16053                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16054                                 pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
16055                                 *pbSP-- = cpu.z80pc >> 8;       /* LSB */
16056                                 *pbSP = (UINT8) cpu.z80pc;      /* MSB */
16057                                 cpu.z80sp -= 2; /* Back our stack up */
16058                                 pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
16059                                 break;
16060                         }
16061                         case 0xce:
16062                         {
16063                                 sdwCyclesRemaining -= 7;
16064                                 bTemp = *pbPC++ + (cpu.z80F & Z80_FLAG_CARRY);
16065                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
16066                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
16067                                                                 pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
16068                                 cpu.z80A += bTemp;
16069                                 break;
16070                         }
16071                         case 0xcf:
16072                         {
16073                                 sdwCyclesRemaining -= 11;
16074                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16075                                 pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
16076                                 *pbSP-- = cpu.z80pc >> 8;       /* LSB */
16077                                 *pbSP = (UINT8) cpu.z80pc;      /* MSB */
16078                                 cpu.z80sp -= 2; /* Back our stack up */
16079                                 pbPC = cpu.z80Base + 0x08;      /* Normalize the address */
16080                                 break;
16081                         }
16082                         case 0xd0:
16083                         {
16084                                 sdwCyclesRemaining -= 5;
16085                                 if (!(cpu.z80F & Z80_FLAG_CARRY))
16086                                 {
16087                                         dwElapsedTicks += 6;
16088                                 pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
16089                                 dwAddr = *pbSP++;       /* Pop LSB */
16090                                 dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
16091                                 cpu.z80sp += 2; /* Pop the word off */
16092                                 pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
16093                                 }
16094                                 break;
16095                         }
16096                         case 0xd1:
16097                         {
16098                                 sdwCyclesRemaining -= 10;
16099                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
16100                                 while (psMemRead->lowAddr != 0xffffffff)
16101                                 {
16102                                         if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
16103                                         {
16104                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16105                                                 if (psMemRead->memoryCall)
16106                                                 {
16107                                                         cpu.z80DE = psMemRead->memoryCall(cpu.z80sp, psMemRead);
16108                                                         cpu.z80DE |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
16109                                                 }
16110                                                 else
16111                                                 {
16112                                                         cpu.z80DE = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
16113                                                         cpu.z80DE |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
16114                                                 }
16115                                                 psMemRead = NULL;
16116                                                 break;
16117                                         }
16118                                         ++psMemRead;
16119                                 }
16120
16121                                 if (psMemRead)
16122                                 {
16123                                         cpu.z80DE = cpu.z80Base[cpu.z80sp];
16124                                         cpu.z80DE |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
16125                                 }
16126
16127                                         cpu.z80sp += 2;
16128                                         pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
16129                                 break;
16130                         }
16131                         case 0xd2:
16132                         {
16133                                 sdwCyclesRemaining -= 10;
16134                                         dwAddr = *pbPC++;       /* Get LSB first */
16135                                         dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16136                                 if (!(cpu.z80F & Z80_FLAG_CARRY))
16137                                 {
16138                                         pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
16139                                 }
16140                                 break;
16141                         }
16142                         case 0xd3:
16143                         {
16144                                 sdwCyclesRemaining -= 11;
16145                         dwTemp = *pbPC++;
16146                                 psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
16147                                 while (psIoWrite->lowIoAddr != 0xffff)
16148                                 {
16149                                         if ((dwTemp >= psIoWrite->lowIoAddr) && (dwTemp <= psIoWrite->highIoAddr))
16150                                         {
16151                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16152                                                 psIoWrite->IOCall(dwTemp, cpu.z80A, psIoWrite);
16153                                                 psIoWrite = NULL;
16154                                                 break;
16155                                         }
16156                                         ++psIoWrite;
16157                                 }
16158
16159                                 break;
16160                         }
16161                         case 0xd4:
16162                         {
16163                                 sdwCyclesRemaining -= 10;
16164                                 dwAddr = *pbPC++;       /* Get LSB first */
16165                                 dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16166                                 if (!(cpu.z80F & Z80_FLAG_CARRY))
16167                                 {
16168                                         cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16169                                         pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
16170                                         *pbSP-- = cpu.z80pc >> 8;       /* MSB */
16171                                         *pbSP = (UINT8) cpu.z80pc;      /* LSB */
16172                                         cpu.z80sp -= 2; /* Back our stack up */
16173                                         pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
16174                                 }
16175                                 break;
16176                         }
16177                         case 0xd5:
16178                         {
16179                                 sdwCyclesRemaining -= 11;
16180                                         cpu.z80sp -= 2;
16181                                         pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
16182                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
16183                                 while (psMemWrite->lowAddr != 0xffffffff)
16184                                 {
16185                                         if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
16186                                         {
16187                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16188                                                 if (psMemWrite->memoryCall)
16189                                                 {
16190                                                         psMemWrite->memoryCall(cpu.z80sp, (cpu.z80DE & 0xff), psMemWrite);
16191                                                         psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80DE >> 8), psMemWrite);
16192                                                 }
16193                                                 else
16194                                                 {
16195                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80DE;
16196                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80DE >> 8;
16197                                                 }
16198                                                 psMemWrite = NULL;
16199                                                 break;
16200                                         }
16201                                         ++psMemWrite;
16202                                 }
16203
16204                                 if (psMemWrite)
16205                                 {
16206                                         cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80DE;
16207                                         cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80DE >> 8);
16208                                 }
16209
16210                                 break;
16211                         }
16212                         case 0xd6:
16213                         {
16214                                 sdwCyclesRemaining -= 7;
16215                                 bTemp = *pbPC++;
16216                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
16217                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
16218                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
16219                                 cpu.z80A -= bTemp;
16220                                 break;
16221                         }
16222                         case 0xd7:
16223                         {
16224                                 sdwCyclesRemaining -= 11;
16225                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16226                                 pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
16227                                 *pbSP-- = cpu.z80pc >> 8;       /* LSB */
16228                                 *pbSP = (UINT8) cpu.z80pc;      /* MSB */
16229                                 cpu.z80sp -= 2; /* Back our stack up */
16230                                 pbPC = cpu.z80Base + 0x10;      /* Normalize the address */
16231                                 break;
16232                         }
16233                         case 0xd8:
16234                         {
16235                                 sdwCyclesRemaining -= 5;
16236                                 if (cpu.z80F & Z80_FLAG_CARRY)
16237                                 {
16238                                         dwElapsedTicks += 6;
16239                                 pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
16240                                 dwAddr = *pbSP++;       /* Pop LSB */
16241                                 dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
16242                                 cpu.z80sp += 2; /* Pop the word off */
16243                                 pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
16244                                 }
16245                                 break;
16246                         }
16247                         case 0xd9:
16248                         {
16249                                 sdwCyclesRemaining -= 4;
16250                                 dwTemp = cpu.z80DE;
16251                                 cpu.z80DE = cpu.z80deprime;
16252                                 cpu.z80deprime = dwTemp;
16253                                 dwTemp = cpu.z80BC;
16254                                 cpu.z80BC = cpu.z80bcprime;
16255                                 cpu.z80bcprime = dwTemp;
16256                                 dwTemp = cpu.z80HL;
16257                                 cpu.z80HL = cpu.z80hlprime;
16258                                 cpu.z80hlprime = dwTemp;
16259                                 break;
16260                         }
16261                         case 0xda:
16262                         {
16263                                 sdwCyclesRemaining -= 10;
16264                                         dwAddr = *pbPC++;       /* Get LSB first */
16265                                         dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16266                                 if (cpu.z80F & Z80_FLAG_CARRY)
16267                                 {
16268                                         pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
16269                                 }
16270                                 break;
16271                         }
16272                         case 0xdb:
16273                         {
16274                                 sdwCyclesRemaining -= 11;
16275                         dwTemp = *pbPC++;
16276                                 psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
16277                                 while (psIoRead->lowIoAddr != 0xffff)
16278                                 {
16279                                         if ((dwTemp >= psIoRead->lowIoAddr) && (dwTemp <= psIoRead->highIoAddr))
16280                                         {
16281                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16282                                                 cpu.z80A = psIoRead->IOCall(dwTemp, psIoRead);
16283                                                 psIoRead = NULL;
16284                                                 break;
16285                                         }
16286                                         ++psIoRead;
16287                                 }
16288
16289                                 if (psIoRead)
16290                                 {
16291                                         cpu.z80A = 0xff; /* Unclaimed I/O read */
16292                                 }
16293
16294                                 break;
16295                         }
16296                         case 0xdc:
16297                         {
16298                                 sdwCyclesRemaining -= 10;
16299                                 dwAddr = *pbPC++;       /* Get LSB first */
16300                                 dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16301                                 if (cpu.z80F & Z80_FLAG_CARRY)
16302                                 {
16303                                         cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16304                                         pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
16305                                         *pbSP-- = cpu.z80pc >> 8;       /* MSB */
16306                                         *pbSP = (UINT8) cpu.z80pc;      /* LSB */
16307                                         cpu.z80sp -= 2; /* Back our stack up */
16308                                         pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
16309                                 }
16310                                 break;
16311                         }
16312                         case 0xdd:
16313                         {
16314                                 DDHandler();
16315                                 break;
16316                         }
16317                         case 0xde:
16318                         {
16319                                 sdwCyclesRemaining -= 7;
16320                                 bTemp = *pbPC++ + (cpu.z80F & Z80_FLAG_CARRY);
16321                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
16322                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
16323                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
16324                                 cpu.z80A = cpu.z80A - bTemp;
16325                                 break;
16326                         }
16327                         case 0xdf:
16328                         {
16329                                 sdwCyclesRemaining -= 11;
16330                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16331                                 pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
16332                                 *pbSP-- = cpu.z80pc >> 8;       /* LSB */
16333                                 *pbSP = (UINT8) cpu.z80pc;      /* MSB */
16334                                 cpu.z80sp -= 2; /* Back our stack up */
16335                                 pbPC = cpu.z80Base + 0x18;      /* Normalize the address */
16336                                 break;
16337                         }
16338                         case 0xe0:
16339                         {
16340                                 sdwCyclesRemaining -= 5;
16341                                 if (!(cpu.z80F & Z80_FLAG_OVERFLOW_PARITY))
16342                                 {
16343                                         dwElapsedTicks += 6;
16344                                 pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
16345                                 dwAddr = *pbSP++;       /* Pop LSB */
16346                                 dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
16347                                 cpu.z80sp += 2; /* Pop the word off */
16348                                 pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
16349                                 }
16350                                 break;
16351                         }
16352                         case 0xe1:
16353                         {
16354                                 sdwCyclesRemaining -= 10;
16355                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
16356                                 while (psMemRead->lowAddr != 0xffffffff)
16357                                 {
16358                                         if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
16359                                         {
16360                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16361                                                 if (psMemRead->memoryCall)
16362                                                 {
16363                                                         cpu.z80HL = psMemRead->memoryCall(cpu.z80sp, psMemRead);
16364                                                         cpu.z80HL |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
16365                                                 }
16366                                                 else
16367                                                 {
16368                                                         cpu.z80HL = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
16369                                                         cpu.z80HL |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
16370                                                 }
16371                                                 psMemRead = NULL;
16372                                                 break;
16373                                         }
16374                                         ++psMemRead;
16375                                 }
16376
16377                                 if (psMemRead)
16378                                 {
16379                                         cpu.z80HL = cpu.z80Base[cpu.z80sp];
16380                                         cpu.z80HL |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
16381                                 }
16382
16383                                         cpu.z80sp += 2;
16384                                         pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
16385                                 break;
16386                         }
16387                         case 0xe2:
16388                         {
16389                                 sdwCyclesRemaining -= 10;
16390                                         dwAddr = *pbPC++;       /* Get LSB first */
16391                                         dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16392                                 if (!(cpu.z80F & Z80_FLAG_OVERFLOW_PARITY))
16393                                 {
16394                                         pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
16395                                 }
16396                                 break;
16397                         }
16398                         case 0xe3:
16399                         {
16400                                 sdwCyclesRemaining -= 19;
16401                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
16402                                 while (psMemRead->lowAddr != 0xffffffff)
16403                                 {
16404                                         if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
16405                                         {
16406                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16407                                                 if (psMemRead->memoryCall)
16408                                                 {
16409                                                         dwAddr = psMemRead->memoryCall(cpu.z80sp, psMemRead);
16410                                                         dwAddr |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
16411                                                 }
16412                                                 else
16413                                                 {
16414                                                         dwAddr = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
16415                                                         dwAddr |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
16416                                                 }
16417                                                 psMemRead = NULL;
16418                                                 break;
16419                                         }
16420                                         ++psMemRead;
16421                                 }
16422
16423                                 if (psMemRead)
16424                                 {
16425                                         dwAddr = cpu.z80Base[cpu.z80sp];
16426                                         dwAddr |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
16427                                 }
16428
16429                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
16430                                 while (psMemWrite->lowAddr != 0xffffffff)
16431                                 {
16432                                         if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
16433                                         {
16434                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16435                                                 if (psMemWrite->memoryCall)
16436                                                 {
16437                                                         psMemWrite->memoryCall(cpu.z80sp, (cpu.z80HL & 0xff), psMemWrite);
16438                                                         psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80HL >> 8), psMemWrite);
16439                                                 }
16440                                                 else
16441                                                 {
16442                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80HL;
16443                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80HL >> 8;
16444                                                 }
16445                                                 psMemWrite = NULL;
16446                                                 break;
16447                                         }
16448                                         ++psMemWrite;
16449                                 }
16450
16451                                 if (psMemWrite)
16452                                 {
16453                                         cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80HL;
16454                                         cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80HL >> 8);
16455                                 }
16456
16457                                 cpu.z80HL = dwAddr;
16458                                 break;
16459                         }
16460                         case 0xe4:
16461                         {
16462                                 sdwCyclesRemaining -= 10;
16463                                 dwAddr = *pbPC++;       /* Get LSB first */
16464                                 dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16465                                 if (!(cpu.z80F & Z80_FLAG_OVERFLOW_PARITY))
16466                                 {
16467                                         cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16468                                         pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
16469                                         *pbSP-- = cpu.z80pc >> 8;       /* MSB */
16470                                         *pbSP = (UINT8) cpu.z80pc;      /* LSB */
16471                                         cpu.z80sp -= 2; /* Back our stack up */
16472                                         pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
16473                                 }
16474                                 break;
16475                         }
16476                         case 0xe5:
16477                         {
16478                                 sdwCyclesRemaining -= 11;
16479                                         cpu.z80sp -= 2;
16480                                         pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
16481                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
16482                                 while (psMemWrite->lowAddr != 0xffffffff)
16483                                 {
16484                                         if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
16485                                         {
16486                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16487                                                 if (psMemWrite->memoryCall)
16488                                                 {
16489                                                         psMemWrite->memoryCall(cpu.z80sp, (cpu.z80HL & 0xff), psMemWrite);
16490                                                         psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80HL >> 8), psMemWrite);
16491                                                 }
16492                                                 else
16493                                                 {
16494                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80HL;
16495                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80HL >> 8;
16496                                                 }
16497                                                 psMemWrite = NULL;
16498                                                 break;
16499                                         }
16500                                         ++psMemWrite;
16501                                 }
16502
16503                                 if (psMemWrite)
16504                                 {
16505                                         cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80HL;
16506                                         cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80HL >> 8);
16507                                 }
16508
16509                                 break;
16510                         }
16511                         case 0xe6:
16512                         {
16513                                 sdwCyclesRemaining -= 7;
16514                                 cpu.z80A &= *pbPC++;
16515                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
16516                                 cpu.z80F |= bPostANDFlags[cpu.z80A];
16517
16518                                 break;
16519                         }
16520                         case 0xe7:
16521                         {
16522                                 sdwCyclesRemaining -= 11;
16523                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16524                                 pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
16525                                 *pbSP-- = cpu.z80pc >> 8;       /* LSB */
16526                                 *pbSP = (UINT8) cpu.z80pc;      /* MSB */
16527                                 cpu.z80sp -= 2; /* Back our stack up */
16528                                 pbPC = cpu.z80Base + 0x20;      /* Normalize the address */
16529                                 break;
16530                         }
16531                         case 0xe8:
16532                         {
16533                                 sdwCyclesRemaining -= 5;
16534                                 if (cpu.z80F & Z80_FLAG_OVERFLOW_PARITY)
16535                                 {
16536                                         dwElapsedTicks += 6;
16537                                 pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
16538                                 dwAddr = *pbSP++;       /* Pop LSB */
16539                                 dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
16540                                 cpu.z80sp += 2; /* Pop the word off */
16541                                 pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
16542                                 }
16543                                 break;
16544                         }
16545                         case 0xe9:
16546                         {
16547                                 sdwCyclesRemaining -= 4;
16548                                 pbPC = cpu.z80Base + cpu.z80HL;
16549                                 break;
16550                         }
16551                         case 0xea:
16552                         {
16553                                 sdwCyclesRemaining -= 10;
16554                                         dwAddr = *pbPC++;       /* Get LSB first */
16555                                         dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16556                                 if (cpu.z80F & Z80_FLAG_OVERFLOW_PARITY)
16557                                 {
16558                                         pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
16559                                 }
16560                                 break;
16561                         }
16562                         case 0xeb:
16563                         {
16564                                 sdwCyclesRemaining -= 4;
16565                                 dwAddr = cpu.z80DE;
16566                                 cpu.z80DE = cpu.z80HL;
16567                                 cpu.z80HL = dwAddr;
16568                                 break;
16569                         }
16570                         case 0xec:
16571                         {
16572                                 sdwCyclesRemaining -= 10;
16573                                 dwAddr = *pbPC++;       /* Get LSB first */
16574                                 dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16575                                 if (cpu.z80F & Z80_FLAG_OVERFLOW_PARITY)
16576                                 {
16577                                         cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16578                                         pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
16579                                         *pbSP-- = cpu.z80pc >> 8;       /* MSB */
16580                                         *pbSP = (UINT8) cpu.z80pc;      /* LSB */
16581                                         cpu.z80sp -= 2; /* Back our stack up */
16582                                         pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
16583                                 }
16584                                 break;
16585                         }
16586                         case 0xed:
16587                         {
16588                                 EDHandler();
16589                                 break;
16590                         }
16591                         case 0xee:
16592                         {
16593                                 sdwCyclesRemaining -= 7;
16594                                 cpu.z80A ^= *pbPC++;
16595                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
16596                                 cpu.z80F |= bPostORFlags[cpu.z80A];
16597
16598                                 break;
16599                         }
16600                         case 0xef:
16601                         {
16602                                 sdwCyclesRemaining -= 11;
16603                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16604                                 pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
16605                                 *pbSP-- = cpu.z80pc >> 8;       /* LSB */
16606                                 *pbSP = (UINT8) cpu.z80pc;      /* MSB */
16607                                 cpu.z80sp -= 2; /* Back our stack up */
16608                                 pbPC = cpu.z80Base + 0x28;      /* Normalize the address */
16609                                 break;
16610                         }
16611                         case 0xf0:
16612                         {
16613                                 sdwCyclesRemaining -= 5;
16614                                 if (!(cpu.z80F & Z80_FLAG_SIGN))
16615                                 {
16616                                         dwElapsedTicks += 6;
16617                                 pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
16618                                 dwAddr = *pbSP++;       /* Pop LSB */
16619                                 dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
16620                                 cpu.z80sp += 2; /* Pop the word off */
16621                                 pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
16622                                 }
16623                                 break;
16624                         }
16625                         case 0xf1:
16626                         {
16627                                 sdwCyclesRemaining -= 10;
16628                                 psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
16629                                 while (psMemRead->lowAddr != 0xffffffff)
16630                                 {
16631                                         if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
16632                                         {
16633                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16634                                                 if (psMemRead->memoryCall)
16635                                                 {
16636                                                         cpu.z80AF = psMemRead->memoryCall(cpu.z80sp, psMemRead);
16637                                                         cpu.z80AF |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
16638                                                 }
16639                                                 else
16640                                                 {
16641                                                         cpu.z80AF = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
16642                                                         cpu.z80AF |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
16643                                                 }
16644                                                 psMemRead = NULL;
16645                                                 break;
16646                                         }
16647                                         ++psMemRead;
16648                                 }
16649
16650                                 if (psMemRead)
16651                                 {
16652                                         cpu.z80AF = cpu.z80Base[cpu.z80sp];
16653                                         cpu.z80AF |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
16654                                 }
16655
16656                                         cpu.z80sp += 2;
16657                                         pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
16658                                 break;
16659                         }
16660                         case 0xf2:
16661                         {
16662                                 sdwCyclesRemaining -= 10;
16663                                         dwAddr = *pbPC++;       /* Get LSB first */
16664                                         dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16665                                 if (!(cpu.z80F & Z80_FLAG_SIGN))
16666                                 {
16667                                         pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
16668                                 }
16669                                 break;
16670                         }
16671                         case 0xf3:
16672                         {
16673                                 sdwCyclesRemaining -= 4;
16674                                 cpu.z80iff &= (~IFF1);
16675                                 break;
16676                         }
16677                         case 0xf4:
16678                         {
16679                                 sdwCyclesRemaining -= 10;
16680                                 dwAddr = *pbPC++;       /* Get LSB first */
16681                                 dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16682                                 if (!(cpu.z80F & Z80_FLAG_SIGN))
16683                                 {
16684                                         cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16685                                         pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
16686                                         *pbSP-- = cpu.z80pc >> 8;       /* MSB */
16687                                         *pbSP = (UINT8) cpu.z80pc;      /* LSB */
16688                                         cpu.z80sp -= 2; /* Back our stack up */
16689                                         pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
16690                                 }
16691                                 break;
16692                         }
16693                         case 0xf5:
16694                         {
16695                                 sdwCyclesRemaining -= 11;
16696                                         cpu.z80sp -= 2;
16697                                         pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
16698                                 psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
16699                                 while (psMemWrite->lowAddr != 0xffffffff)
16700                                 {
16701                                         if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
16702                                         {
16703                                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16704                                                 if (psMemWrite->memoryCall)
16705                                                 {
16706                                                         psMemWrite->memoryCall(cpu.z80sp, (cpu.z80AF & 0xff), psMemWrite);
16707                                                         psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80AF >> 8), psMemWrite);
16708                                                 }
16709                                                 else
16710                                                 {
16711                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80AF;
16712                                                         *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80AF >> 8;
16713                                                 }
16714                                                 psMemWrite = NULL;
16715                                                 break;
16716                                         }
16717                                         ++psMemWrite;
16718                                 }
16719
16720                                 if (psMemWrite)
16721                                 {
16722                                         cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80AF;
16723                                         cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80AF >> 8);
16724                                 }
16725
16726                                 break;
16727                         }
16728                         case 0xf6:
16729                         {
16730                                 sdwCyclesRemaining -= 7;
16731                                 cpu.z80A |= *pbPC++;
16732                                 cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
16733                                 cpu.z80F |= bPostORFlags[cpu.z80A];
16734
16735                                 break;
16736                         }
16737                         case 0xf7:
16738                         {
16739                                 sdwCyclesRemaining -= 11;
16740                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16741                                 pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
16742                                 *pbSP-- = cpu.z80pc >> 8;       /* LSB */
16743                                 *pbSP = (UINT8) cpu.z80pc;      /* MSB */
16744                                 cpu.z80sp -= 2; /* Back our stack up */
16745                                 pbPC = cpu.z80Base + 0x30;      /* Normalize the address */
16746                                 break;
16747                         }
16748                         case 0xf8:
16749                         {
16750                                 sdwCyclesRemaining -= 5;
16751                                 if (cpu.z80F & Z80_FLAG_SIGN)
16752                                 {
16753                                         dwElapsedTicks += 6;
16754                                 pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
16755                                 dwAddr = *pbSP++;       /* Pop LSB */
16756                                 dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
16757                                 cpu.z80sp += 2; /* Pop the word off */
16758                                 pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
16759                                 }
16760                                 break;
16761                         }
16762                         case 0xf9:
16763                         {
16764                                 sdwCyclesRemaining -= 6;
16765                                 cpu.z80sp = cpu.z80HL;
16766                                 break;
16767                         }
16768                         case 0xfa:
16769                         {
16770                                 sdwCyclesRemaining -= 10;
16771                                         dwAddr = *pbPC++;       /* Get LSB first */
16772                                         dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16773                                 if (cpu.z80F & Z80_FLAG_SIGN)
16774                                 {
16775                                         pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
16776                                 }
16777                                 break;
16778                         }
16779                         case 0xfb:
16780                         {
16781                                 sdwCyclesRemaining -= 4;
16782                                 cpu.z80iff |= IFF1;
16783                                 break;
16784                         }
16785                         case 0xfc:
16786                         {
16787                                 sdwCyclesRemaining -= 10;
16788                                 dwAddr = *pbPC++;       /* Get LSB first */
16789                                 dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16790                                 if (cpu.z80F & Z80_FLAG_SIGN)
16791                                 {
16792                                         cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16793                                         pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
16794                                         *pbSP-- = cpu.z80pc >> 8;       /* MSB */
16795                                         *pbSP = (UINT8) cpu.z80pc;      /* LSB */
16796                                         cpu.z80sp -= 2; /* Back our stack up */
16797                                         pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
16798                                 }
16799                                 break;
16800                         }
16801                         case 0xfd:
16802                         {
16803                                 FDHandler();
16804                                 break;
16805                         }
16806                         case 0xfe:
16807                         {
16808                                 sdwCyclesRemaining -= 7;
16809                                 cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
16810                                                            Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
16811                                                                 pbSubSbcTable[((UINT32) cpu.z80A << 8) | *pbPC++];
16812                                 break;
16813                         }
16814                         case 0xff:
16815                         {
16816                                 sdwCyclesRemaining -= 11;
16817                                 cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16818                                 pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
16819                                 *pbSP-- = cpu.z80pc >> 8;       /* LSB */
16820                                 *pbSP = (UINT8) cpu.z80pc;      /* MSB */
16821                                 cpu.z80sp -= 2; /* Back our stack up */
16822                                 pbPC = cpu.z80Base + 0x38;      /* Normalize the address */
16823                                 break;
16824                         }
16825                 }
16826         }
16827
16828         dwElapsedTicks += (dwOriginalCycles - sdwCyclesRemaining);
16829
16830         cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16831         return(dwReturnCode); /* Indicate success */
16832 }
16833
16834 /* Get mz80's context */
16835
16836 void mz80GetContext(void *pData)
16837 {
16838         memcpy(pData, &cpu, sizeof(CONTEXTMZ80));
16839 }
16840
16841 /* Set mz80's context */
16842
16843 void mz80SetContext(void *pData)
16844 {
16845         memcpy(&cpu, pData, sizeof(CONTEXTMZ80));
16846 }
16847
16848 /* Get mz80's context size */
16849
16850 UINT32 mz80GetContextSize(void)
16851 {
16852         return(sizeof(CONTEXTMZ80));
16853 }
16854
16855 /* This will return the elapsed ticks */
16856
16857 UINT32 mz80GetElapsedTicks(UINT32 dwClear)
16858 {
16859         UINT32 dwTemp = dwElapsedTicks;
16860
16861         if (dwClear)
16862         {
16863                 dwElapsedTicks = 0;
16864         }
16865
16866         return(dwTemp);
16867 }
16868
16869 /* Releases mz80 from its current timeslice */
16870
16871 void mz80ReleaseTimeslice(void)
16872 {
16873         dwOriginalCycles -= sdwCyclesRemaining;
16874         sdwCyclesRemaining = 0;
16875 }
16876
16877 /* This routine is mz80's reset handler */
16878
16879 void mz80reset(void)
16880 {
16881         cpu.z80halted = 0;
16882         cpu.z80AF = 0;
16883         cpu.z80F = Z80_FLAG_ZERO;
16884         cpu.z80BC = 0;
16885         cpu.z80DE = 0;
16886         cpu.z80HL = 0;
16887         cpu.z80afprime = 0;
16888         cpu.z80bcprime = 0;
16889         cpu.z80deprime = 0;
16890         cpu.z80hlprime = 0;
16891         cpu.z80i = 0;
16892         cpu.z80r = 0;
16893         cpu.z80IX = 0xffff; /* Yes, this is intentional */
16894         cpu.z80IY = 0xffff; /* Yes, this is intentional */
16895         cpu.z80pc = 0;
16896         cpu.z80sp = 0;
16897         cpu.z80interruptMode = 0;
16898         cpu.z80intAddr = 0x38;
16899         cpu.z80nmiAddr = 0x66;
16900 }
16901
16902 /* Interrupt handler */
16903
16904 UINT32 mz80int(UINT32 dwLowAddr)
16905 {
16906         cpu.z80halted = 0;
16907         if (0 == (cpu.z80iff & IFF1))
16908                 return(0xffffffff);
16909         cpu.z80iff &= ~(IFF1 | IFF2);
16910         pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
16911         *pbSP-- = cpu.z80pc >> 8;       /* LSB */
16912         *pbSP = (UINT8) cpu.z80pc;      /* MSB */
16913         cpu.z80sp -= 2; /* Back our stack up */
16914         if (2 == cpu.z80interruptMode)
16915         {
16916                 cpu.z80pc = ((UINT16) cpu.z80i << 8) | (dwLowAddr & 0xff);
16917                 cpu.z80pc = ((UINT16) cpu.z80Base[cpu.z80pc + 1] << 8) | (cpu.z80Base[cpu.z80pc]);
16918         }
16919         else
16920         {
16921                 cpu.z80pc = cpu.z80intAddr;
16922         }
16923         pbPC = cpu.z80Base + cpu.z80pc; /* Normalize the address */
16924         return(0);
16925 }
16926
16927 /* NMI Handler */
16928
16929 UINT32 mz80nmi(void)
16930 {
16931         cpu.z80halted = 0;
16932         pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
16933         *pbSP-- = cpu.z80pc >> 8;       /* LSB */
16934         *pbSP = (UINT8) cpu.z80pc;      /* MSB */
16935         cpu.z80sp -= 2; /* Back our stack up */
16936         cpu.z80pc = cpu.z80nmiAddr;     /* Our NMI */
16937         return(0);
16938 }
16939
16940 /* Initialize MZ80 for action */
16941
16942 void mz80init(void)
16943 {
16944         UINT32 dwLoop;
16945         UINT8 *pbTempPtr;
16946         UINT8 *pbTempPtr2;
16947         UINT8 bNewAdd;
16948         UINT8 bNewSub;
16949         UINT8 bFlag;
16950         UINT8 bLow;
16951         UINT8 bHigh;
16952         UINT8 bCarry;
16953
16954         if (NULL == pbAddAdcTable)
16955         {
16956                 pbAddAdcTable = malloc(256*256*2);
16957
16958                 if (NULL == pbAddAdcTable)
16959                 {
16960                         return;
16961                 }
16962
16963                 pbTempPtr = pbAddAdcTable;
16964
16965                 pbSubSbcTable = malloc(256*256*2);
16966
16967                 if (NULL == pbSubSbcTable)
16968                 {
16969                         return;
16970                 }
16971
16972                 pbTempPtr2 = pbSubSbcTable;
16973
16974                 for (dwLoop = 0; dwLoop < (256*256*2); dwLoop++)
16975                 {
16976                         bLow = dwLoop & 0xff;
16977                         bHigh = (dwLoop >> 8) & 0xff;
16978                         bCarry = (dwLoop >> 16);
16979
16980                         bFlag = 0;
16981                         bNewAdd = bHigh + bLow + bCarry;
16982
16983                         if (0 == bNewAdd)
16984                         {
16985                                 bFlag |= Z80_FLAG_ZERO;
16986                         }
16987                         else
16988                         {
16989                                 bFlag = bNewAdd & 0x80; /* Sign flag */
16990                         }
16991
16992                         if (((UINT32) bLow + (UINT32) bHigh + (UINT32) bCarry) >= 0x100)
16993                         {
16994                                 bFlag |= Z80_FLAG_CARRY;
16995                         }
16996
16997                         if ( ((bLow ^ bHigh ^ 0x80) & (bLow ^ (bNewAdd & 0x80))) & 0x80)
16998                         {
16999                                 bFlag |= Z80_FLAG_OVERFLOW_PARITY;
17000                         }
17001
17002                         if (((bLow & 0x0f) + (bHigh & 0x0f) + bCarry) >= 0x10)
17003                         {
17004                                 bFlag |= Z80_FLAG_HALF_CARRY;
17005                         }
17006
17007                         *pbTempPtr++ = bFlag;   /* Store our new flag */
17008
17009                         // Now do subtract - Zero
17010
17011                         bFlag = Z80_FLAG_NEGATIVE;
17012                         bNewSub = bHigh - bLow - bCarry;
17013
17014                         if (0 == bNewSub)
17015                         {
17016                                 bFlag |= Z80_FLAG_ZERO;
17017                         }
17018                         else
17019                         {
17020                                 bFlag |= bNewSub & 0x80; /* Sign flag */
17021                         }
17022
17023                         if ( ((INT32) bHigh - (INT32) bLow - (INT32) bCarry) < 0)
17024                         {
17025                                 bFlag |= Z80_FLAG_CARRY;
17026                         }
17027
17028                         if ( ((INT32) (bHigh & 0xf) - (INT32) (bLow & 0x0f) - (INT32) bCarry) < 0)
17029                         {
17030                                 bFlag |= Z80_FLAG_HALF_CARRY;
17031                         }
17032
17033                         if ( ((bLow ^ bHigh) & (bHigh ^ bNewSub) & 0x80) )
17034                         {
17035                                 bFlag |= Z80_FLAG_OVERFLOW_PARITY;
17036                         }
17037
17038                         *pbTempPtr2++ = bFlag;  /* Store our sub flag */
17039
17040                 }
17041         }
17042 }
17043 /* Shut down MZ80 */
17044
17045 void mz80shutdown(void)
17046 {
17047         // notaz: why weren't these here?
17048         free(pbAddAdcTable);
17049         pbAddAdcTable = 0;
17050         free(pbSubSbcTable);
17051         pbSubSbcTable = 0;
17052 }
17053