|
|
1.1 root 1: /* Multi-Z80 32 Bit emulator */
2:
3: /* Copyright 1996-2000 Neil Bradley, All rights reserved
4: *
5: * License agreement:
6: *
7: * (MZ80 Refers to both the assembly code emitted by makeZ80.c and makeZ80.c
8: * itself)
9: *
10: * MZ80 May be distributed in unmodified form to any medium.
11: *
12: * MZ80 May not be sold, or sold as a part of a commercial package without
13: * the express written permission of Neil Bradley ([email protected]). This
14: * includes shareware.
15: *
16: * Modified versions of MZ80 may not be publicly redistributed without author
17: * approval ([email protected]). This includes distributing via a publicly
18: * accessible LAN. You may make your own source modifications and distribute
19: * MZ80 in source or object form, but if you make modifications to MZ80
20: * then it should be noted in the top as a comment in makeZ80.c.
21: *
22: * MZ80 Licensing for commercial applications is available. Please email
23: * [email protected] for details.
24: *
25: * Synthcom Systems, Inc, and Neil Bradley will not be held responsible for
26: * any damage done by the use of MZ80. It is purely "as-is".
27: *
28: * If you use MZ80 in a freeware application, credit in the following text:
29: *
30: * "Multi-Z80 CPU emulator by Neil Bradley ([email protected])"
31: *
32: * must accompany the freeware application within the application itself or
33: * in the documentation.
34: *
35: * Legal stuff aside:
36: *
37: * If you find problems with MZ80, please email the author so they can get
38: * resolved. If you find a bug and fix it, please also email the author so
39: * that those bug fixes can be propogated to the installed base of MZ80
40: * users. If you find performance improvements or problems with MZ80, please
41: * email the author with your changes/suggestions and they will be rolled in
42: * with subsequent releases of MZ80.
43: *
44: * The whole idea of this emulator is to have the fastest available 32 bit
45: * Multi-Z80 emulator for the PC, giving maximum performance.
46: */
47:
48: #include <stdio.h>
49: #include <stdlib.h>
50: #include <string.h>
51: #include "mz80.h"
52: UINT32 z80intAddr;
53: UINT32 z80pc;
54:
55:
56: /* Modular global variables go here*/
57:
58: static CONTEXTMZ80 cpu; /* CPU Context */
59: static UINT8 *pbPC; /* Program counter normalized */
60: static UINT8 *pbSP; /* Stack pointer normalized */
61: static struct MemoryReadByte *psMemRead; /* Read memory structure */
62: static struct MemoryWriteByte *psMemWrite; /* Write memory structure */
63: static struct z80PortRead *psIoRead; /* Read I/O structure */
64: static struct z80PortWrite *psIoWrite; /* Write memory structure */
65: static INT32 sdwCyclesRemaining; /* Used as a countdown */
66: static UINT32 dwReturnCode; /* Return code from exec() */
67: static UINT32 dwOriginalCycles; /* How many cycles did we start with? */
68: static UINT32 dwElapsedTicks; /* How many ticks did we elapse? */
69: static INT32 sdwAddr; /* Temporary address storage */
70: static UINT32 dwAddr; /* Temporary stack address */
71: static UINT8 *pbAddAdcTable; /* Pointer to add/adc flag table */
72: static UINT8 *pbSubSbcTable; /* Pointer to sub/sbc flag table */
73: static UINT32 dwTemp; /* Temporary value */
74:
75: static UINT8 bTemp; /* Temporary value */
76:
77: static UINT8 bTemp2; /* Temporary value */
78:
79: /* Precomputed flag tables */
80:
81: static UINT8 bPostIncFlags[0x100] =
82: {
83: 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
84: 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
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,0x94,
91: 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x90,
92: 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x90,
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,0x50
99: };
100:
101: static UINT8 bPostDecFlags[0x100] =
102: {
103: 0x92,0x42,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
104: 0x12,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
105: 0x12,0x02,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: 0x16,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
112: 0x92,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
113: 0x92,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: };
120:
121: static UINT8 bPostORFlags[0x100] =
122: {
123: 0x44,0x00,0x00,0x04,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,
124: 0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00,
125: 0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00,
126: 0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,
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: 0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,
130: 0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00,
131: 0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,
132: 0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,
133: 0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,
134: 0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,
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: 0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,
138: 0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84
139: };
140:
141: static UINT8 bPostANDFlags[0x100] =
142: {
143: 0x54,0x10,0x10,0x14,0x10,0x14,0x14,0x10,0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,
144: 0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,0x14,0x10,0x10,0x14,0x10,0x14,0x14,0x10,
145: 0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,0x14,0x10,0x10,0x14,0x10,0x14,0x14,0x10,
146: 0x14,0x10,0x10,0x14,0x10,0x14,0x14,0x10,0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,
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: 0x14,0x10,0x10,0x14,0x10,0x14,0x14,0x10,0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,
150: 0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,0x14,0x10,0x10,0x14,0x10,0x14,0x14,0x10,
151: 0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94,0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,
152: 0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94,
153: 0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94,
154: 0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94,0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,
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: 0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94,0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,
158: 0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94
159: };
160:
161: static UINT16 wDAATable[0x800] =
162: {
163: 0x5400,0x1001,0x1002,0x1403,0x1004,0x1405,0x1406,0x1007,
164: 0x1008,0x1409,0x1010,0x1411,0x1412,0x1013,0x1414,0x1015,
165: 0x1010,0x1411,0x1412,0x1013,0x1414,0x1015,0x1016,0x1417,
166: 0x1418,0x1019,0x1020,0x1421,0x1422,0x1023,0x1424,0x1025,
167: 0x1020,0x1421,0x1422,0x1023,0x1424,0x1025,0x1026,0x1427,
168: 0x1428,0x1029,0x1430,0x1031,0x1032,0x1433,0x1034,0x1435,
169: 0x1430,0x1031,0x1032,0x1433,0x1034,0x1435,0x1436,0x1037,
170: 0x1038,0x1439,0x1040,0x1441,0x1442,0x1043,0x1444,0x1045,
171: 0x1040,0x1441,0x1442,0x1043,0x1444,0x1045,0x1046,0x1447,
172: 0x1448,0x1049,0x1450,0x1051,0x1052,0x1453,0x1054,0x1455,
173: 0x1450,0x1051,0x1052,0x1453,0x1054,0x1455,0x1456,0x1057,
174: 0x1058,0x1459,0x1460,0x1061,0x1062,0x1463,0x1064,0x1465,
175: 0x1460,0x1061,0x1062,0x1463,0x1064,0x1465,0x1466,0x1067,
176: 0x1068,0x1469,0x1070,0x1471,0x1472,0x1073,0x1474,0x1075,
177: 0x1070,0x1471,0x1472,0x1073,0x1474,0x1075,0x1076,0x1477,
178: 0x1478,0x1079,0x9080,0x9481,0x9482,0x9083,0x9484,0x9085,
179: 0x9080,0x9481,0x9482,0x9083,0x9484,0x9085,0x9086,0x9487,
180: 0x9488,0x9089,0x9490,0x9091,0x9092,0x9493,0x9094,0x9495,
181: 0x9490,0x9091,0x9092,0x9493,0x9094,0x9495,0x9496,0x9097,
182: 0x9098,0x9499,0x5500,0x1101,0x1102,0x1503,0x1104,0x1505,
183: 0x5500,0x1101,0x1102,0x1503,0x1104,0x1505,0x1506,0x1107,
184: 0x1108,0x1509,0x1110,0x1511,0x1512,0x1113,0x1514,0x1115,
185: 0x1110,0x1511,0x1512,0x1113,0x1514,0x1115,0x1116,0x1517,
186: 0x1518,0x1119,0x1120,0x1521,0x1522,0x1123,0x1524,0x1125,
187: 0x1120,0x1521,0x1522,0x1123,0x1524,0x1125,0x1126,0x1527,
188: 0x1528,0x1129,0x1530,0x1131,0x1132,0x1533,0x1134,0x1535,
189: 0x1530,0x1131,0x1132,0x1533,0x1134,0x1535,0x1536,0x1137,
190: 0x1138,0x1539,0x1140,0x1541,0x1542,0x1143,0x1544,0x1145,
191: 0x1140,0x1541,0x1542,0x1143,0x1544,0x1145,0x1146,0x1547,
192: 0x1548,0x1149,0x1550,0x1151,0x1152,0x1553,0x1154,0x1555,
193: 0x1550,0x1151,0x1152,0x1553,0x1154,0x1555,0x1556,0x1157,
194: 0x1158,0x1559,0x1560,0x1161,0x1162,0x1563,0x1164,0x1565,
195: 0x1560,0x1161,0x1162,0x1563,0x1164,0x1565,0x1566,0x1167,
196: 0x1168,0x1569,0x1170,0x1571,0x1572,0x1173,0x1574,0x1175,
197: 0x1170,0x1571,0x1572,0x1173,0x1574,0x1175,0x1176,0x1577,
198: 0x1578,0x1179,0x9180,0x9581,0x9582,0x9183,0x9584,0x9185,
199: 0x9180,0x9581,0x9582,0x9183,0x9584,0x9185,0x9186,0x9587,
200: 0x9588,0x9189,0x9590,0x9191,0x9192,0x9593,0x9194,0x9595,
201: 0x9590,0x9191,0x9192,0x9593,0x9194,0x9595,0x9596,0x9197,
202: 0x9198,0x9599,0x95a0,0x91a1,0x91a2,0x95a3,0x91a4,0x95a5,
203: 0x95a0,0x91a1,0x91a2,0x95a3,0x91a4,0x95a5,0x95a6,0x91a7,
204: 0x91a8,0x95a9,0x91b0,0x95b1,0x95b2,0x91b3,0x95b4,0x91b5,
205: 0x91b0,0x95b1,0x95b2,0x91b3,0x95b4,0x91b5,0x91b6,0x95b7,
206: 0x95b8,0x91b9,0x95c0,0x91c1,0x91c2,0x95c3,0x91c4,0x95c5,
207: 0x95c0,0x91c1,0x91c2,0x95c3,0x91c4,0x95c5,0x95c6,0x91c7,
208: 0x91c8,0x95c9,0x91d0,0x95d1,0x95d2,0x91d3,0x95d4,0x91d5,
209: 0x91d0,0x95d1,0x95d2,0x91d3,0x95d4,0x91d5,0x91d6,0x95d7,
210: 0x95d8,0x91d9,0x91e0,0x95e1,0x95e2,0x91e3,0x95e4,0x91e5,
211: 0x91e0,0x95e1,0x95e2,0x91e3,0x95e4,0x91e5,0x91e6,0x95e7,
212: 0x95e8,0x91e9,0x95f0,0x91f1,0x91f2,0x95f3,0x91f4,0x95f5,
213: 0x95f0,0x91f1,0x91f2,0x95f3,0x91f4,0x95f5,0x95f6,0x91f7,
214: 0x91f8,0x95f9,0x5500,0x1101,0x1102,0x1503,0x1104,0x1505,
215: 0x5500,0x1101,0x1102,0x1503,0x1104,0x1505,0x1506,0x1107,
216: 0x1108,0x1509,0x1110,0x1511,0x1512,0x1113,0x1514,0x1115,
217: 0x1110,0x1511,0x1512,0x1113,0x1514,0x1115,0x1116,0x1517,
218: 0x1518,0x1119,0x1120,0x1521,0x1522,0x1123,0x1524,0x1125,
219: 0x1120,0x1521,0x1522,0x1123,0x1524,0x1125,0x1126,0x1527,
220: 0x1528,0x1129,0x1530,0x1131,0x1132,0x1533,0x1134,0x1535,
221: 0x1530,0x1131,0x1132,0x1533,0x1134,0x1535,0x1536,0x1137,
222: 0x1138,0x1539,0x1140,0x1541,0x1542,0x1143,0x1544,0x1145,
223: 0x1140,0x1541,0x1542,0x1143,0x1544,0x1145,0x1146,0x1547,
224: 0x1548,0x1149,0x1550,0x1151,0x1152,0x1553,0x1154,0x1555,
225: 0x1550,0x1151,0x1152,0x1553,0x1154,0x1555,0x1556,0x1157,
226: 0x1158,0x1559,0x1560,0x1161,0x1162,0x1563,0x1164,0x1565,
227: 0x1406,0x1007,0x1008,0x1409,0x140a,0x100b,0x140c,0x100d,
228: 0x100e,0x140f,0x1010,0x1411,0x1412,0x1013,0x1414,0x1015,
229: 0x1016,0x1417,0x1418,0x1019,0x101a,0x141b,0x101c,0x141d,
230: 0x141e,0x101f,0x1020,0x1421,0x1422,0x1023,0x1424,0x1025,
231: 0x1026,0x1427,0x1428,0x1029,0x102a,0x142b,0x102c,0x142d,
232: 0x142e,0x102f,0x1430,0x1031,0x1032,0x1433,0x1034,0x1435,
233: 0x1436,0x1037,0x1038,0x1439,0x143a,0x103b,0x143c,0x103d,
234: 0x103e,0x143f,0x1040,0x1441,0x1442,0x1043,0x1444,0x1045,
235: 0x1046,0x1447,0x1448,0x1049,0x104a,0x144b,0x104c,0x144d,
236: 0x144e,0x104f,0x1450,0x1051,0x1052,0x1453,0x1054,0x1455,
237: 0x1456,0x1057,0x1058,0x1459,0x145a,0x105b,0x145c,0x105d,
238: 0x105e,0x145f,0x1460,0x1061,0x1062,0x1463,0x1064,0x1465,
239: 0x1466,0x1067,0x1068,0x1469,0x146a,0x106b,0x146c,0x106d,
240: 0x106e,0x146f,0x1070,0x1471,0x1472,0x1073,0x1474,0x1075,
241: 0x1076,0x1477,0x1478,0x1079,0x107a,0x147b,0x107c,0x147d,
242: 0x147e,0x107f,0x9080,0x9481,0x9482,0x9083,0x9484,0x9085,
243: 0x9086,0x9487,0x9488,0x9089,0x908a,0x948b,0x908c,0x948d,
244: 0x948e,0x908f,0x9490,0x9091,0x9092,0x9493,0x9094,0x9495,
245: 0x9496,0x9097,0x9098,0x9499,0x949a,0x909b,0x949c,0x909d,
246: 0x909e,0x949f,0x5500,0x1101,0x1102,0x1503,0x1104,0x1505,
247: 0x1506,0x1107,0x1108,0x1509,0x150a,0x110b,0x150c,0x110d,
248: 0x110e,0x150f,0x1110,0x1511,0x1512,0x1113,0x1514,0x1115,
249: 0x1116,0x1517,0x1518,0x1119,0x111a,0x151b,0x111c,0x151d,
250: 0x151e,0x111f,0x1120,0x1521,0x1522,0x1123,0x1524,0x1125,
251: 0x1126,0x1527,0x1528,0x1129,0x112a,0x152b,0x112c,0x152d,
252: 0x152e,0x112f,0x1530,0x1131,0x1132,0x1533,0x1134,0x1535,
253: 0x1536,0x1137,0x1138,0x1539,0x153a,0x113b,0x153c,0x113d,
254: 0x113e,0x153f,0x1140,0x1541,0x1542,0x1143,0x1544,0x1145,
255: 0x1146,0x1547,0x1548,0x1149,0x114a,0x154b,0x114c,0x154d,
256: 0x154e,0x114f,0x1550,0x1151,0x1152,0x1553,0x1154,0x1555,
257: 0x1556,0x1157,0x1158,0x1559,0x155a,0x115b,0x155c,0x115d,
258: 0x115e,0x155f,0x1560,0x1161,0x1162,0x1563,0x1164,0x1565,
259: 0x1566,0x1167,0x1168,0x1569,0x156a,0x116b,0x156c,0x116d,
260: 0x116e,0x156f,0x1170,0x1571,0x1572,0x1173,0x1574,0x1175,
261: 0x1176,0x1577,0x1578,0x1179,0x117a,0x157b,0x117c,0x157d,
262: 0x157e,0x117f,0x9180,0x9581,0x9582,0x9183,0x9584,0x9185,
263: 0x9186,0x9587,0x9588,0x9189,0x918a,0x958b,0x918c,0x958d,
264: 0x958e,0x918f,0x9590,0x9191,0x9192,0x9593,0x9194,0x9595,
265: 0x9596,0x9197,0x9198,0x9599,0x959a,0x919b,0x959c,0x919d,
266: 0x919e,0x959f,0x95a0,0x91a1,0x91a2,0x95a3,0x91a4,0x95a5,
267: 0x95a6,0x91a7,0x91a8,0x95a9,0x95aa,0x91ab,0x95ac,0x91ad,
268: 0x91ae,0x95af,0x91b0,0x95b1,0x95b2,0x91b3,0x95b4,0x91b5,
269: 0x91b6,0x95b7,0x95b8,0x91b9,0x91ba,0x95bb,0x91bc,0x95bd,
270: 0x95be,0x91bf,0x95c0,0x91c1,0x91c2,0x95c3,0x91c4,0x95c5,
271: 0x95c6,0x91c7,0x91c8,0x95c9,0x95ca,0x91cb,0x95cc,0x91cd,
272: 0x91ce,0x95cf,0x91d0,0x95d1,0x95d2,0x91d3,0x95d4,0x91d5,
273: 0x91d6,0x95d7,0x95d8,0x91d9,0x91da,0x95db,0x91dc,0x95dd,
274: 0x95de,0x91df,0x91e0,0x95e1,0x95e2,0x91e3,0x95e4,0x91e5,
275: 0x91e6,0x95e7,0x95e8,0x91e9,0x91ea,0x95eb,0x91ec,0x95ed,
276: 0x95ee,0x91ef,0x95f0,0x91f1,0x91f2,0x95f3,0x91f4,0x95f5,
277: 0x95f6,0x91f7,0x91f8,0x95f9,0x95fa,0x91fb,0x95fc,0x91fd,
278: 0x91fe,0x95ff,0x5500,0x1101,0x1102,0x1503,0x1104,0x1505,
279: 0x1506,0x1107,0x1108,0x1509,0x150a,0x110b,0x150c,0x110d,
280: 0x110e,0x150f,0x1110,0x1511,0x1512,0x1113,0x1514,0x1115,
281: 0x1116,0x1517,0x1518,0x1119,0x111a,0x151b,0x111c,0x151d,
282: 0x151e,0x111f,0x1120,0x1521,0x1522,0x1123,0x1524,0x1125,
283: 0x1126,0x1527,0x1528,0x1129,0x112a,0x152b,0x112c,0x152d,
284: 0x152e,0x112f,0x1530,0x1131,0x1132,0x1533,0x1134,0x1535,
285: 0x1536,0x1137,0x1138,0x1539,0x153a,0x113b,0x153c,0x113d,
286: 0x113e,0x153f,0x1140,0x1541,0x1542,0x1143,0x1544,0x1145,
287: 0x1146,0x1547,0x1548,0x1149,0x114a,0x154b,0x114c,0x154d,
288: 0x154e,0x114f,0x1550,0x1151,0x1152,0x1553,0x1154,0x1555,
289: 0x1556,0x1157,0x1158,0x1559,0x155a,0x115b,0x155c,0x115d,
290: 0x115e,0x155f,0x1560,0x1161,0x1162,0x1563,0x1164,0x1565,
291: 0x5600,0x1201,0x1202,0x1603,0x1204,0x1605,0x1606,0x1207,
292: 0x1208,0x1609,0x1204,0x1605,0x1606,0x1207,0x1208,0x1609,
293: 0x1210,0x1611,0x1612,0x1213,0x1614,0x1215,0x1216,0x1617,
294: 0x1618,0x1219,0x1614,0x1215,0x1216,0x1617,0x1618,0x1219,
295: 0x1220,0x1621,0x1622,0x1223,0x1624,0x1225,0x1226,0x1627,
296: 0x1628,0x1229,0x1624,0x1225,0x1226,0x1627,0x1628,0x1229,
297: 0x1630,0x1231,0x1232,0x1633,0x1234,0x1635,0x1636,0x1237,
298: 0x1238,0x1639,0x1234,0x1635,0x1636,0x1237,0x1238,0x1639,
299: 0x1240,0x1641,0x1642,0x1243,0x1644,0x1245,0x1246,0x1647,
300: 0x1648,0x1249,0x1644,0x1245,0x1246,0x1647,0x1648,0x1249,
301: 0x1650,0x1251,0x1252,0x1653,0x1254,0x1655,0x1656,0x1257,
302: 0x1258,0x1659,0x1254,0x1655,0x1656,0x1257,0x1258,0x1659,
303: 0x1660,0x1261,0x1262,0x1663,0x1264,0x1665,0x1666,0x1267,
304: 0x1268,0x1669,0x1264,0x1665,0x1666,0x1267,0x1268,0x1669,
305: 0x1270,0x1671,0x1672,0x1273,0x1674,0x1275,0x1276,0x1677,
306: 0x1678,0x1279,0x1674,0x1275,0x1276,0x1677,0x1678,0x1279,
307: 0x9280,0x9681,0x9682,0x9283,0x9684,0x9285,0x9286,0x9687,
308: 0x9688,0x9289,0x9684,0x9285,0x9286,0x9687,0x9688,0x9289,
309: 0x9690,0x9291,0x9292,0x9693,0x9294,0x9695,0x9696,0x9297,
310: 0x9298,0x9699,0x1334,0x1735,0x1736,0x1337,0x1338,0x1739,
311: 0x1340,0x1741,0x1742,0x1343,0x1744,0x1345,0x1346,0x1747,
312: 0x1748,0x1349,0x1744,0x1345,0x1346,0x1747,0x1748,0x1349,
313: 0x1750,0x1351,0x1352,0x1753,0x1354,0x1755,0x1756,0x1357,
314: 0x1358,0x1759,0x1354,0x1755,0x1756,0x1357,0x1358,0x1759,
315: 0x1760,0x1361,0x1362,0x1763,0x1364,0x1765,0x1766,0x1367,
316: 0x1368,0x1769,0x1364,0x1765,0x1766,0x1367,0x1368,0x1769,
317: 0x1370,0x1771,0x1772,0x1373,0x1774,0x1375,0x1376,0x1777,
318: 0x1778,0x1379,0x1774,0x1375,0x1376,0x1777,0x1778,0x1379,
319: 0x9380,0x9781,0x9782,0x9383,0x9784,0x9385,0x9386,0x9787,
320: 0x9788,0x9389,0x9784,0x9385,0x9386,0x9787,0x9788,0x9389,
321: 0x9790,0x9391,0x9392,0x9793,0x9394,0x9795,0x9796,0x9397,
322: 0x9398,0x9799,0x9394,0x9795,0x9796,0x9397,0x9398,0x9799,
323: 0x97a0,0x93a1,0x93a2,0x97a3,0x93a4,0x97a5,0x97a6,0x93a7,
324: 0x93a8,0x97a9,0x93a4,0x97a5,0x97a6,0x93a7,0x93a8,0x97a9,
325: 0x93b0,0x97b1,0x97b2,0x93b3,0x97b4,0x93b5,0x93b6,0x97b7,
326: 0x97b8,0x93b9,0x97b4,0x93b5,0x93b6,0x97b7,0x97b8,0x93b9,
327: 0x97c0,0x93c1,0x93c2,0x97c3,0x93c4,0x97c5,0x97c6,0x93c7,
328: 0x93c8,0x97c9,0x93c4,0x97c5,0x97c6,0x93c7,0x93c8,0x97c9,
329: 0x93d0,0x97d1,0x97d2,0x93d3,0x97d4,0x93d5,0x93d6,0x97d7,
330: 0x97d8,0x93d9,0x97d4,0x93d5,0x93d6,0x97d7,0x97d8,0x93d9,
331: 0x93e0,0x97e1,0x97e2,0x93e3,0x97e4,0x93e5,0x93e6,0x97e7,
332: 0x97e8,0x93e9,0x97e4,0x93e5,0x93e6,0x97e7,0x97e8,0x93e9,
333: 0x97f0,0x93f1,0x93f2,0x97f3,0x93f4,0x97f5,0x97f6,0x93f7,
334: 0x93f8,0x97f9,0x93f4,0x97f5,0x97f6,0x93f7,0x93f8,0x97f9,
335: 0x5700,0x1301,0x1302,0x1703,0x1304,0x1705,0x1706,0x1307,
336: 0x1308,0x1709,0x1304,0x1705,0x1706,0x1307,0x1308,0x1709,
337: 0x1310,0x1711,0x1712,0x1313,0x1714,0x1315,0x1316,0x1717,
338: 0x1718,0x1319,0x1714,0x1315,0x1316,0x1717,0x1718,0x1319,
339: 0x1320,0x1721,0x1722,0x1323,0x1724,0x1325,0x1326,0x1727,
340: 0x1728,0x1329,0x1724,0x1325,0x1326,0x1727,0x1728,0x1329,
341: 0x1730,0x1331,0x1332,0x1733,0x1334,0x1735,0x1736,0x1337,
342: 0x1338,0x1739,0x1334,0x1735,0x1736,0x1337,0x1338,0x1739,
343: 0x1340,0x1741,0x1742,0x1343,0x1744,0x1345,0x1346,0x1747,
344: 0x1748,0x1349,0x1744,0x1345,0x1346,0x1747,0x1748,0x1349,
345: 0x1750,0x1351,0x1352,0x1753,0x1354,0x1755,0x1756,0x1357,
346: 0x1358,0x1759,0x1354,0x1755,0x1756,0x1357,0x1358,0x1759,
347: 0x1760,0x1361,0x1362,0x1763,0x1364,0x1765,0x1766,0x1367,
348: 0x1368,0x1769,0x1364,0x1765,0x1766,0x1367,0x1368,0x1769,
349: 0x1370,0x1771,0x1772,0x1373,0x1774,0x1375,0x1376,0x1777,
350: 0x1778,0x1379,0x1774,0x1375,0x1376,0x1777,0x1778,0x1379,
351: 0x9380,0x9781,0x9782,0x9383,0x9784,0x9385,0x9386,0x9787,
352: 0x9788,0x9389,0x9784,0x9385,0x9386,0x9787,0x9788,0x9389,
353: 0x9790,0x9391,0x9392,0x9793,0x9394,0x9795,0x9796,0x9397,
354: 0x9398,0x9799,0x9394,0x9795,0x9796,0x9397,0x9398,0x9799,
355: 0x97fa,0x93fb,0x97fc,0x93fd,0x93fe,0x97ff,0x5600,0x1201,
356: 0x1202,0x1603,0x1204,0x1605,0x1606,0x1207,0x1208,0x1609,
357: 0x160a,0x120b,0x160c,0x120d,0x120e,0x160f,0x1210,0x1611,
358: 0x1612,0x1213,0x1614,0x1215,0x1216,0x1617,0x1618,0x1219,
359: 0x121a,0x161b,0x121c,0x161d,0x161e,0x121f,0x1220,0x1621,
360: 0x1622,0x1223,0x1624,0x1225,0x1226,0x1627,0x1628,0x1229,
361: 0x122a,0x162b,0x122c,0x162d,0x162e,0x122f,0x1630,0x1231,
362: 0x1232,0x1633,0x1234,0x1635,0x1636,0x1237,0x1238,0x1639,
363: 0x163a,0x123b,0x163c,0x123d,0x123e,0x163f,0x1240,0x1641,
364: 0x1642,0x1243,0x1644,0x1245,0x1246,0x1647,0x1648,0x1249,
365: 0x124a,0x164b,0x124c,0x164d,0x164e,0x124f,0x1650,0x1251,
366: 0x1252,0x1653,0x1254,0x1655,0x1656,0x1257,0x1258,0x1659,
367: 0x165a,0x125b,0x165c,0x125d,0x125e,0x165f,0x1660,0x1261,
368: 0x1262,0x1663,0x1264,0x1665,0x1666,0x1267,0x1268,0x1669,
369: 0x166a,0x126b,0x166c,0x126d,0x126e,0x166f,0x1270,0x1671,
370: 0x1672,0x1273,0x1674,0x1275,0x1276,0x1677,0x1678,0x1279,
371: 0x127a,0x167b,0x127c,0x167d,0x167e,0x127f,0x9280,0x9681,
372: 0x9682,0x9283,0x9684,0x9285,0x9286,0x9687,0x9688,0x9289,
373: 0x928a,0x968b,0x928c,0x968d,0x968e,0x928f,0x9690,0x9291,
374: 0x9292,0x9693,0x1334,0x1735,0x1736,0x1337,0x1338,0x1739,
375: 0x173a,0x133b,0x173c,0x133d,0x133e,0x173f,0x1340,0x1741,
376: 0x1742,0x1343,0x1744,0x1345,0x1346,0x1747,0x1748,0x1349,
377: 0x134a,0x174b,0x134c,0x174d,0x174e,0x134f,0x1750,0x1351,
378: 0x1352,0x1753,0x1354,0x1755,0x1756,0x1357,0x1358,0x1759,
379: 0x175a,0x135b,0x175c,0x135d,0x135e,0x175f,0x1760,0x1361,
380: 0x1362,0x1763,0x1364,0x1765,0x1766,0x1367,0x1368,0x1769,
381: 0x176a,0x136b,0x176c,0x136d,0x136e,0x176f,0x1370,0x1771,
382: 0x1772,0x1373,0x1774,0x1375,0x1376,0x1777,0x1778,0x1379,
383: 0x137a,0x177b,0x137c,0x177d,0x177e,0x137f,0x9380,0x9781,
384: 0x9782,0x9383,0x9784,0x9385,0x9386,0x9787,0x9788,0x9389,
385: 0x938a,0x978b,0x938c,0x978d,0x978e,0x938f,0x9790,0x9391,
386: 0x9392,0x9793,0x9394,0x9795,0x9796,0x9397,0x9398,0x9799,
387: 0x979a,0x939b,0x979c,0x939d,0x939e,0x979f,0x97a0,0x93a1,
388: 0x93a2,0x97a3,0x93a4,0x97a5,0x97a6,0x93a7,0x93a8,0x97a9,
389: 0x97aa,0x93ab,0x97ac,0x93ad,0x93ae,0x97af,0x93b0,0x97b1,
390: 0x97b2,0x93b3,0x97b4,0x93b5,0x93b6,0x97b7,0x97b8,0x93b9,
391: 0x93ba,0x97bb,0x93bc,0x97bd,0x97be,0x93bf,0x97c0,0x93c1,
392: 0x93c2,0x97c3,0x93c4,0x97c5,0x97c6,0x93c7,0x93c8,0x97c9,
393: 0x97ca,0x93cb,0x97cc,0x93cd,0x93ce,0x97cf,0x93d0,0x97d1,
394: 0x97d2,0x93d3,0x97d4,0x93d5,0x93d6,0x97d7,0x97d8,0x93d9,
395: 0x93da,0x97db,0x93dc,0x97dd,0x97de,0x93df,0x93e0,0x97e1,
396: 0x97e2,0x93e3,0x97e4,0x93e5,0x93e6,0x97e7,0x97e8,0x93e9,
397: 0x93ea,0x97eb,0x93ec,0x97ed,0x97ee,0x93ef,0x97f0,0x93f1,
398: 0x93f2,0x97f3,0x93f4,0x97f5,0x97f6,0x93f7,0x93f8,0x97f9,
399: 0x97fa,0x93fb,0x97fc,0x93fd,0x93fe,0x97ff,0x5700,0x1301,
400: 0x1302,0x1703,0x1304,0x1705,0x1706,0x1307,0x1308,0x1709,
401: 0x170a,0x130b,0x170c,0x130d,0x130e,0x170f,0x1310,0x1711,
402: 0x1712,0x1313,0x1714,0x1315,0x1316,0x1717,0x1718,0x1319,
403: 0x131a,0x171b,0x131c,0x171d,0x171e,0x131f,0x1320,0x1721,
404: 0x1722,0x1323,0x1724,0x1325,0x1326,0x1727,0x1728,0x1329,
405: 0x132a,0x172b,0x132c,0x172d,0x172e,0x132f,0x1730,0x1331,
406: 0x1332,0x1733,0x1334,0x1735,0x1736,0x1337,0x1338,0x1739,
407: 0x173a,0x133b,0x173c,0x133d,0x133e,0x173f,0x1340,0x1741,
408: 0x1742,0x1343,0x1744,0x1345,0x1346,0x1747,0x1748,0x1349,
409: 0x134a,0x174b,0x134c,0x174d,0x174e,0x134f,0x1750,0x1351,
410: 0x1352,0x1753,0x1354,0x1755,0x1756,0x1357,0x1358,0x1759,
411: 0x175a,0x135b,0x175c,0x135d,0x135e,0x175f,0x1760,0x1361,
412: 0x1362,0x1763,0x1364,0x1765,0x1766,0x1367,0x1368,0x1769,
413: 0x176a,0x136b,0x176c,0x136d,0x136e,0x176f,0x1370,0x1771,
414: 0x1772,0x1373,0x1774,0x1375,0x1376,0x1777,0x1778,0x1379,
415: 0x137a,0x177b,0x137c,0x177d,0x177e,0x137f,0x9380,0x9781,
416: 0x9782,0x9383,0x9784,0x9385,0x9386,0x9787,0x9788,0x9389,
417: 0x938a,0x978b,0x938c,0x978d,0x978e,0x938f,0x9790,0x9391,
418: 0x9392,0x9793,0x9394,0x9795,0x9796,0x9397,0x9398,0x9799
419: };
420:
421: void DDFDCBHandler(UINT32 dwWhich);
422:
423:
424: static void InvalidInstruction(UINT32 dwCount)
425: {
426: pbPC -= dwCount; /* Invalid instruction - back up */
427: dwReturnCode = (UINT32) pbPC - (UINT32) cpu.z80Base;
428: dwOriginalCycles -= sdwCyclesRemaining;
429: sdwCyclesRemaining = 0;
430: }
431:
432: void CBHandler(void)
433: {
434: switch (*pbPC++)
435: {
436: case 0x00:
437: {
438: sdwCyclesRemaining -= 8;
439: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
440: bTemp2 = (cpu.z80B >> 7);
441: cpu.z80B = (cpu.z80B << 1) | bTemp2;
442: cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80B];
443: break;
444: }
445: case 0x01:
446: {
447: sdwCyclesRemaining -= 8;
448: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
449: bTemp2 = (cpu.z80C >> 7);
450: cpu.z80C = (cpu.z80C << 1) | bTemp2;
451: cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80C];
452: break;
453: }
454: case 0x02:
455: {
456: sdwCyclesRemaining -= 8;
457: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
458: bTemp2 = (cpu.z80D >> 7);
459: cpu.z80D = (cpu.z80D << 1) | bTemp2;
460: cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80D];
461: break;
462: }
463: case 0x03:
464: {
465: sdwCyclesRemaining -= 8;
466: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
467: bTemp2 = (cpu.z80E >> 7);
468: cpu.z80E = (cpu.z80E << 1) | bTemp2;
469: cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80E];
470: break;
471: }
472: case 0x04:
473: {
474: sdwCyclesRemaining -= 8;
475: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
476: bTemp2 = (cpu.z80H >> 7);
477: cpu.z80H = (cpu.z80H << 1) | bTemp2;
478: cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80H];
479: break;
480: }
481: case 0x05:
482: {
483: sdwCyclesRemaining -= 8;
484: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
485: bTemp2 = (cpu.z80L >> 7);
486: cpu.z80L = (cpu.z80L << 1) | bTemp2;
487: cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80L];
488: break;
489: }
490: case 0x06:
491: {
492: sdwCyclesRemaining -= 15;
493: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
494: while (psMemRead->lowAddr != 0xffffffff)
495: {
496: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
497: {
498: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
499: if (psMemRead->memoryCall)
500: {
501: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
502: }
503: else
504: {
505: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
506: }
507: psMemRead = NULL;
508: break;
509: }
510: ++psMemRead;
511: }
512:
513: if (psMemRead)
514: {
515: bTemp = cpu.z80Base[cpu.z80HL];
516: }
517:
518: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
519: bTemp2 = (bTemp >> 7);
520: bTemp = (bTemp << 1) | bTemp2;
521: cpu.z80F |= bTemp2 | bPostORFlags[bTemp];
522: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
523: while (psMemWrite->lowAddr != 0xffffffff)
524: {
525: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
526: {
527: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
528: if (psMemWrite->memoryCall)
529: {
530: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
531: }
532: else
533: {
534: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
535: }
536: psMemWrite = NULL;
537: break;
538: }
539: ++psMemWrite;
540: }
541:
542: if (psMemWrite)
543: {
544: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
545: }
546:
547: break;
548: }
549: case 0x07:
550: {
551: sdwCyclesRemaining -= 8;
552: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
553: bTemp2 = (cpu.z80A >> 7);
554: cpu.z80A = (cpu.z80A << 1) | bTemp2;
555: cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80A];
556: break;
557: }
558: case 0x08:
559: {
560: sdwCyclesRemaining -= 8;
561: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
562: cpu.z80F |= (cpu.z80B & Z80_FLAG_CARRY);
563: cpu.z80B = (cpu.z80B >> 1) | (cpu.z80B << 7);
564: cpu.z80F |= bPostORFlags[cpu.z80B];
565: break;
566: }
567: case 0x09:
568: {
569: sdwCyclesRemaining -= 8;
570: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
571: cpu.z80F |= (cpu.z80C & Z80_FLAG_CARRY);
572: cpu.z80C = (cpu.z80C >> 1) | (cpu.z80C << 7);
573: cpu.z80F |= bPostORFlags[cpu.z80C];
574: break;
575: }
576: case 0x0a:
577: {
578: sdwCyclesRemaining -= 8;
579: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
580: cpu.z80F |= (cpu.z80D & Z80_FLAG_CARRY);
581: cpu.z80D = (cpu.z80D >> 1) | (cpu.z80D << 7);
582: cpu.z80F |= bPostORFlags[cpu.z80D];
583: break;
584: }
585: case 0x0b:
586: {
587: sdwCyclesRemaining -= 8;
588: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
589: cpu.z80F |= (cpu.z80E & Z80_FLAG_CARRY);
590: cpu.z80E = (cpu.z80E >> 1) | (cpu.z80E << 7);
591: cpu.z80F |= bPostORFlags[cpu.z80E];
592: break;
593: }
594: case 0x0c:
595: {
596: sdwCyclesRemaining -= 8;
597: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
598: cpu.z80F |= (cpu.z80H & Z80_FLAG_CARRY);
599: cpu.z80H = (cpu.z80H >> 1) | (cpu.z80H << 7);
600: cpu.z80F |= bPostORFlags[cpu.z80H];
601: break;
602: }
603: case 0x0d:
604: {
605: sdwCyclesRemaining -= 8;
606: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
607: cpu.z80F |= (cpu.z80L & Z80_FLAG_CARRY);
608: cpu.z80L = (cpu.z80L >> 1) | (cpu.z80L << 7);
609: cpu.z80F |= bPostORFlags[cpu.z80L];
610: break;
611: }
612: case 0x0e:
613: {
614: sdwCyclesRemaining -= 15;
615: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
616: while (psMemRead->lowAddr != 0xffffffff)
617: {
618: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
619: {
620: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
621: if (psMemRead->memoryCall)
622: {
623: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
624: }
625: else
626: {
627: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
628: }
629: psMemRead = NULL;
630: break;
631: }
632: ++psMemRead;
633: }
634:
635: if (psMemRead)
636: {
637: bTemp = cpu.z80Base[cpu.z80HL];
638: }
639:
640: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
641: cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
642: bTemp = (bTemp >> 1) | (bTemp << 7);
643: cpu.z80F |= bPostORFlags[bTemp];
644: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
645: while (psMemWrite->lowAddr != 0xffffffff)
646: {
647: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
648: {
649: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
650: if (psMemWrite->memoryCall)
651: {
652: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
653: }
654: else
655: {
656: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
657: }
658: psMemWrite = NULL;
659: break;
660: }
661: ++psMemWrite;
662: }
663:
664: if (psMemWrite)
665: {
666: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
667: }
668:
669: break;
670: }
671: case 0x0f:
672: {
673: sdwCyclesRemaining -= 8;
674: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
675: cpu.z80F |= (cpu.z80A & Z80_FLAG_CARRY);
676: cpu.z80A = (cpu.z80A >> 1) | (cpu.z80A << 7);
677: cpu.z80F |= bPostORFlags[cpu.z80A];
678: break;
679: }
680: case 0x10:
681: {
682: sdwCyclesRemaining -= 8;
683: bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
684: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
685: cpu.z80F |= (cpu.z80B >> 7);
686: cpu.z80B = (cpu.z80B << 1) | bTemp2;
687: cpu.z80F |= bPostORFlags[cpu.z80B];
688: break;
689: }
690: case 0x11:
691: {
692: sdwCyclesRemaining -= 8;
693: bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
694: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
695: cpu.z80F |= (cpu.z80C >> 7);
696: cpu.z80C = (cpu.z80C << 1) | bTemp2;
697: cpu.z80F |= bPostORFlags[cpu.z80C];
698: break;
699: }
700: case 0x12:
701: {
702: sdwCyclesRemaining -= 8;
703: bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
704: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
705: cpu.z80F |= (cpu.z80D >> 7);
706: cpu.z80D = (cpu.z80D << 1) | bTemp2;
707: cpu.z80F |= bPostORFlags[cpu.z80D];
708: break;
709: }
710: case 0x13:
711: {
712: sdwCyclesRemaining -= 8;
713: bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
714: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
715: cpu.z80F |= (cpu.z80E >> 7);
716: cpu.z80E = (cpu.z80E << 1) | bTemp2;
717: cpu.z80F |= bPostORFlags[cpu.z80E];
718: break;
719: }
720: case 0x14:
721: {
722: sdwCyclesRemaining -= 8;
723: bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
724: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
725: cpu.z80F |= (cpu.z80H >> 7);
726: cpu.z80H = (cpu.z80H << 1) | bTemp2;
727: cpu.z80F |= bPostORFlags[cpu.z80H];
728: break;
729: }
730: case 0x15:
731: {
732: sdwCyclesRemaining -= 8;
733: bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
734: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
735: cpu.z80F |= (cpu.z80L >> 7);
736: cpu.z80L = (cpu.z80L << 1) | bTemp2;
737: cpu.z80F |= bPostORFlags[cpu.z80L];
738: break;
739: }
740: case 0x16:
741: {
742: sdwCyclesRemaining -= 15;
743: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
744: while (psMemRead->lowAddr != 0xffffffff)
745: {
746: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
747: {
748: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
749: if (psMemRead->memoryCall)
750: {
751: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
752: }
753: else
754: {
755: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
756: }
757: psMemRead = NULL;
758: break;
759: }
760: ++psMemRead;
761: }
762:
763: if (psMemRead)
764: {
765: bTemp = cpu.z80Base[cpu.z80HL];
766: }
767:
768: bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
769: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
770: cpu.z80F |= (bTemp >> 7);
771: bTemp = (bTemp << 1) | bTemp2;
772: cpu.z80F |= bPostORFlags[bTemp];
773: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
774: while (psMemWrite->lowAddr != 0xffffffff)
775: {
776: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
777: {
778: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
779: if (psMemWrite->memoryCall)
780: {
781: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
782: }
783: else
784: {
785: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
786: }
787: psMemWrite = NULL;
788: break;
789: }
790: ++psMemWrite;
791: }
792:
793: if (psMemWrite)
794: {
795: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
796: }
797:
798: break;
799: }
800: case 0x17:
801: {
802: sdwCyclesRemaining -= 8;
803: bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
804: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
805: cpu.z80F |= (cpu.z80A >> 7);
806: cpu.z80A = (cpu.z80A << 1) | bTemp2;
807: cpu.z80F |= bPostORFlags[cpu.z80A];
808: break;
809: }
810: case 0x18:
811: {
812: sdwCyclesRemaining -= 8;
813: bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
814: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
815: cpu.z80F |= (cpu.z80B & Z80_FLAG_CARRY);
816: cpu.z80B = (cpu.z80B >> 1) | bTemp2;
817: cpu.z80F |= bPostORFlags[cpu.z80B];
818: break;
819: }
820: case 0x19:
821: {
822: sdwCyclesRemaining -= 8;
823: bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
824: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
825: cpu.z80F |= (cpu.z80C & Z80_FLAG_CARRY);
826: cpu.z80C = (cpu.z80C >> 1) | bTemp2;
827: cpu.z80F |= bPostORFlags[cpu.z80C];
828: break;
829: }
830: case 0x1a:
831: {
832: sdwCyclesRemaining -= 8;
833: bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
834: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
835: cpu.z80F |= (cpu.z80D & Z80_FLAG_CARRY);
836: cpu.z80D = (cpu.z80D >> 1) | bTemp2;
837: cpu.z80F |= bPostORFlags[cpu.z80D];
838: break;
839: }
840: case 0x1b:
841: {
842: sdwCyclesRemaining -= 8;
843: bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
844: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
845: cpu.z80F |= (cpu.z80E & Z80_FLAG_CARRY);
846: cpu.z80E = (cpu.z80E >> 1) | bTemp2;
847: cpu.z80F |= bPostORFlags[cpu.z80E];
848: break;
849: }
850: case 0x1c:
851: {
852: sdwCyclesRemaining -= 8;
853: bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
854: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
855: cpu.z80F |= (cpu.z80H & Z80_FLAG_CARRY);
856: cpu.z80H = (cpu.z80H >> 1) | bTemp2;
857: cpu.z80F |= bPostORFlags[cpu.z80H];
858: break;
859: }
860: case 0x1d:
861: {
862: sdwCyclesRemaining -= 8;
863: bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
864: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
865: cpu.z80F |= (cpu.z80L & Z80_FLAG_CARRY);
866: cpu.z80L = (cpu.z80L >> 1) | bTemp2;
867: cpu.z80F |= bPostORFlags[cpu.z80L];
868: break;
869: }
870: case 0x1e:
871: {
872: sdwCyclesRemaining -= 15;
873: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
874: while (psMemRead->lowAddr != 0xffffffff)
875: {
876: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
877: {
878: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
879: if (psMemRead->memoryCall)
880: {
881: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
882: }
883: else
884: {
885: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
886: }
887: psMemRead = NULL;
888: break;
889: }
890: ++psMemRead;
891: }
892:
893: if (psMemRead)
894: {
895: bTemp = cpu.z80Base[cpu.z80HL];
896: }
897:
898: bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
899: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
900: cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
901: bTemp = (bTemp >> 1) | bTemp2;
902: cpu.z80F |= bPostORFlags[bTemp];
903: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
904: while (psMemWrite->lowAddr != 0xffffffff)
905: {
906: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
907: {
908: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
909: if (psMemWrite->memoryCall)
910: {
911: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
912: }
913: else
914: {
915: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
916: }
917: psMemWrite = NULL;
918: break;
919: }
920: ++psMemWrite;
921: }
922:
923: if (psMemWrite)
924: {
925: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
926: }
927:
928: break;
929: }
930: case 0x1f:
931: {
932: sdwCyclesRemaining -= 8;
933: bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
934: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
935: cpu.z80F |= (cpu.z80A & Z80_FLAG_CARRY);
936: cpu.z80A = (cpu.z80A >> 1) | bTemp2;
937: cpu.z80F |= bPostORFlags[cpu.z80A];
938: break;
939: }
940: case 0x20:
941: {
942: sdwCyclesRemaining -= 8;
943: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
944: cpu.z80F |= (cpu.z80B >> 7);
945: cpu.z80B = (cpu.z80B << 1);
946: cpu.z80F |= bPostORFlags[cpu.z80B];
947: break;
948: }
949: case 0x21:
950: {
951: sdwCyclesRemaining -= 8;
952: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
953: cpu.z80F |= (cpu.z80C >> 7);
954: cpu.z80C = (cpu.z80C << 1);
955: cpu.z80F |= bPostORFlags[cpu.z80C];
956: break;
957: }
958: case 0x22:
959: {
960: sdwCyclesRemaining -= 8;
961: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
962: cpu.z80F |= (cpu.z80D >> 7);
963: cpu.z80D = (cpu.z80D << 1);
964: cpu.z80F |= bPostORFlags[cpu.z80D];
965: break;
966: }
967: case 0x23:
968: {
969: sdwCyclesRemaining -= 8;
970: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
971: cpu.z80F |= (cpu.z80E >> 7);
972: cpu.z80E = (cpu.z80E << 1);
973: cpu.z80F |= bPostORFlags[cpu.z80E];
974: break;
975: }
976: case 0x24:
977: {
978: sdwCyclesRemaining -= 8;
979: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
980: cpu.z80F |= (cpu.z80H >> 7);
981: cpu.z80H = (cpu.z80H << 1);
982: cpu.z80F |= bPostORFlags[cpu.z80H];
983: break;
984: }
985: case 0x25:
986: {
987: sdwCyclesRemaining -= 8;
988: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
989: cpu.z80F |= (cpu.z80L >> 7);
990: cpu.z80L = (cpu.z80L << 1);
991: cpu.z80F |= bPostORFlags[cpu.z80L];
992: break;
993: }
994: case 0x26:
995: {
996: sdwCyclesRemaining -= 15;
997: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
998: while (psMemRead->lowAddr != 0xffffffff)
999: {
1000: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
1001: {
1002: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1003: if (psMemRead->memoryCall)
1004: {
1005: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
1006: }
1007: else
1008: {
1009: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
1010: }
1011: psMemRead = NULL;
1012: break;
1013: }
1014: ++psMemRead;
1015: }
1016:
1017: if (psMemRead)
1018: {
1019: bTemp = cpu.z80Base[cpu.z80HL];
1020: }
1021:
1022: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1023: cpu.z80F |= (bTemp >> 7);
1024: bTemp = (bTemp << 1);
1025: cpu.z80F |= bPostORFlags[bTemp];
1026: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
1027: while (psMemWrite->lowAddr != 0xffffffff)
1028: {
1029: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
1030: {
1031: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1032: if (psMemWrite->memoryCall)
1033: {
1034: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
1035: }
1036: else
1037: {
1038: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
1039: }
1040: psMemWrite = NULL;
1041: break;
1042: }
1043: ++psMemWrite;
1044: }
1045:
1046: if (psMemWrite)
1047: {
1048: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
1049: }
1050:
1051: break;
1052: }
1053: case 0x27:
1054: {
1055: sdwCyclesRemaining -= 8;
1056: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1057: cpu.z80F |= (cpu.z80A >> 7);
1058: cpu.z80A = (cpu.z80A << 1);
1059: cpu.z80F |= bPostORFlags[cpu.z80A];
1060: break;
1061: }
1062: case 0x28:
1063: {
1064: sdwCyclesRemaining -= 8;
1065: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1066: cpu.z80F |= (cpu.z80B & Z80_FLAG_CARRY);
1067: cpu.z80B = (cpu.z80B >> 1) | (cpu.z80B & 0x80);
1068: cpu.z80F |= bPostORFlags[cpu.z80B];
1069: break;
1070: }
1071: case 0x29:
1072: {
1073: sdwCyclesRemaining -= 8;
1074: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1075: cpu.z80F |= (cpu.z80C & Z80_FLAG_CARRY);
1076: cpu.z80C = (cpu.z80C >> 1) | (cpu.z80C & 0x80);
1077: cpu.z80F |= bPostORFlags[cpu.z80C];
1078: break;
1079: }
1080: case 0x2a:
1081: {
1082: sdwCyclesRemaining -= 8;
1083: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1084: cpu.z80F |= (cpu.z80D & Z80_FLAG_CARRY);
1085: cpu.z80D = (cpu.z80D >> 1) | (cpu.z80D & 0x80);
1086: cpu.z80F |= bPostORFlags[cpu.z80D];
1087: break;
1088: }
1089: case 0x2b:
1090: {
1091: sdwCyclesRemaining -= 8;
1092: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1093: cpu.z80F |= (cpu.z80E & Z80_FLAG_CARRY);
1094: cpu.z80E = (cpu.z80E >> 1) | (cpu.z80E & 0x80);
1095: cpu.z80F |= bPostORFlags[cpu.z80E];
1096: break;
1097: }
1098: case 0x2c:
1099: {
1100: sdwCyclesRemaining -= 8;
1101: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1102: cpu.z80F |= (cpu.z80H & Z80_FLAG_CARRY);
1103: cpu.z80H = (cpu.z80H >> 1) | (cpu.z80H & 0x80);
1104: cpu.z80F |= bPostORFlags[cpu.z80H];
1105: break;
1106: }
1107: case 0x2d:
1108: {
1109: sdwCyclesRemaining -= 8;
1110: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1111: cpu.z80F |= (cpu.z80L & Z80_FLAG_CARRY);
1112: cpu.z80L = (cpu.z80L >> 1) | (cpu.z80L & 0x80);
1113: cpu.z80F |= bPostORFlags[cpu.z80L];
1114: break;
1115: }
1116: case 0x2e:
1117: {
1118: sdwCyclesRemaining -= 15;
1119: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
1120: while (psMemRead->lowAddr != 0xffffffff)
1121: {
1122: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
1123: {
1124: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1125: if (psMemRead->memoryCall)
1126: {
1127: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
1128: }
1129: else
1130: {
1131: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
1132: }
1133: psMemRead = NULL;
1134: break;
1135: }
1136: ++psMemRead;
1137: }
1138:
1139: if (psMemRead)
1140: {
1141: bTemp = cpu.z80Base[cpu.z80HL];
1142: }
1143:
1144: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1145: cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
1146: bTemp = (bTemp >> 1) | (bTemp & 0x80);
1147: cpu.z80F |= bPostORFlags[bTemp];
1148: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
1149: while (psMemWrite->lowAddr != 0xffffffff)
1150: {
1151: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
1152: {
1153: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1154: if (psMemWrite->memoryCall)
1155: {
1156: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
1157: }
1158: else
1159: {
1160: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
1161: }
1162: psMemWrite = NULL;
1163: break;
1164: }
1165: ++psMemWrite;
1166: }
1167:
1168: if (psMemWrite)
1169: {
1170: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
1171: }
1172:
1173: break;
1174: }
1175: case 0x2f:
1176: {
1177: sdwCyclesRemaining -= 8;
1178: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1179: cpu.z80F |= (cpu.z80A & Z80_FLAG_CARRY);
1180: cpu.z80A = (cpu.z80A >> 1) | (cpu.z80A & 0x80);
1181: cpu.z80F |= bPostORFlags[cpu.z80A];
1182: break;
1183: }
1184: case 0x30:
1185: {
1186: sdwCyclesRemaining -= 8;
1187: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1188: cpu.z80F |= (cpu.z80B >> 7);
1189: cpu.z80B = (cpu.z80B << 1);
1190: cpu.z80F |= bPostORFlags[cpu.z80B];
1191: break;
1192: }
1193: case 0x31:
1194: {
1195: sdwCyclesRemaining -= 8;
1196: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1197: cpu.z80F |= (cpu.z80C >> 7);
1198: cpu.z80C = (cpu.z80C << 1);
1199: cpu.z80F |= bPostORFlags[cpu.z80C];
1200: break;
1201: }
1202: case 0x32:
1203: {
1204: sdwCyclesRemaining -= 8;
1205: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1206: cpu.z80F |= (cpu.z80D >> 7);
1207: cpu.z80D = (cpu.z80D << 1);
1208: cpu.z80F |= bPostORFlags[cpu.z80D];
1209: break;
1210: }
1211: case 0x33:
1212: {
1213: sdwCyclesRemaining -= 8;
1214: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1215: cpu.z80F |= (cpu.z80E >> 7);
1216: cpu.z80E = (cpu.z80E << 1);
1217: cpu.z80F |= bPostORFlags[cpu.z80E];
1218: break;
1219: }
1220: case 0x34:
1221: {
1222: sdwCyclesRemaining -= 8;
1223: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1224: cpu.z80F |= (cpu.z80H >> 7);
1225: cpu.z80H = (cpu.z80H << 1);
1226: cpu.z80F |= bPostORFlags[cpu.z80H];
1227: break;
1228: }
1229: case 0x35:
1230: {
1231: sdwCyclesRemaining -= 8;
1232: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1233: cpu.z80F |= (cpu.z80L >> 7);
1234: cpu.z80L = (cpu.z80L << 1);
1235: cpu.z80F |= bPostORFlags[cpu.z80L];
1236: break;
1237: }
1238: case 0x36:
1239: {
1240: sdwCyclesRemaining -= 15;
1241: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
1242: while (psMemRead->lowAddr != 0xffffffff)
1243: {
1244: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
1245: {
1246: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1247: if (psMemRead->memoryCall)
1248: {
1249: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
1250: }
1251: else
1252: {
1253: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
1254: }
1255: psMemRead = NULL;
1256: break;
1257: }
1258: ++psMemRead;
1259: }
1260:
1261: if (psMemRead)
1262: {
1263: bTemp = cpu.z80Base[cpu.z80HL];
1264: }
1265:
1266: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1267: cpu.z80F |= (bTemp >> 7);
1268: bTemp = (bTemp << 1);
1269: cpu.z80F |= bPostORFlags[bTemp];
1270: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
1271: while (psMemWrite->lowAddr != 0xffffffff)
1272: {
1273: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
1274: {
1275: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1276: if (psMemWrite->memoryCall)
1277: {
1278: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
1279: }
1280: else
1281: {
1282: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
1283: }
1284: psMemWrite = NULL;
1285: break;
1286: }
1287: ++psMemWrite;
1288: }
1289:
1290: if (psMemWrite)
1291: {
1292: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
1293: }
1294:
1295: break;
1296: }
1297: case 0x37:
1298: {
1299: sdwCyclesRemaining -= 8;
1300: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1301: cpu.z80F |= (cpu.z80A >> 7);
1302: cpu.z80A = (cpu.z80A << 1);
1303: cpu.z80F |= bPostORFlags[cpu.z80A];
1304: break;
1305: }
1306: case 0x38:
1307: {
1308: sdwCyclesRemaining -= 8;
1309: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1310: cpu.z80F |= (cpu.z80B & Z80_FLAG_CARRY);
1311: cpu.z80B = (cpu.z80B >> 1);
1312: cpu.z80F |= bPostORFlags[cpu.z80B];
1313: break;
1314: }
1315: case 0x39:
1316: {
1317: sdwCyclesRemaining -= 8;
1318: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1319: cpu.z80F |= (cpu.z80C & Z80_FLAG_CARRY);
1320: cpu.z80C = (cpu.z80C >> 1);
1321: cpu.z80F |= bPostORFlags[cpu.z80C];
1322: break;
1323: }
1324: case 0x3a:
1325: {
1326: sdwCyclesRemaining -= 8;
1327: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1328: cpu.z80F |= (cpu.z80D & Z80_FLAG_CARRY);
1329: cpu.z80D = (cpu.z80D >> 1);
1330: cpu.z80F |= bPostORFlags[cpu.z80D];
1331: break;
1332: }
1333: case 0x3b:
1334: {
1335: sdwCyclesRemaining -= 8;
1336: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1337: cpu.z80F |= (cpu.z80E & Z80_FLAG_CARRY);
1338: cpu.z80E = (cpu.z80E >> 1);
1339: cpu.z80F |= bPostORFlags[cpu.z80E];
1340: break;
1341: }
1342: case 0x3c:
1343: {
1344: sdwCyclesRemaining -= 8;
1345: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1346: cpu.z80F |= (cpu.z80H & Z80_FLAG_CARRY);
1347: cpu.z80H = (cpu.z80H >> 1);
1348: cpu.z80F |= bPostORFlags[cpu.z80H];
1349: break;
1350: }
1351: case 0x3d:
1352: {
1353: sdwCyclesRemaining -= 8;
1354: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1355: cpu.z80F |= (cpu.z80L & Z80_FLAG_CARRY);
1356: cpu.z80L = (cpu.z80L >> 1);
1357: cpu.z80F |= bPostORFlags[cpu.z80L];
1358: break;
1359: }
1360: case 0x3e:
1361: {
1362: sdwCyclesRemaining -= 15;
1363: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
1364: while (psMemRead->lowAddr != 0xffffffff)
1365: {
1366: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
1367: {
1368: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1369: if (psMemRead->memoryCall)
1370: {
1371: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
1372: }
1373: else
1374: {
1375: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
1376: }
1377: psMemRead = NULL;
1378: break;
1379: }
1380: ++psMemRead;
1381: }
1382:
1383: if (psMemRead)
1384: {
1385: bTemp = cpu.z80Base[cpu.z80HL];
1386: }
1387:
1388: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1389: cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
1390: bTemp = (bTemp >> 1);
1391: cpu.z80F |= bPostORFlags[bTemp];
1392: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
1393: while (psMemWrite->lowAddr != 0xffffffff)
1394: {
1395: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
1396: {
1397: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1398: if (psMemWrite->memoryCall)
1399: {
1400: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
1401: }
1402: else
1403: {
1404: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
1405: }
1406: psMemWrite = NULL;
1407: break;
1408: }
1409: ++psMemWrite;
1410: }
1411:
1412: if (psMemWrite)
1413: {
1414: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
1415: }
1416:
1417: break;
1418: }
1419: case 0x3f:
1420: {
1421: sdwCyclesRemaining -= 8;
1422: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
1423: cpu.z80F |= (cpu.z80A & Z80_FLAG_CARRY);
1424: cpu.z80A = (cpu.z80A >> 1);
1425: cpu.z80F |= bPostORFlags[cpu.z80A];
1426: break;
1427: }
1428: case 0x40:
1429: {
1430: sdwCyclesRemaining -= 8;
1431: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1432: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1433: if (!(cpu.z80B & 0x01))
1434: {
1435: cpu.z80F |= Z80_FLAG_ZERO;
1436: }
1437: break;
1438: }
1439: case 0x41:
1440: {
1441: sdwCyclesRemaining -= 8;
1442: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1443: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1444: if (!(cpu.z80C & 0x01))
1445: {
1446: cpu.z80F |= Z80_FLAG_ZERO;
1447: }
1448: break;
1449: }
1450: case 0x42:
1451: {
1452: sdwCyclesRemaining -= 8;
1453: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1454: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1455: if (!(cpu.z80D & 0x01))
1456: {
1457: cpu.z80F |= Z80_FLAG_ZERO;
1458: }
1459: break;
1460: }
1461: case 0x43:
1462: {
1463: sdwCyclesRemaining -= 8;
1464: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1465: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1466: if (!(cpu.z80E & 0x01))
1467: {
1468: cpu.z80F |= Z80_FLAG_ZERO;
1469: }
1470: break;
1471: }
1472: case 0x44:
1473: {
1474: sdwCyclesRemaining -= 8;
1475: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1476: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1477: if (!(cpu.z80H & 0x01))
1478: {
1479: cpu.z80F |= Z80_FLAG_ZERO;
1480: }
1481: break;
1482: }
1483: case 0x45:
1484: {
1485: sdwCyclesRemaining -= 8;
1486: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1487: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1488: if (!(cpu.z80L & 0x01))
1489: {
1490: cpu.z80F |= Z80_FLAG_ZERO;
1491: }
1492: break;
1493: }
1494: case 0x46:
1495: {
1496: sdwCyclesRemaining -= 12;
1497: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
1498: while (psMemRead->lowAddr != 0xffffffff)
1499: {
1500: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
1501: {
1502: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1503: if (psMemRead->memoryCall)
1504: {
1505: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
1506: }
1507: else
1508: {
1509: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
1510: }
1511: psMemRead = NULL;
1512: break;
1513: }
1514: ++psMemRead;
1515: }
1516:
1517: if (psMemRead)
1518: {
1519: bTemp = cpu.z80Base[cpu.z80HL];
1520: }
1521:
1522: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1523: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1524: if (!(bTemp & 0x01))
1525: {
1526: cpu.z80F |= Z80_FLAG_ZERO;
1527: }
1528: break;
1529: }
1530: case 0x47:
1531: {
1532: sdwCyclesRemaining -= 8;
1533: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1534: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1535: if (!(cpu.z80A & 0x01))
1536: {
1537: cpu.z80F |= Z80_FLAG_ZERO;
1538: }
1539: break;
1540: }
1541: case 0x48:
1542: {
1543: sdwCyclesRemaining -= 8;
1544: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1545: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1546: if (!(cpu.z80B & 0x02))
1547: {
1548: cpu.z80F |= Z80_FLAG_ZERO;
1549: }
1550: break;
1551: }
1552: case 0x49:
1553: {
1554: sdwCyclesRemaining -= 8;
1555: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1556: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1557: if (!(cpu.z80C & 0x02))
1558: {
1559: cpu.z80F |= Z80_FLAG_ZERO;
1560: }
1561: break;
1562: }
1563: case 0x4a:
1564: {
1565: sdwCyclesRemaining -= 8;
1566: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1567: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1568: if (!(cpu.z80D & 0x02))
1569: {
1570: cpu.z80F |= Z80_FLAG_ZERO;
1571: }
1572: break;
1573: }
1574: case 0x4b:
1575: {
1576: sdwCyclesRemaining -= 8;
1577: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1578: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1579: if (!(cpu.z80E & 0x02))
1580: {
1581: cpu.z80F |= Z80_FLAG_ZERO;
1582: }
1583: break;
1584: }
1585: case 0x4c:
1586: {
1587: sdwCyclesRemaining -= 8;
1588: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1589: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1590: if (!(cpu.z80H & 0x02))
1591: {
1592: cpu.z80F |= Z80_FLAG_ZERO;
1593: }
1594: break;
1595: }
1596: case 0x4d:
1597: {
1598: sdwCyclesRemaining -= 8;
1599: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1600: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1601: if (!(cpu.z80L & 0x02))
1602: {
1603: cpu.z80F |= Z80_FLAG_ZERO;
1604: }
1605: break;
1606: }
1607: case 0x4e:
1608: {
1609: sdwCyclesRemaining -= 12;
1610: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
1611: while (psMemRead->lowAddr != 0xffffffff)
1612: {
1613: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
1614: {
1615: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1616: if (psMemRead->memoryCall)
1617: {
1618: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
1619: }
1620: else
1621: {
1622: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
1623: }
1624: psMemRead = NULL;
1625: break;
1626: }
1627: ++psMemRead;
1628: }
1629:
1630: if (psMemRead)
1631: {
1632: bTemp = cpu.z80Base[cpu.z80HL];
1633: }
1634:
1635: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1636: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1637: if (!(bTemp & 0x02))
1638: {
1639: cpu.z80F |= Z80_FLAG_ZERO;
1640: }
1641: break;
1642: }
1643: case 0x4f:
1644: {
1645: sdwCyclesRemaining -= 8;
1646: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1647: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1648: if (!(cpu.z80A & 0x02))
1649: {
1650: cpu.z80F |= Z80_FLAG_ZERO;
1651: }
1652: break;
1653: }
1654: case 0x50:
1655: {
1656: sdwCyclesRemaining -= 8;
1657: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1658: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1659: if (!(cpu.z80B & 0x04))
1660: {
1661: cpu.z80F |= Z80_FLAG_ZERO;
1662: }
1663: break;
1664: }
1665: case 0x51:
1666: {
1667: sdwCyclesRemaining -= 8;
1668: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1669: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1670: if (!(cpu.z80C & 0x04))
1671: {
1672: cpu.z80F |= Z80_FLAG_ZERO;
1673: }
1674: break;
1675: }
1676: case 0x52:
1677: {
1678: sdwCyclesRemaining -= 8;
1679: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1680: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1681: if (!(cpu.z80D & 0x04))
1682: {
1683: cpu.z80F |= Z80_FLAG_ZERO;
1684: }
1685: break;
1686: }
1687: case 0x53:
1688: {
1689: sdwCyclesRemaining -= 8;
1690: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1691: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1692: if (!(cpu.z80E & 0x04))
1693: {
1694: cpu.z80F |= Z80_FLAG_ZERO;
1695: }
1696: break;
1697: }
1698: case 0x54:
1699: {
1700: sdwCyclesRemaining -= 8;
1701: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1702: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1703: if (!(cpu.z80H & 0x04))
1704: {
1705: cpu.z80F |= Z80_FLAG_ZERO;
1706: }
1707: break;
1708: }
1709: case 0x55:
1710: {
1711: sdwCyclesRemaining -= 8;
1712: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1713: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1714: if (!(cpu.z80L & 0x04))
1715: {
1716: cpu.z80F |= Z80_FLAG_ZERO;
1717: }
1718: break;
1719: }
1720: case 0x56:
1721: {
1722: sdwCyclesRemaining -= 12;
1723: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
1724: while (psMemRead->lowAddr != 0xffffffff)
1725: {
1726: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
1727: {
1728: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1729: if (psMemRead->memoryCall)
1730: {
1731: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
1732: }
1733: else
1734: {
1735: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
1736: }
1737: psMemRead = NULL;
1738: break;
1739: }
1740: ++psMemRead;
1741: }
1742:
1743: if (psMemRead)
1744: {
1745: bTemp = cpu.z80Base[cpu.z80HL];
1746: }
1747:
1748: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1749: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1750: if (!(bTemp & 0x04))
1751: {
1752: cpu.z80F |= Z80_FLAG_ZERO;
1753: }
1754: break;
1755: }
1756: case 0x57:
1757: {
1758: sdwCyclesRemaining -= 8;
1759: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1760: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1761: if (!(cpu.z80A & 0x04))
1762: {
1763: cpu.z80F |= Z80_FLAG_ZERO;
1764: }
1765: break;
1766: }
1767: case 0x58:
1768: {
1769: sdwCyclesRemaining -= 8;
1770: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1771: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1772: if (!(cpu.z80B & 0x08))
1773: {
1774: cpu.z80F |= Z80_FLAG_ZERO;
1775: }
1776: break;
1777: }
1778: case 0x59:
1779: {
1780: sdwCyclesRemaining -= 8;
1781: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1782: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1783: if (!(cpu.z80C & 0x08))
1784: {
1785: cpu.z80F |= Z80_FLAG_ZERO;
1786: }
1787: break;
1788: }
1789: case 0x5a:
1790: {
1791: sdwCyclesRemaining -= 8;
1792: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1793: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1794: if (!(cpu.z80D & 0x08))
1795: {
1796: cpu.z80F |= Z80_FLAG_ZERO;
1797: }
1798: break;
1799: }
1800: case 0x5b:
1801: {
1802: sdwCyclesRemaining -= 8;
1803: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1804: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1805: if (!(cpu.z80E & 0x08))
1806: {
1807: cpu.z80F |= Z80_FLAG_ZERO;
1808: }
1809: break;
1810: }
1811: case 0x5c:
1812: {
1813: sdwCyclesRemaining -= 8;
1814: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1815: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1816: if (!(cpu.z80H & 0x08))
1817: {
1818: cpu.z80F |= Z80_FLAG_ZERO;
1819: }
1820: break;
1821: }
1822: case 0x5d:
1823: {
1824: sdwCyclesRemaining -= 8;
1825: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1826: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1827: if (!(cpu.z80L & 0x08))
1828: {
1829: cpu.z80F |= Z80_FLAG_ZERO;
1830: }
1831: break;
1832: }
1833: case 0x5e:
1834: {
1835: sdwCyclesRemaining -= 12;
1836: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
1837: while (psMemRead->lowAddr != 0xffffffff)
1838: {
1839: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
1840: {
1841: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1842: if (psMemRead->memoryCall)
1843: {
1844: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
1845: }
1846: else
1847: {
1848: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
1849: }
1850: psMemRead = NULL;
1851: break;
1852: }
1853: ++psMemRead;
1854: }
1855:
1856: if (psMemRead)
1857: {
1858: bTemp = cpu.z80Base[cpu.z80HL];
1859: }
1860:
1861: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1862: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1863: if (!(bTemp & 0x08))
1864: {
1865: cpu.z80F |= Z80_FLAG_ZERO;
1866: }
1867: break;
1868: }
1869: case 0x5f:
1870: {
1871: sdwCyclesRemaining -= 8;
1872: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1873: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1874: if (!(cpu.z80A & 0x08))
1875: {
1876: cpu.z80F |= Z80_FLAG_ZERO;
1877: }
1878: break;
1879: }
1880: case 0x60:
1881: {
1882: sdwCyclesRemaining -= 8;
1883: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1884: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1885: if (!(cpu.z80B & 0x10))
1886: {
1887: cpu.z80F |= Z80_FLAG_ZERO;
1888: }
1889: break;
1890: }
1891: case 0x61:
1892: {
1893: sdwCyclesRemaining -= 8;
1894: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1895: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1896: if (!(cpu.z80C & 0x10))
1897: {
1898: cpu.z80F |= Z80_FLAG_ZERO;
1899: }
1900: break;
1901: }
1902: case 0x62:
1903: {
1904: sdwCyclesRemaining -= 8;
1905: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1906: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1907: if (!(cpu.z80D & 0x10))
1908: {
1909: cpu.z80F |= Z80_FLAG_ZERO;
1910: }
1911: break;
1912: }
1913: case 0x63:
1914: {
1915: sdwCyclesRemaining -= 8;
1916: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1917: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1918: if (!(cpu.z80E & 0x10))
1919: {
1920: cpu.z80F |= Z80_FLAG_ZERO;
1921: }
1922: break;
1923: }
1924: case 0x64:
1925: {
1926: sdwCyclesRemaining -= 8;
1927: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1928: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1929: if (!(cpu.z80H & 0x10))
1930: {
1931: cpu.z80F |= Z80_FLAG_ZERO;
1932: }
1933: break;
1934: }
1935: case 0x65:
1936: {
1937: sdwCyclesRemaining -= 8;
1938: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1939: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1940: if (!(cpu.z80L & 0x10))
1941: {
1942: cpu.z80F |= Z80_FLAG_ZERO;
1943: }
1944: break;
1945: }
1946: case 0x66:
1947: {
1948: sdwCyclesRemaining -= 12;
1949: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
1950: while (psMemRead->lowAddr != 0xffffffff)
1951: {
1952: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
1953: {
1954: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
1955: if (psMemRead->memoryCall)
1956: {
1957: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
1958: }
1959: else
1960: {
1961: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
1962: }
1963: psMemRead = NULL;
1964: break;
1965: }
1966: ++psMemRead;
1967: }
1968:
1969: if (psMemRead)
1970: {
1971: bTemp = cpu.z80Base[cpu.z80HL];
1972: }
1973:
1974: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1975: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1976: if (!(bTemp & 0x10))
1977: {
1978: cpu.z80F |= Z80_FLAG_ZERO;
1979: }
1980: break;
1981: }
1982: case 0x67:
1983: {
1984: sdwCyclesRemaining -= 8;
1985: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1986: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1987: if (!(cpu.z80A & 0x10))
1988: {
1989: cpu.z80F |= Z80_FLAG_ZERO;
1990: }
1991: break;
1992: }
1993: case 0x68:
1994: {
1995: sdwCyclesRemaining -= 8;
1996: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
1997: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
1998: if (!(cpu.z80B & 0x20))
1999: {
2000: cpu.z80F |= Z80_FLAG_ZERO;
2001: }
2002: break;
2003: }
2004: case 0x69:
2005: {
2006: sdwCyclesRemaining -= 8;
2007: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2008: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2009: if (!(cpu.z80C & 0x20))
2010: {
2011: cpu.z80F |= Z80_FLAG_ZERO;
2012: }
2013: break;
2014: }
2015: case 0x6a:
2016: {
2017: sdwCyclesRemaining -= 8;
2018: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2019: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2020: if (!(cpu.z80D & 0x20))
2021: {
2022: cpu.z80F |= Z80_FLAG_ZERO;
2023: }
2024: break;
2025: }
2026: case 0x6b:
2027: {
2028: sdwCyclesRemaining -= 8;
2029: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2030: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2031: if (!(cpu.z80E & 0x20))
2032: {
2033: cpu.z80F |= Z80_FLAG_ZERO;
2034: }
2035: break;
2036: }
2037: case 0x6c:
2038: {
2039: sdwCyclesRemaining -= 8;
2040: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2041: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2042: if (!(cpu.z80H & 0x20))
2043: {
2044: cpu.z80F |= Z80_FLAG_ZERO;
2045: }
2046: break;
2047: }
2048: case 0x6d:
2049: {
2050: sdwCyclesRemaining -= 8;
2051: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2052: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2053: if (!(cpu.z80L & 0x20))
2054: {
2055: cpu.z80F |= Z80_FLAG_ZERO;
2056: }
2057: break;
2058: }
2059: case 0x6e:
2060: {
2061: sdwCyclesRemaining -= 12;
2062: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
2063: while (psMemRead->lowAddr != 0xffffffff)
2064: {
2065: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
2066: {
2067: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2068: if (psMemRead->memoryCall)
2069: {
2070: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
2071: }
2072: else
2073: {
2074: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
2075: }
2076: psMemRead = NULL;
2077: break;
2078: }
2079: ++psMemRead;
2080: }
2081:
2082: if (psMemRead)
2083: {
2084: bTemp = cpu.z80Base[cpu.z80HL];
2085: }
2086:
2087: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2088: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2089: if (!(bTemp & 0x20))
2090: {
2091: cpu.z80F |= Z80_FLAG_ZERO;
2092: }
2093: break;
2094: }
2095: case 0x6f:
2096: {
2097: sdwCyclesRemaining -= 8;
2098: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2099: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2100: if (!(cpu.z80A & 0x20))
2101: {
2102: cpu.z80F |= Z80_FLAG_ZERO;
2103: }
2104: break;
2105: }
2106: case 0x70:
2107: {
2108: sdwCyclesRemaining -= 8;
2109: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2110: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2111: if (!(cpu.z80B & 0x40))
2112: {
2113: cpu.z80F |= Z80_FLAG_ZERO;
2114: }
2115: break;
2116: }
2117: case 0x71:
2118: {
2119: sdwCyclesRemaining -= 8;
2120: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2121: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2122: if (!(cpu.z80C & 0x40))
2123: {
2124: cpu.z80F |= Z80_FLAG_ZERO;
2125: }
2126: break;
2127: }
2128: case 0x72:
2129: {
2130: sdwCyclesRemaining -= 8;
2131: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2132: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2133: if (!(cpu.z80D & 0x40))
2134: {
2135: cpu.z80F |= Z80_FLAG_ZERO;
2136: }
2137: break;
2138: }
2139: case 0x73:
2140: {
2141: sdwCyclesRemaining -= 8;
2142: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2143: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2144: if (!(cpu.z80E & 0x40))
2145: {
2146: cpu.z80F |= Z80_FLAG_ZERO;
2147: }
2148: break;
2149: }
2150: case 0x74:
2151: {
2152: sdwCyclesRemaining -= 8;
2153: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2154: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2155: if (!(cpu.z80H & 0x40))
2156: {
2157: cpu.z80F |= Z80_FLAG_ZERO;
2158: }
2159: break;
2160: }
2161: case 0x75:
2162: {
2163: sdwCyclesRemaining -= 8;
2164: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2165: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2166: if (!(cpu.z80L & 0x40))
2167: {
2168: cpu.z80F |= Z80_FLAG_ZERO;
2169: }
2170: break;
2171: }
2172: case 0x76:
2173: {
2174: sdwCyclesRemaining -= 12;
2175: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
2176: while (psMemRead->lowAddr != 0xffffffff)
2177: {
2178: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
2179: {
2180: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2181: if (psMemRead->memoryCall)
2182: {
2183: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
2184: }
2185: else
2186: {
2187: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
2188: }
2189: psMemRead = NULL;
2190: break;
2191: }
2192: ++psMemRead;
2193: }
2194:
2195: if (psMemRead)
2196: {
2197: bTemp = cpu.z80Base[cpu.z80HL];
2198: }
2199:
2200: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2201: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2202: if (!(bTemp & 0x40))
2203: {
2204: cpu.z80F |= Z80_FLAG_ZERO;
2205: }
2206: break;
2207: }
2208: case 0x77:
2209: {
2210: sdwCyclesRemaining -= 8;
2211: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2212: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2213: if (!(cpu.z80A & 0x40))
2214: {
2215: cpu.z80F |= Z80_FLAG_ZERO;
2216: }
2217: break;
2218: }
2219: case 0x78:
2220: {
2221: sdwCyclesRemaining -= 8;
2222: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2223: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2224: if (!(cpu.z80B & 0x80))
2225: {
2226: cpu.z80F |= Z80_FLAG_ZERO;
2227: }
2228: break;
2229: }
2230: case 0x79:
2231: {
2232: sdwCyclesRemaining -= 8;
2233: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2234: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2235: if (!(cpu.z80C & 0x80))
2236: {
2237: cpu.z80F |= Z80_FLAG_ZERO;
2238: }
2239: break;
2240: }
2241: case 0x7a:
2242: {
2243: sdwCyclesRemaining -= 8;
2244: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2245: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2246: if (!(cpu.z80D & 0x80))
2247: {
2248: cpu.z80F |= Z80_FLAG_ZERO;
2249: }
2250: break;
2251: }
2252: case 0x7b:
2253: {
2254: sdwCyclesRemaining -= 8;
2255: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2256: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2257: if (!(cpu.z80E & 0x80))
2258: {
2259: cpu.z80F |= Z80_FLAG_ZERO;
2260: }
2261: break;
2262: }
2263: case 0x7c:
2264: {
2265: sdwCyclesRemaining -= 8;
2266: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2267: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2268: if (!(cpu.z80H & 0x80))
2269: {
2270: cpu.z80F |= Z80_FLAG_ZERO;
2271: }
2272: break;
2273: }
2274: case 0x7d:
2275: {
2276: sdwCyclesRemaining -= 8;
2277: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2278: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2279: if (!(cpu.z80L & 0x80))
2280: {
2281: cpu.z80F |= Z80_FLAG_ZERO;
2282: }
2283: break;
2284: }
2285: case 0x7e:
2286: {
2287: sdwCyclesRemaining -= 12;
2288: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
2289: while (psMemRead->lowAddr != 0xffffffff)
2290: {
2291: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
2292: {
2293: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2294: if (psMemRead->memoryCall)
2295: {
2296: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
2297: }
2298: else
2299: {
2300: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
2301: }
2302: psMemRead = NULL;
2303: break;
2304: }
2305: ++psMemRead;
2306: }
2307:
2308: if (psMemRead)
2309: {
2310: bTemp = cpu.z80Base[cpu.z80HL];
2311: }
2312:
2313: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2314: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2315: if (!(bTemp & 0x80))
2316: {
2317: cpu.z80F |= Z80_FLAG_ZERO;
2318: }
2319: break;
2320: }
2321: case 0x7f:
2322: {
2323: sdwCyclesRemaining -= 8;
2324: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
2325: cpu.z80F |= (Z80_FLAG_HALF_CARRY);
2326: if (!(cpu.z80A & 0x80))
2327: {
2328: cpu.z80F |= Z80_FLAG_ZERO;
2329: }
2330: break;
2331: }
2332: case 0x80:
2333: {
2334: sdwCyclesRemaining -= 8;
2335: cpu.z80B &= 0xfe;
2336: break;
2337: }
2338: case 0x81:
2339: {
2340: sdwCyclesRemaining -= 8;
2341: cpu.z80C &= 0xfe;
2342: break;
2343: }
2344: case 0x82:
2345: {
2346: sdwCyclesRemaining -= 8;
2347: cpu.z80D &= 0xfe;
2348: break;
2349: }
2350: case 0x83:
2351: {
2352: sdwCyclesRemaining -= 8;
2353: cpu.z80E &= 0xfe;
2354: break;
2355: }
2356: case 0x84:
2357: {
2358: sdwCyclesRemaining -= 8;
2359: cpu.z80H &= 0xfe;
2360: break;
2361: }
2362: case 0x85:
2363: {
2364: sdwCyclesRemaining -= 8;
2365: cpu.z80L &= 0xfe;
2366: break;
2367: }
2368: case 0x86:
2369: {
2370: sdwCyclesRemaining -= 15;
2371: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
2372: while (psMemRead->lowAddr != 0xffffffff)
2373: {
2374: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
2375: {
2376: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2377: if (psMemRead->memoryCall)
2378: {
2379: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
2380: }
2381: else
2382: {
2383: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
2384: }
2385: psMemRead = NULL;
2386: break;
2387: }
2388: ++psMemRead;
2389: }
2390:
2391: if (psMemRead)
2392: {
2393: bTemp = cpu.z80Base[cpu.z80HL];
2394: }
2395:
2396: bTemp &= 0xfe;
2397: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
2398: while (psMemWrite->lowAddr != 0xffffffff)
2399: {
2400: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
2401: {
2402: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2403: if (psMemWrite->memoryCall)
2404: {
2405: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
2406: }
2407: else
2408: {
2409: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
2410: }
2411: psMemWrite = NULL;
2412: break;
2413: }
2414: ++psMemWrite;
2415: }
2416:
2417: if (psMemWrite)
2418: {
2419: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
2420: }
2421:
2422: break;
2423: }
2424: case 0x87:
2425: {
2426: sdwCyclesRemaining -= 8;
2427: cpu.z80A &= 0xfe;
2428: break;
2429: }
2430: case 0x88:
2431: {
2432: sdwCyclesRemaining -= 8;
2433: cpu.z80B &= 0xfd;
2434: break;
2435: }
2436: case 0x89:
2437: {
2438: sdwCyclesRemaining -= 8;
2439: cpu.z80C &= 0xfd;
2440: break;
2441: }
2442: case 0x8a:
2443: {
2444: sdwCyclesRemaining -= 8;
2445: cpu.z80D &= 0xfd;
2446: break;
2447: }
2448: case 0x8b:
2449: {
2450: sdwCyclesRemaining -= 8;
2451: cpu.z80E &= 0xfd;
2452: break;
2453: }
2454: case 0x8c:
2455: {
2456: sdwCyclesRemaining -= 8;
2457: cpu.z80H &= 0xfd;
2458: break;
2459: }
2460: case 0x8d:
2461: {
2462: sdwCyclesRemaining -= 8;
2463: cpu.z80L &= 0xfd;
2464: break;
2465: }
2466: case 0x8e:
2467: {
2468: sdwCyclesRemaining -= 15;
2469: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
2470: while (psMemRead->lowAddr != 0xffffffff)
2471: {
2472: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
2473: {
2474: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2475: if (psMemRead->memoryCall)
2476: {
2477: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
2478: }
2479: else
2480: {
2481: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
2482: }
2483: psMemRead = NULL;
2484: break;
2485: }
2486: ++psMemRead;
2487: }
2488:
2489: if (psMemRead)
2490: {
2491: bTemp = cpu.z80Base[cpu.z80HL];
2492: }
2493:
2494: bTemp &= 0xfd;
2495: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
2496: while (psMemWrite->lowAddr != 0xffffffff)
2497: {
2498: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
2499: {
2500: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2501: if (psMemWrite->memoryCall)
2502: {
2503: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
2504: }
2505: else
2506: {
2507: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
2508: }
2509: psMemWrite = NULL;
2510: break;
2511: }
2512: ++psMemWrite;
2513: }
2514:
2515: if (psMemWrite)
2516: {
2517: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
2518: }
2519:
2520: break;
2521: }
2522: case 0x8f:
2523: {
2524: sdwCyclesRemaining -= 8;
2525: cpu.z80A &= 0xfd;
2526: break;
2527: }
2528: case 0x90:
2529: {
2530: sdwCyclesRemaining -= 8;
2531: cpu.z80B &= 0xfb;
2532: break;
2533: }
2534: case 0x91:
2535: {
2536: sdwCyclesRemaining -= 8;
2537: cpu.z80C &= 0xfb;
2538: break;
2539: }
2540: case 0x92:
2541: {
2542: sdwCyclesRemaining -= 8;
2543: cpu.z80D &= 0xfb;
2544: break;
2545: }
2546: case 0x93:
2547: {
2548: sdwCyclesRemaining -= 8;
2549: cpu.z80E &= 0xfb;
2550: break;
2551: }
2552: case 0x94:
2553: {
2554: sdwCyclesRemaining -= 8;
2555: cpu.z80H &= 0xfb;
2556: break;
2557: }
2558: case 0x95:
2559: {
2560: sdwCyclesRemaining -= 8;
2561: cpu.z80L &= 0xfb;
2562: break;
2563: }
2564: case 0x96:
2565: {
2566: sdwCyclesRemaining -= 15;
2567: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
2568: while (psMemRead->lowAddr != 0xffffffff)
2569: {
2570: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
2571: {
2572: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2573: if (psMemRead->memoryCall)
2574: {
2575: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
2576: }
2577: else
2578: {
2579: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
2580: }
2581: psMemRead = NULL;
2582: break;
2583: }
2584: ++psMemRead;
2585: }
2586:
2587: if (psMemRead)
2588: {
2589: bTemp = cpu.z80Base[cpu.z80HL];
2590: }
2591:
2592: bTemp &= 0xfb;
2593: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
2594: while (psMemWrite->lowAddr != 0xffffffff)
2595: {
2596: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
2597: {
2598: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2599: if (psMemWrite->memoryCall)
2600: {
2601: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
2602: }
2603: else
2604: {
2605: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
2606: }
2607: psMemWrite = NULL;
2608: break;
2609: }
2610: ++psMemWrite;
2611: }
2612:
2613: if (psMemWrite)
2614: {
2615: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
2616: }
2617:
2618: break;
2619: }
2620: case 0x97:
2621: {
2622: sdwCyclesRemaining -= 8;
2623: cpu.z80A &= 0xfb;
2624: break;
2625: }
2626: case 0x98:
2627: {
2628: sdwCyclesRemaining -= 8;
2629: cpu.z80B &= 0xf7;
2630: break;
2631: }
2632: case 0x99:
2633: {
2634: sdwCyclesRemaining -= 8;
2635: cpu.z80C &= 0xf7;
2636: break;
2637: }
2638: case 0x9a:
2639: {
2640: sdwCyclesRemaining -= 8;
2641: cpu.z80D &= 0xf7;
2642: break;
2643: }
2644: case 0x9b:
2645: {
2646: sdwCyclesRemaining -= 8;
2647: cpu.z80E &= 0xf7;
2648: break;
2649: }
2650: case 0x9c:
2651: {
2652: sdwCyclesRemaining -= 8;
2653: cpu.z80H &= 0xf7;
2654: break;
2655: }
2656: case 0x9d:
2657: {
2658: sdwCyclesRemaining -= 8;
2659: cpu.z80L &= 0xf7;
2660: break;
2661: }
2662: case 0x9e:
2663: {
2664: sdwCyclesRemaining -= 15;
2665: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
2666: while (psMemRead->lowAddr != 0xffffffff)
2667: {
2668: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
2669: {
2670: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2671: if (psMemRead->memoryCall)
2672: {
2673: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
2674: }
2675: else
2676: {
2677: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
2678: }
2679: psMemRead = NULL;
2680: break;
2681: }
2682: ++psMemRead;
2683: }
2684:
2685: if (psMemRead)
2686: {
2687: bTemp = cpu.z80Base[cpu.z80HL];
2688: }
2689:
2690: bTemp &= 0xf7;
2691: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
2692: while (psMemWrite->lowAddr != 0xffffffff)
2693: {
2694: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
2695: {
2696: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2697: if (psMemWrite->memoryCall)
2698: {
2699: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
2700: }
2701: else
2702: {
2703: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
2704: }
2705: psMemWrite = NULL;
2706: break;
2707: }
2708: ++psMemWrite;
2709: }
2710:
2711: if (psMemWrite)
2712: {
2713: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
2714: }
2715:
2716: break;
2717: }
2718: case 0x9f:
2719: {
2720: sdwCyclesRemaining -= 8;
2721: cpu.z80A &= 0xf7;
2722: break;
2723: }
2724: case 0xa0:
2725: {
2726: sdwCyclesRemaining -= 8;
2727: cpu.z80B &= 0xef;
2728: break;
2729: }
2730: case 0xa1:
2731: {
2732: sdwCyclesRemaining -= 8;
2733: cpu.z80C &= 0xef;
2734: break;
2735: }
2736: case 0xa2:
2737: {
2738: sdwCyclesRemaining -= 8;
2739: cpu.z80D &= 0xef;
2740: break;
2741: }
2742: case 0xa3:
2743: {
2744: sdwCyclesRemaining -= 8;
2745: cpu.z80E &= 0xef;
2746: break;
2747: }
2748: case 0xa4:
2749: {
2750: sdwCyclesRemaining -= 8;
2751: cpu.z80H &= 0xef;
2752: break;
2753: }
2754: case 0xa5:
2755: {
2756: sdwCyclesRemaining -= 8;
2757: cpu.z80L &= 0xef;
2758: break;
2759: }
2760: case 0xa6:
2761: {
2762: sdwCyclesRemaining -= 15;
2763: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
2764: while (psMemRead->lowAddr != 0xffffffff)
2765: {
2766: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
2767: {
2768: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2769: if (psMemRead->memoryCall)
2770: {
2771: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
2772: }
2773: else
2774: {
2775: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
2776: }
2777: psMemRead = NULL;
2778: break;
2779: }
2780: ++psMemRead;
2781: }
2782:
2783: if (psMemRead)
2784: {
2785: bTemp = cpu.z80Base[cpu.z80HL];
2786: }
2787:
2788: bTemp &= 0xef;
2789: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
2790: while (psMemWrite->lowAddr != 0xffffffff)
2791: {
2792: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
2793: {
2794: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2795: if (psMemWrite->memoryCall)
2796: {
2797: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
2798: }
2799: else
2800: {
2801: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
2802: }
2803: psMemWrite = NULL;
2804: break;
2805: }
2806: ++psMemWrite;
2807: }
2808:
2809: if (psMemWrite)
2810: {
2811: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
2812: }
2813:
2814: break;
2815: }
2816: case 0xa7:
2817: {
2818: sdwCyclesRemaining -= 8;
2819: cpu.z80A &= 0xef;
2820: break;
2821: }
2822: case 0xa8:
2823: {
2824: sdwCyclesRemaining -= 8;
2825: cpu.z80B &= 0xdf;
2826: break;
2827: }
2828: case 0xa9:
2829: {
2830: sdwCyclesRemaining -= 8;
2831: cpu.z80C &= 0xdf;
2832: break;
2833: }
2834: case 0xaa:
2835: {
2836: sdwCyclesRemaining -= 8;
2837: cpu.z80D &= 0xdf;
2838: break;
2839: }
2840: case 0xab:
2841: {
2842: sdwCyclesRemaining -= 8;
2843: cpu.z80E &= 0xdf;
2844: break;
2845: }
2846: case 0xac:
2847: {
2848: sdwCyclesRemaining -= 8;
2849: cpu.z80H &= 0xdf;
2850: break;
2851: }
2852: case 0xad:
2853: {
2854: sdwCyclesRemaining -= 8;
2855: cpu.z80L &= 0xdf;
2856: break;
2857: }
2858: case 0xae:
2859: {
2860: sdwCyclesRemaining -= 15;
2861: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
2862: while (psMemRead->lowAddr != 0xffffffff)
2863: {
2864: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
2865: {
2866: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2867: if (psMemRead->memoryCall)
2868: {
2869: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
2870: }
2871: else
2872: {
2873: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
2874: }
2875: psMemRead = NULL;
2876: break;
2877: }
2878: ++psMemRead;
2879: }
2880:
2881: if (psMemRead)
2882: {
2883: bTemp = cpu.z80Base[cpu.z80HL];
2884: }
2885:
2886: bTemp &= 0xdf;
2887: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
2888: while (psMemWrite->lowAddr != 0xffffffff)
2889: {
2890: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
2891: {
2892: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2893: if (psMemWrite->memoryCall)
2894: {
2895: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
2896: }
2897: else
2898: {
2899: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
2900: }
2901: psMemWrite = NULL;
2902: break;
2903: }
2904: ++psMemWrite;
2905: }
2906:
2907: if (psMemWrite)
2908: {
2909: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
2910: }
2911:
2912: break;
2913: }
2914: case 0xaf:
2915: {
2916: sdwCyclesRemaining -= 8;
2917: cpu.z80A &= 0xdf;
2918: break;
2919: }
2920: case 0xb0:
2921: {
2922: sdwCyclesRemaining -= 8;
2923: cpu.z80B &= 0xbf;
2924: break;
2925: }
2926: case 0xb1:
2927: {
2928: sdwCyclesRemaining -= 8;
2929: cpu.z80C &= 0xbf;
2930: break;
2931: }
2932: case 0xb2:
2933: {
2934: sdwCyclesRemaining -= 8;
2935: cpu.z80D &= 0xbf;
2936: break;
2937: }
2938: case 0xb3:
2939: {
2940: sdwCyclesRemaining -= 8;
2941: cpu.z80E &= 0xbf;
2942: break;
2943: }
2944: case 0xb4:
2945: {
2946: sdwCyclesRemaining -= 8;
2947: cpu.z80H &= 0xbf;
2948: break;
2949: }
2950: case 0xb5:
2951: {
2952: sdwCyclesRemaining -= 8;
2953: cpu.z80L &= 0xbf;
2954: break;
2955: }
2956: case 0xb6:
2957: {
2958: sdwCyclesRemaining -= 15;
2959: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
2960: while (psMemRead->lowAddr != 0xffffffff)
2961: {
2962: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
2963: {
2964: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2965: if (psMemRead->memoryCall)
2966: {
2967: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
2968: }
2969: else
2970: {
2971: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
2972: }
2973: psMemRead = NULL;
2974: break;
2975: }
2976: ++psMemRead;
2977: }
2978:
2979: if (psMemRead)
2980: {
2981: bTemp = cpu.z80Base[cpu.z80HL];
2982: }
2983:
2984: bTemp &= 0xbf;
2985: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
2986: while (psMemWrite->lowAddr != 0xffffffff)
2987: {
2988: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
2989: {
2990: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
2991: if (psMemWrite->memoryCall)
2992: {
2993: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
2994: }
2995: else
2996: {
2997: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
2998: }
2999: psMemWrite = NULL;
3000: break;
3001: }
3002: ++psMemWrite;
3003: }
3004:
3005: if (psMemWrite)
3006: {
3007: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
3008: }
3009:
3010: break;
3011: }
3012: case 0xb7:
3013: {
3014: sdwCyclesRemaining -= 8;
3015: cpu.z80A &= 0xbf;
3016: break;
3017: }
3018: case 0xb8:
3019: {
3020: sdwCyclesRemaining -= 8;
3021: cpu.z80B &= 0x7f;
3022: break;
3023: }
3024: case 0xb9:
3025: {
3026: sdwCyclesRemaining -= 8;
3027: cpu.z80C &= 0x7f;
3028: break;
3029: }
3030: case 0xba:
3031: {
3032: sdwCyclesRemaining -= 8;
3033: cpu.z80D &= 0x7f;
3034: break;
3035: }
3036: case 0xbb:
3037: {
3038: sdwCyclesRemaining -= 8;
3039: cpu.z80E &= 0x7f;
3040: break;
3041: }
3042: case 0xbc:
3043: {
3044: sdwCyclesRemaining -= 8;
3045: cpu.z80H &= 0x7f;
3046: break;
3047: }
3048: case 0xbd:
3049: {
3050: sdwCyclesRemaining -= 8;
3051: cpu.z80L &= 0x7f;
3052: break;
3053: }
3054: case 0xbe:
3055: {
3056: sdwCyclesRemaining -= 15;
3057: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
3058: while (psMemRead->lowAddr != 0xffffffff)
3059: {
3060: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
3061: {
3062: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3063: if (psMemRead->memoryCall)
3064: {
3065: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
3066: }
3067: else
3068: {
3069: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
3070: }
3071: psMemRead = NULL;
3072: break;
3073: }
3074: ++psMemRead;
3075: }
3076:
3077: if (psMemRead)
3078: {
3079: bTemp = cpu.z80Base[cpu.z80HL];
3080: }
3081:
3082: bTemp &= 0x7f;
3083: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
3084: while (psMemWrite->lowAddr != 0xffffffff)
3085: {
3086: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
3087: {
3088: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3089: if (psMemWrite->memoryCall)
3090: {
3091: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
3092: }
3093: else
3094: {
3095: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
3096: }
3097: psMemWrite = NULL;
3098: break;
3099: }
3100: ++psMemWrite;
3101: }
3102:
3103: if (psMemWrite)
3104: {
3105: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
3106: }
3107:
3108: break;
3109: }
3110: case 0xbf:
3111: {
3112: sdwCyclesRemaining -= 8;
3113: cpu.z80A &= 0x7f;
3114: break;
3115: }
3116: case 0xc0:
3117: {
3118: sdwCyclesRemaining -= 8;
3119: cpu.z80B |= 0x01;
3120: break;
3121: }
3122: case 0xc1:
3123: {
3124: sdwCyclesRemaining -= 8;
3125: cpu.z80C |= 0x01;
3126: break;
3127: }
3128: case 0xc2:
3129: {
3130: sdwCyclesRemaining -= 8;
3131: cpu.z80D |= 0x01;
3132: break;
3133: }
3134: case 0xc3:
3135: {
3136: sdwCyclesRemaining -= 8;
3137: cpu.z80E |= 0x01;
3138: break;
3139: }
3140: case 0xc4:
3141: {
3142: sdwCyclesRemaining -= 8;
3143: cpu.z80H |= 0x01;
3144: break;
3145: }
3146: case 0xc5:
3147: {
3148: sdwCyclesRemaining -= 8;
3149: cpu.z80L |= 0x01;
3150: break;
3151: }
3152: case 0xc6:
3153: {
3154: sdwCyclesRemaining -= 15;
3155: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
3156: while (psMemRead->lowAddr != 0xffffffff)
3157: {
3158: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
3159: {
3160: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3161: if (psMemRead->memoryCall)
3162: {
3163: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
3164: }
3165: else
3166: {
3167: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
3168: }
3169: psMemRead = NULL;
3170: break;
3171: }
3172: ++psMemRead;
3173: }
3174:
3175: if (psMemRead)
3176: {
3177: bTemp = cpu.z80Base[cpu.z80HL];
3178: }
3179:
3180: bTemp |= 0x01;
3181: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
3182: while (psMemWrite->lowAddr != 0xffffffff)
3183: {
3184: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
3185: {
3186: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3187: if (psMemWrite->memoryCall)
3188: {
3189: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
3190: }
3191: else
3192: {
3193: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
3194: }
3195: psMemWrite = NULL;
3196: break;
3197: }
3198: ++psMemWrite;
3199: }
3200:
3201: if (psMemWrite)
3202: {
3203: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
3204: }
3205:
3206: break;
3207: }
3208: case 0xc7:
3209: {
3210: sdwCyclesRemaining -= 8;
3211: cpu.z80A |= 0x01;
3212: break;
3213: }
3214: case 0xc8:
3215: {
3216: sdwCyclesRemaining -= 8;
3217: cpu.z80B |= 0x02;
3218: break;
3219: }
3220: case 0xc9:
3221: {
3222: sdwCyclesRemaining -= 8;
3223: cpu.z80C |= 0x02;
3224: break;
3225: }
3226: case 0xca:
3227: {
3228: sdwCyclesRemaining -= 8;
3229: cpu.z80D |= 0x02;
3230: break;
3231: }
3232: case 0xcb:
3233: {
3234: sdwCyclesRemaining -= 8;
3235: cpu.z80E |= 0x02;
3236: break;
3237: }
3238: case 0xcc:
3239: {
3240: sdwCyclesRemaining -= 8;
3241: cpu.z80H |= 0x02;
3242: break;
3243: }
3244: case 0xcd:
3245: {
3246: sdwCyclesRemaining -= 8;
3247: cpu.z80L |= 0x02;
3248: break;
3249: }
3250: case 0xce:
3251: {
3252: sdwCyclesRemaining -= 15;
3253: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
3254: while (psMemRead->lowAddr != 0xffffffff)
3255: {
3256: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
3257: {
3258: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3259: if (psMemRead->memoryCall)
3260: {
3261: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
3262: }
3263: else
3264: {
3265: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
3266: }
3267: psMemRead = NULL;
3268: break;
3269: }
3270: ++psMemRead;
3271: }
3272:
3273: if (psMemRead)
3274: {
3275: bTemp = cpu.z80Base[cpu.z80HL];
3276: }
3277:
3278: bTemp |= 0x02;
3279: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
3280: while (psMemWrite->lowAddr != 0xffffffff)
3281: {
3282: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
3283: {
3284: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3285: if (psMemWrite->memoryCall)
3286: {
3287: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
3288: }
3289: else
3290: {
3291: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
3292: }
3293: psMemWrite = NULL;
3294: break;
3295: }
3296: ++psMemWrite;
3297: }
3298:
3299: if (psMemWrite)
3300: {
3301: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
3302: }
3303:
3304: break;
3305: }
3306: case 0xcf:
3307: {
3308: sdwCyclesRemaining -= 8;
3309: cpu.z80A |= 0x02;
3310: break;
3311: }
3312: case 0xd0:
3313: {
3314: sdwCyclesRemaining -= 8;
3315: cpu.z80B |= 0x04;
3316: break;
3317: }
3318: case 0xd1:
3319: {
3320: sdwCyclesRemaining -= 8;
3321: cpu.z80C |= 0x04;
3322: break;
3323: }
3324: case 0xd2:
3325: {
3326: sdwCyclesRemaining -= 8;
3327: cpu.z80D |= 0x04;
3328: break;
3329: }
3330: case 0xd3:
3331: {
3332: sdwCyclesRemaining -= 8;
3333: cpu.z80E |= 0x04;
3334: break;
3335: }
3336: case 0xd4:
3337: {
3338: sdwCyclesRemaining -= 8;
3339: cpu.z80H |= 0x04;
3340: break;
3341: }
3342: case 0xd5:
3343: {
3344: sdwCyclesRemaining -= 8;
3345: cpu.z80L |= 0x04;
3346: break;
3347: }
3348: case 0xd6:
3349: {
3350: sdwCyclesRemaining -= 15;
3351: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
3352: while (psMemRead->lowAddr != 0xffffffff)
3353: {
3354: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
3355: {
3356: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3357: if (psMemRead->memoryCall)
3358: {
3359: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
3360: }
3361: else
3362: {
3363: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
3364: }
3365: psMemRead = NULL;
3366: break;
3367: }
3368: ++psMemRead;
3369: }
3370:
3371: if (psMemRead)
3372: {
3373: bTemp = cpu.z80Base[cpu.z80HL];
3374: }
3375:
3376: bTemp |= 0x04;
3377: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
3378: while (psMemWrite->lowAddr != 0xffffffff)
3379: {
3380: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
3381: {
3382: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3383: if (psMemWrite->memoryCall)
3384: {
3385: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
3386: }
3387: else
3388: {
3389: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
3390: }
3391: psMemWrite = NULL;
3392: break;
3393: }
3394: ++psMemWrite;
3395: }
3396:
3397: if (psMemWrite)
3398: {
3399: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
3400: }
3401:
3402: break;
3403: }
3404: case 0xd7:
3405: {
3406: sdwCyclesRemaining -= 8;
3407: cpu.z80A |= 0x04;
3408: break;
3409: }
3410: case 0xd8:
3411: {
3412: sdwCyclesRemaining -= 8;
3413: cpu.z80B |= 0x08;
3414: break;
3415: }
3416: case 0xd9:
3417: {
3418: sdwCyclesRemaining -= 8;
3419: cpu.z80C |= 0x08;
3420: break;
3421: }
3422: case 0xda:
3423: {
3424: sdwCyclesRemaining -= 8;
3425: cpu.z80D |= 0x08;
3426: break;
3427: }
3428: case 0xdb:
3429: {
3430: sdwCyclesRemaining -= 8;
3431: cpu.z80E |= 0x08;
3432: break;
3433: }
3434: case 0xdc:
3435: {
3436: sdwCyclesRemaining -= 8;
3437: cpu.z80H |= 0x08;
3438: break;
3439: }
3440: case 0xdd:
3441: {
3442: sdwCyclesRemaining -= 8;
3443: cpu.z80L |= 0x08;
3444: break;
3445: }
3446: case 0xde:
3447: {
3448: sdwCyclesRemaining -= 15;
3449: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
3450: while (psMemRead->lowAddr != 0xffffffff)
3451: {
3452: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
3453: {
3454: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3455: if (psMemRead->memoryCall)
3456: {
3457: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
3458: }
3459: else
3460: {
3461: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
3462: }
3463: psMemRead = NULL;
3464: break;
3465: }
3466: ++psMemRead;
3467: }
3468:
3469: if (psMemRead)
3470: {
3471: bTemp = cpu.z80Base[cpu.z80HL];
3472: }
3473:
3474: bTemp |= 0x08;
3475: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
3476: while (psMemWrite->lowAddr != 0xffffffff)
3477: {
3478: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
3479: {
3480: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3481: if (psMemWrite->memoryCall)
3482: {
3483: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
3484: }
3485: else
3486: {
3487: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
3488: }
3489: psMemWrite = NULL;
3490: break;
3491: }
3492: ++psMemWrite;
3493: }
3494:
3495: if (psMemWrite)
3496: {
3497: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
3498: }
3499:
3500: break;
3501: }
3502: case 0xdf:
3503: {
3504: sdwCyclesRemaining -= 8;
3505: cpu.z80A |= 0x08;
3506: break;
3507: }
3508: case 0xe0:
3509: {
3510: sdwCyclesRemaining -= 8;
3511: cpu.z80B |= 0x10;
3512: break;
3513: }
3514: case 0xe1:
3515: {
3516: sdwCyclesRemaining -= 8;
3517: cpu.z80C |= 0x10;
3518: break;
3519: }
3520: case 0xe2:
3521: {
3522: sdwCyclesRemaining -= 8;
3523: cpu.z80D |= 0x10;
3524: break;
3525: }
3526: case 0xe3:
3527: {
3528: sdwCyclesRemaining -= 8;
3529: cpu.z80E |= 0x10;
3530: break;
3531: }
3532: case 0xe4:
3533: {
3534: sdwCyclesRemaining -= 8;
3535: cpu.z80H |= 0x10;
3536: break;
3537: }
3538: case 0xe5:
3539: {
3540: sdwCyclesRemaining -= 8;
3541: cpu.z80L |= 0x10;
3542: break;
3543: }
3544: case 0xe6:
3545: {
3546: sdwCyclesRemaining -= 15;
3547: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
3548: while (psMemRead->lowAddr != 0xffffffff)
3549: {
3550: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
3551: {
3552: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3553: if (psMemRead->memoryCall)
3554: {
3555: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
3556: }
3557: else
3558: {
3559: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
3560: }
3561: psMemRead = NULL;
3562: break;
3563: }
3564: ++psMemRead;
3565: }
3566:
3567: if (psMemRead)
3568: {
3569: bTemp = cpu.z80Base[cpu.z80HL];
3570: }
3571:
3572: bTemp |= 0x10;
3573: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
3574: while (psMemWrite->lowAddr != 0xffffffff)
3575: {
3576: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
3577: {
3578: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3579: if (psMemWrite->memoryCall)
3580: {
3581: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
3582: }
3583: else
3584: {
3585: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
3586: }
3587: psMemWrite = NULL;
3588: break;
3589: }
3590: ++psMemWrite;
3591: }
3592:
3593: if (psMemWrite)
3594: {
3595: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
3596: }
3597:
3598: break;
3599: }
3600: case 0xe7:
3601: {
3602: sdwCyclesRemaining -= 8;
3603: cpu.z80A |= 0x10;
3604: break;
3605: }
3606: case 0xe8:
3607: {
3608: sdwCyclesRemaining -= 8;
3609: cpu.z80B |= 0x20;
3610: break;
3611: }
3612: case 0xe9:
3613: {
3614: sdwCyclesRemaining -= 8;
3615: cpu.z80C |= 0x20;
3616: break;
3617: }
3618: case 0xea:
3619: {
3620: sdwCyclesRemaining -= 8;
3621: cpu.z80D |= 0x20;
3622: break;
3623: }
3624: case 0xeb:
3625: {
3626: sdwCyclesRemaining -= 8;
3627: cpu.z80E |= 0x20;
3628: break;
3629: }
3630: case 0xec:
3631: {
3632: sdwCyclesRemaining -= 8;
3633: cpu.z80H |= 0x20;
3634: break;
3635: }
3636: case 0xed:
3637: {
3638: sdwCyclesRemaining -= 8;
3639: cpu.z80L |= 0x20;
3640: break;
3641: }
3642: case 0xee:
3643: {
3644: sdwCyclesRemaining -= 15;
3645: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
3646: while (psMemRead->lowAddr != 0xffffffff)
3647: {
3648: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
3649: {
3650: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3651: if (psMemRead->memoryCall)
3652: {
3653: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
3654: }
3655: else
3656: {
3657: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
3658: }
3659: psMemRead = NULL;
3660: break;
3661: }
3662: ++psMemRead;
3663: }
3664:
3665: if (psMemRead)
3666: {
3667: bTemp = cpu.z80Base[cpu.z80HL];
3668: }
3669:
3670: bTemp |= 0x20;
3671: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
3672: while (psMemWrite->lowAddr != 0xffffffff)
3673: {
3674: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
3675: {
3676: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3677: if (psMemWrite->memoryCall)
3678: {
3679: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
3680: }
3681: else
3682: {
3683: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
3684: }
3685: psMemWrite = NULL;
3686: break;
3687: }
3688: ++psMemWrite;
3689: }
3690:
3691: if (psMemWrite)
3692: {
3693: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
3694: }
3695:
3696: break;
3697: }
3698: case 0xef:
3699: {
3700: sdwCyclesRemaining -= 8;
3701: cpu.z80A |= 0x20;
3702: break;
3703: }
3704: case 0xf0:
3705: {
3706: sdwCyclesRemaining -= 8;
3707: cpu.z80B |= 0x40;
3708: break;
3709: }
3710: case 0xf1:
3711: {
3712: sdwCyclesRemaining -= 8;
3713: cpu.z80C |= 0x40;
3714: break;
3715: }
3716: case 0xf2:
3717: {
3718: sdwCyclesRemaining -= 8;
3719: cpu.z80D |= 0x40;
3720: break;
3721: }
3722: case 0xf3:
3723: {
3724: sdwCyclesRemaining -= 8;
3725: cpu.z80E |= 0x40;
3726: break;
3727: }
3728: case 0xf4:
3729: {
3730: sdwCyclesRemaining -= 8;
3731: cpu.z80H |= 0x40;
3732: break;
3733: }
3734: case 0xf5:
3735: {
3736: sdwCyclesRemaining -= 8;
3737: cpu.z80L |= 0x40;
3738: break;
3739: }
3740: case 0xf6:
3741: {
3742: sdwCyclesRemaining -= 15;
3743: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
3744: while (psMemRead->lowAddr != 0xffffffff)
3745: {
3746: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
3747: {
3748: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3749: if (psMemRead->memoryCall)
3750: {
3751: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
3752: }
3753: else
3754: {
3755: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
3756: }
3757: psMemRead = NULL;
3758: break;
3759: }
3760: ++psMemRead;
3761: }
3762:
3763: if (psMemRead)
3764: {
3765: bTemp = cpu.z80Base[cpu.z80HL];
3766: }
3767:
3768: bTemp |= 0x40;
3769: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
3770: while (psMemWrite->lowAddr != 0xffffffff)
3771: {
3772: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
3773: {
3774: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3775: if (psMemWrite->memoryCall)
3776: {
3777: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
3778: }
3779: else
3780: {
3781: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
3782: }
3783: psMemWrite = NULL;
3784: break;
3785: }
3786: ++psMemWrite;
3787: }
3788:
3789: if (psMemWrite)
3790: {
3791: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
3792: }
3793:
3794: break;
3795: }
3796: case 0xf7:
3797: {
3798: sdwCyclesRemaining -= 8;
3799: cpu.z80A |= 0x40;
3800: break;
3801: }
3802: case 0xf8:
3803: {
3804: sdwCyclesRemaining -= 8;
3805: cpu.z80B |= 0x80;
3806: break;
3807: }
3808: case 0xf9:
3809: {
3810: sdwCyclesRemaining -= 8;
3811: cpu.z80C |= 0x80;
3812: break;
3813: }
3814: case 0xfa:
3815: {
3816: sdwCyclesRemaining -= 8;
3817: cpu.z80D |= 0x80;
3818: break;
3819: }
3820: case 0xfb:
3821: {
3822: sdwCyclesRemaining -= 8;
3823: cpu.z80E |= 0x80;
3824: break;
3825: }
3826: case 0xfc:
3827: {
3828: sdwCyclesRemaining -= 8;
3829: cpu.z80H |= 0x80;
3830: break;
3831: }
3832: case 0xfd:
3833: {
3834: sdwCyclesRemaining -= 8;
3835: cpu.z80L |= 0x80;
3836: break;
3837: }
3838: case 0xfe:
3839: {
3840: sdwCyclesRemaining -= 15;
3841: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
3842: while (psMemRead->lowAddr != 0xffffffff)
3843: {
3844: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
3845: {
3846: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3847: if (psMemRead->memoryCall)
3848: {
3849: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
3850: }
3851: else
3852: {
3853: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
3854: }
3855: psMemRead = NULL;
3856: break;
3857: }
3858: ++psMemRead;
3859: }
3860:
3861: if (psMemRead)
3862: {
3863: bTemp = cpu.z80Base[cpu.z80HL];
3864: }
3865:
3866: bTemp |= 0x80;
3867: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
3868: while (psMemWrite->lowAddr != 0xffffffff)
3869: {
3870: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
3871: {
3872: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
3873: if (psMemWrite->memoryCall)
3874: {
3875: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
3876: }
3877: else
3878: {
3879: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
3880: }
3881: psMemWrite = NULL;
3882: break;
3883: }
3884: ++psMemWrite;
3885: }
3886:
3887: if (psMemWrite)
3888: {
3889: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
3890: }
3891:
3892: break;
3893: }
3894: case 0xff:
3895: {
3896: sdwCyclesRemaining -= 8;
3897: cpu.z80A |= 0x80;
3898: break;
3899: }
3900: }
3901: }
3902: void EDHandler(void)
3903: {
3904: switch (*pbPC++)
3905: {
3906: case 0x00:
3907: {
3908: InvalidInstruction(2);
3909: break;
3910: }
3911: case 0x01:
3912: {
3913: InvalidInstruction(2);
3914: break;
3915: }
3916: case 0x02:
3917: {
3918: InvalidInstruction(2);
3919: break;
3920: }
3921: case 0x03:
3922: {
3923: InvalidInstruction(2);
3924: break;
3925: }
3926: case 0x04:
3927: {
3928: InvalidInstruction(2);
3929: break;
3930: }
3931: case 0x05:
3932: {
3933: InvalidInstruction(2);
3934: break;
3935: }
3936: case 0x06:
3937: {
3938: InvalidInstruction(2);
3939: break;
3940: }
3941: case 0x07:
3942: {
3943: InvalidInstruction(2);
3944: break;
3945: }
3946: case 0x08:
3947: {
3948: InvalidInstruction(2);
3949: break;
3950: }
3951: case 0x09:
3952: {
3953: InvalidInstruction(2);
3954: break;
3955: }
3956: case 0x0a:
3957: {
3958: InvalidInstruction(2);
3959: break;
3960: }
3961: case 0x0b:
3962: {
3963: InvalidInstruction(2);
3964: break;
3965: }
3966: case 0x0c:
3967: {
3968: InvalidInstruction(2);
3969: break;
3970: }
3971: case 0x0d:
3972: {
3973: InvalidInstruction(2);
3974: break;
3975: }
3976: case 0x0e:
3977: {
3978: InvalidInstruction(2);
3979: break;
3980: }
3981: case 0x0f:
3982: {
3983: InvalidInstruction(2);
3984: break;
3985: }
3986: case 0x10:
3987: {
3988: InvalidInstruction(2);
3989: break;
3990: }
3991: case 0x11:
3992: {
3993: InvalidInstruction(2);
3994: break;
3995: }
3996: case 0x12:
3997: {
3998: InvalidInstruction(2);
3999: break;
4000: }
4001: case 0x13:
4002: {
4003: InvalidInstruction(2);
4004: break;
4005: }
4006: case 0x14:
4007: {
4008: InvalidInstruction(2);
4009: break;
4010: }
4011: case 0x15:
4012: {
4013: InvalidInstruction(2);
4014: break;
4015: }
4016: case 0x16:
4017: {
4018: InvalidInstruction(2);
4019: break;
4020: }
4021: case 0x17:
4022: {
4023: InvalidInstruction(2);
4024: break;
4025: }
4026: case 0x18:
4027: {
4028: InvalidInstruction(2);
4029: break;
4030: }
4031: case 0x19:
4032: {
4033: InvalidInstruction(2);
4034: break;
4035: }
4036: case 0x1a:
4037: {
4038: InvalidInstruction(2);
4039: break;
4040: }
4041: case 0x1b:
4042: {
4043: InvalidInstruction(2);
4044: break;
4045: }
4046: case 0x1c:
4047: {
4048: InvalidInstruction(2);
4049: break;
4050: }
4051: case 0x1d:
4052: {
4053: InvalidInstruction(2);
4054: break;
4055: }
4056: case 0x1e:
4057: {
4058: InvalidInstruction(2);
4059: break;
4060: }
4061: case 0x1f:
4062: {
4063: InvalidInstruction(2);
4064: break;
4065: }
4066: case 0x20:
4067: {
4068: InvalidInstruction(2);
4069: break;
4070: }
4071: case 0x21:
4072: {
4073: InvalidInstruction(2);
4074: break;
4075: }
4076: case 0x22:
4077: {
4078: InvalidInstruction(2);
4079: break;
4080: }
4081: case 0x23:
4082: {
4083: InvalidInstruction(2);
4084: break;
4085: }
4086: case 0x24:
4087: {
4088: InvalidInstruction(2);
4089: break;
4090: }
4091: case 0x25:
4092: {
4093: InvalidInstruction(2);
4094: break;
4095: }
4096: case 0x26:
4097: {
4098: InvalidInstruction(2);
4099: break;
4100: }
4101: case 0x27:
4102: {
4103: InvalidInstruction(2);
4104: break;
4105: }
4106: case 0x28:
4107: {
4108: InvalidInstruction(2);
4109: break;
4110: }
4111: case 0x29:
4112: {
4113: InvalidInstruction(2);
4114: break;
4115: }
4116: case 0x2a:
4117: {
4118: InvalidInstruction(2);
4119: break;
4120: }
4121: case 0x2b:
4122: {
4123: InvalidInstruction(2);
4124: break;
4125: }
4126: case 0x2c:
4127: {
4128: InvalidInstruction(2);
4129: break;
4130: }
4131: case 0x2d:
4132: {
4133: InvalidInstruction(2);
4134: break;
4135: }
4136: case 0x2e:
4137: {
4138: InvalidInstruction(2);
4139: break;
4140: }
4141: case 0x2f:
4142: {
4143: InvalidInstruction(2);
4144: break;
4145: }
4146: case 0x30:
4147: {
4148: InvalidInstruction(2);
4149: break;
4150: }
4151: case 0x31:
4152: {
4153: InvalidInstruction(2);
4154: break;
4155: }
4156: case 0x32:
4157: {
4158: InvalidInstruction(2);
4159: break;
4160: }
4161: case 0x33:
4162: {
4163: InvalidInstruction(2);
4164: break;
4165: }
4166: case 0x34:
4167: {
4168: InvalidInstruction(2);
4169: break;
4170: }
4171: case 0x35:
4172: {
4173: InvalidInstruction(2);
4174: break;
4175: }
4176: case 0x36:
4177: {
4178: InvalidInstruction(2);
4179: break;
4180: }
4181: case 0x37:
4182: {
4183: InvalidInstruction(2);
4184: break;
4185: }
4186: case 0x38:
4187: {
4188: InvalidInstruction(2);
4189: break;
4190: }
4191: case 0x39:
4192: {
4193: InvalidInstruction(2);
4194: break;
4195: }
4196: case 0x3a:
4197: {
4198: InvalidInstruction(2);
4199: break;
4200: }
4201: case 0x3b:
4202: {
4203: InvalidInstruction(2);
4204: break;
4205: }
4206: case 0x3c:
4207: {
4208: InvalidInstruction(2);
4209: break;
4210: }
4211: case 0x3d:
4212: {
4213: InvalidInstruction(2);
4214: break;
4215: }
4216: case 0x3e:
4217: {
4218: InvalidInstruction(2);
4219: break;
4220: }
4221: case 0x3f:
4222: {
4223: InvalidInstruction(2);
4224: break;
4225: }
4226: case 0x40:
4227: {
4228: sdwCyclesRemaining -= 12;
4229: dwAddr = cpu.z80C;
4230: psIoRead = cpu.z80IoRead; /* Beginning of our handler */
4231: while (psIoRead->lowIoAddr != 0xffff)
4232: {
4233: if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
4234: {
4235: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4236: cpu.z80B = psIoRead->IOCall(dwAddr, psIoRead);
4237: psIoRead = NULL;
4238: break;
4239: }
4240: ++psIoRead;
4241: }
4242:
4243: if (psIoRead)
4244: {
4245: cpu.z80B = 0xff; /* Unclaimed I/O read */
4246: }
4247:
4248: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
4249: cpu.z80F |= bPostORFlags[cpu.z80B];
4250: break;
4251: }
4252: case 0x41:
4253: {
4254: sdwCyclesRemaining -= 12;
4255: dwAddr = cpu.z80C;
4256: psIoWrite = cpu.z80IoWrite; /* Beginning of our handler */
4257: while (psIoWrite->lowIoAddr != 0xffff)
4258: {
4259: if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
4260: {
4261: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4262: psIoWrite->IOCall(dwAddr, cpu.z80B, psIoWrite);
4263: psIoWrite = NULL;
4264: break;
4265: }
4266: ++psIoWrite;
4267: }
4268:
4269: break;
4270: }
4271: case 0x42:
4272: {
4273: sdwCyclesRemaining -= 15;
4274: dwTemp = cpu.z80HL - cpu.z80BC - (cpu.z80F & Z80_FLAG_CARRY);
4275: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
4276: cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
4277: if (0 == (dwTemp & 0xffff))
4278: {
4279: cpu.z80F |= Z80_FLAG_ZERO;
4280: }
4281: cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80BC) >> 8) & Z80_FLAG_HALF_CARRY);
4282: cpu.z80F |= ((((cpu.z80BC ^ cpu.z80HL) & (cpu.z80BC ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
4283: cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
4284: cpu.z80HL = dwTemp & 0xffff;
4285: break;
4286: }
4287: case 0x43:
4288: {
4289: sdwCyclesRemaining -= 20;
4290: dwTemp = *pbPC++;
4291: dwTemp |= ((UINT32) *pbPC++ << 8);
4292: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
4293: while (psMemWrite->lowAddr != 0xffffffff)
4294: {
4295: if ((dwTemp >= psMemWrite->lowAddr) && (dwTemp <= psMemWrite->highAddr))
4296: {
4297: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4298: if (psMemWrite->memoryCall)
4299: {
4300: psMemWrite->memoryCall(dwTemp, (cpu.z80BC & 0xff), psMemWrite);
4301: psMemWrite->memoryCall(dwTemp + 1, (cpu.z80BC >> 8), psMemWrite);
4302: }
4303: else
4304: {
4305: *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr)) = cpu.z80BC;
4306: *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr) + 1) = cpu.z80BC >> 8;
4307: }
4308: psMemWrite = NULL;
4309: break;
4310: }
4311: ++psMemWrite;
4312: }
4313:
4314: if (psMemWrite)
4315: {
4316: cpu.z80Base[dwTemp] = (UINT8) cpu.z80BC;
4317: cpu.z80Base[dwTemp + 1] = (UINT8) ((UINT32) cpu.z80BC >> 8);
4318: }
4319:
4320: break;
4321: }
4322: case 0x44:
4323: {
4324: sdwCyclesRemaining -= 8;
4325: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
4326: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
4327: pbSubSbcTable[((UINT32) 0 << 8) | cpu.z80A];
4328: cpu.z80A = 0 - cpu.z80A;
4329: break;
4330: }
4331: case 0x45:
4332: {
4333: sdwCyclesRemaining -= 14;
4334: pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
4335: dwAddr = *pbSP++; /* Pop LSB */
4336: dwAddr |= ((UINT32) *pbSP << 8); /* Pop MSB */
4337: cpu.z80sp += 2; /* Pop the word off */
4338: pbPC = (cpu.z80Base + dwAddr); /* Point PC to our return address */
4339: cpu.z80iff &= ~(IFF1); /* Keep IFF2 around */
4340: cpu.z80iff |= ((cpu.z80iff >> 1) & IFF1); /* IFF2->IFF1 */
4341: break;
4342: }
4343: case 0x46:
4344: {
4345: sdwCyclesRemaining -= 8;
4346: cpu.z80interruptMode = 0;
4347: break;
4348: }
4349: case 0x47:
4350: {
4351: sdwCyclesRemaining -= 9;
4352: cpu.z80i = cpu.z80A;
4353: break;
4354: }
4355: case 0x48:
4356: {
4357: sdwCyclesRemaining -= 12;
4358: dwAddr = cpu.z80C;
4359: psIoRead = cpu.z80IoRead; /* Beginning of our handler */
4360: while (psIoRead->lowIoAddr != 0xffff)
4361: {
4362: if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
4363: {
4364: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4365: cpu.z80C = psIoRead->IOCall(dwAddr, psIoRead);
4366: psIoRead = NULL;
4367: break;
4368: }
4369: ++psIoRead;
4370: }
4371:
4372: if (psIoRead)
4373: {
4374: cpu.z80C = 0xff; /* Unclaimed I/O read */
4375: }
4376:
4377: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
4378: cpu.z80F |= bPostORFlags[cpu.z80C];
4379: break;
4380: }
4381: case 0x49:
4382: {
4383: sdwCyclesRemaining -= 12;
4384: dwAddr = cpu.z80C;
4385: psIoWrite = cpu.z80IoWrite; /* Beginning of our handler */
4386: while (psIoWrite->lowIoAddr != 0xffff)
4387: {
4388: if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
4389: {
4390: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4391: psIoWrite->IOCall(dwAddr, cpu.z80C, psIoWrite);
4392: psIoWrite = NULL;
4393: break;
4394: }
4395: ++psIoWrite;
4396: }
4397:
4398: break;
4399: }
4400: case 0x4a:
4401: {
4402: sdwCyclesRemaining -= 15;
4403: dwTemp = cpu.z80HL + cpu.z80BC + (cpu.z80F & Z80_FLAG_CARRY);
4404: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
4405: cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
4406: if (0 == (dwTemp & 0xffff))
4407: {
4408: cpu.z80F |= Z80_FLAG_ZERO;
4409: }
4410: cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80BC) >> 8) & Z80_FLAG_HALF_CARRY);
4411: cpu.z80F |= ((((cpu.z80BC ^ cpu.z80HL ^ 0x8000) & (cpu.z80BC ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
4412: cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
4413: cpu.z80HL = dwTemp & 0xffff;
4414: break;
4415: }
4416: case 0x4b:
4417: {
4418: sdwCyclesRemaining -= 20;
4419: dwTemp = *pbPC++;
4420: dwTemp |= ((UINT32) *pbPC++ << 8);
4421: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
4422: while (psMemRead->lowAddr != 0xffffffff)
4423: {
4424: if ((dwTemp >= psMemRead->lowAddr) && (dwTemp <= psMemRead->highAddr))
4425: {
4426: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4427: if (psMemRead->memoryCall)
4428: {
4429: cpu.z80BC = psMemRead->memoryCall(dwTemp, psMemRead);
4430: cpu.z80BC |= (UINT32) ((UINT32) psMemRead->memoryCall(dwTemp + 1, psMemRead) << 8);
4431: }
4432: else
4433: {
4434: cpu.z80BC = *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr));
4435: cpu.z80BC |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr + 1)) << 8);
4436: }
4437: psMemRead = NULL;
4438: break;
4439: }
4440: ++psMemRead;
4441: }
4442:
4443: if (psMemRead)
4444: {
4445: cpu.z80BC = cpu.z80Base[dwTemp];
4446: cpu.z80BC |= (UINT32) ((UINT32) cpu.z80Base[dwTemp + 1] << 8);
4447: }
4448:
4449: break;
4450: }
4451: case 0x4c:
4452: {
4453: sdwCyclesRemaining -= 8;
4454: InvalidInstruction(2);
4455: break;
4456: }
4457: case 0x4d:
4458: {
4459: sdwCyclesRemaining -= 14;
4460: pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
4461: dwAddr = *pbSP++; /* Pop LSB */
4462: dwAddr |= ((UINT32) *pbSP << 8); /* Pop MSB */
4463: cpu.z80sp += 2; /* Pop the word off */
4464: pbPC = (cpu.z80Base + dwAddr); /* Point PC to our return address */
4465: break;
4466: }
4467: case 0x4e:
4468: {
4469: sdwCyclesRemaining -= 8;
4470: InvalidInstruction(2);
4471: break;
4472: }
4473: case 0x4f:
4474: {
4475: sdwCyclesRemaining -= 9;
4476: cpu.z80r = cpu.z80A;
4477: break;
4478: }
4479: case 0x50:
4480: {
4481: sdwCyclesRemaining -= 12;
4482: dwAddr = cpu.z80C;
4483: psIoRead = cpu.z80IoRead; /* Beginning of our handler */
4484: while (psIoRead->lowIoAddr != 0xffff)
4485: {
4486: if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
4487: {
4488: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4489: cpu.z80D = psIoRead->IOCall(dwAddr, psIoRead);
4490: psIoRead = NULL;
4491: break;
4492: }
4493: ++psIoRead;
4494: }
4495:
4496: if (psIoRead)
4497: {
4498: cpu.z80D = 0xff; /* Unclaimed I/O read */
4499: }
4500:
4501: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
4502: cpu.z80F |= bPostORFlags[cpu.z80D];
4503: break;
4504: }
4505: case 0x51:
4506: {
4507: sdwCyclesRemaining -= 12;
4508: dwAddr = cpu.z80C;
4509: psIoWrite = cpu.z80IoWrite; /* Beginning of our handler */
4510: while (psIoWrite->lowIoAddr != 0xffff)
4511: {
4512: if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
4513: {
4514: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4515: psIoWrite->IOCall(dwAddr, cpu.z80D, psIoWrite);
4516: psIoWrite = NULL;
4517: break;
4518: }
4519: ++psIoWrite;
4520: }
4521:
4522: break;
4523: }
4524: case 0x52:
4525: {
4526: sdwCyclesRemaining -= 15;
4527: dwTemp = cpu.z80HL - cpu.z80DE - (cpu.z80F & Z80_FLAG_CARRY);
4528: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
4529: cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
4530: if (0 == (dwTemp & 0xffff))
4531: {
4532: cpu.z80F |= Z80_FLAG_ZERO;
4533: }
4534: cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80DE) >> 8) & Z80_FLAG_HALF_CARRY);
4535: cpu.z80F |= ((((cpu.z80DE ^ cpu.z80HL) & (cpu.z80DE ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
4536: cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
4537: cpu.z80HL = dwTemp & 0xffff;
4538: break;
4539: }
4540: case 0x53:
4541: {
4542: sdwCyclesRemaining -= 20;
4543: dwTemp = *pbPC++;
4544: dwTemp |= ((UINT32) *pbPC++ << 8);
4545: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
4546: while (psMemWrite->lowAddr != 0xffffffff)
4547: {
4548: if ((dwTemp >= psMemWrite->lowAddr) && (dwTemp <= psMemWrite->highAddr))
4549: {
4550: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4551: if (psMemWrite->memoryCall)
4552: {
4553: psMemWrite->memoryCall(dwTemp, (cpu.z80DE & 0xff), psMemWrite);
4554: psMemWrite->memoryCall(dwTemp + 1, (cpu.z80DE >> 8), psMemWrite);
4555: }
4556: else
4557: {
4558: *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr)) = cpu.z80DE;
4559: *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr) + 1) = cpu.z80DE >> 8;
4560: }
4561: psMemWrite = NULL;
4562: break;
4563: }
4564: ++psMemWrite;
4565: }
4566:
4567: if (psMemWrite)
4568: {
4569: cpu.z80Base[dwTemp] = (UINT8) cpu.z80DE;
4570: cpu.z80Base[dwTemp + 1] = (UINT8) ((UINT32) cpu.z80DE >> 8);
4571: }
4572:
4573: break;
4574: }
4575: case 0x54:
4576: {
4577: sdwCyclesRemaining -= 8;
4578: InvalidInstruction(2);
4579: break;
4580: }
4581: case 0x55:
4582: {
4583: sdwCyclesRemaining -= 8;
4584: InvalidInstruction(2);
4585: break;
4586: }
4587: case 0x56:
4588: {
4589: sdwCyclesRemaining -= 8;
4590: cpu.z80interruptMode = 1;
4591: cpu.z80intAddr = 0x38;
4592: break;
4593: }
4594: case 0x57:
4595: {
4596: sdwCyclesRemaining -= 9;
4597: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
4598: cpu.z80F |= ((cpu.z80iff & IFF2) << 1);
4599: cpu.z80A = cpu.z80i;
4600: cpu.z80F |= bPostORFlags[cpu.z80A];
4601: break;
4602: }
4603: case 0x58:
4604: {
4605: sdwCyclesRemaining -= 12;
4606: dwAddr = cpu.z80C;
4607: psIoRead = cpu.z80IoRead; /* Beginning of our handler */
4608: while (psIoRead->lowIoAddr != 0xffff)
4609: {
4610: if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
4611: {
4612: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4613: cpu.z80E = psIoRead->IOCall(dwAddr, psIoRead);
4614: psIoRead = NULL;
4615: break;
4616: }
4617: ++psIoRead;
4618: }
4619:
4620: if (psIoRead)
4621: {
4622: cpu.z80E = 0xff; /* Unclaimed I/O read */
4623: }
4624:
4625: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
4626: cpu.z80F |= bPostORFlags[cpu.z80E];
4627: break;
4628: }
4629: case 0x59:
4630: {
4631: sdwCyclesRemaining -= 12;
4632: dwAddr = cpu.z80C;
4633: psIoWrite = cpu.z80IoWrite; /* Beginning of our handler */
4634: while (psIoWrite->lowIoAddr != 0xffff)
4635: {
4636: if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
4637: {
4638: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4639: psIoWrite->IOCall(dwAddr, cpu.z80E, psIoWrite);
4640: psIoWrite = NULL;
4641: break;
4642: }
4643: ++psIoWrite;
4644: }
4645:
4646: break;
4647: }
4648: case 0x5a:
4649: {
4650: sdwCyclesRemaining -= 15;
4651: dwTemp = cpu.z80HL + cpu.z80DE + (cpu.z80F & Z80_FLAG_CARRY);
4652: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
4653: cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
4654: if (0 == (dwTemp & 0xffff))
4655: {
4656: cpu.z80F |= Z80_FLAG_ZERO;
4657: }
4658: cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80DE) >> 8) & Z80_FLAG_HALF_CARRY);
4659: cpu.z80F |= ((((cpu.z80DE ^ cpu.z80HL ^ 0x8000) & (cpu.z80DE ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
4660: cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
4661: cpu.z80HL = dwTemp & 0xffff;
4662: break;
4663: }
4664: case 0x5b:
4665: {
4666: sdwCyclesRemaining -= 20;
4667: dwTemp = *pbPC++;
4668: dwTemp |= ((UINT32) *pbPC++ << 8);
4669: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
4670: while (psMemRead->lowAddr != 0xffffffff)
4671: {
4672: if ((dwTemp >= psMemRead->lowAddr) && (dwTemp <= psMemRead->highAddr))
4673: {
4674: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4675: if (psMemRead->memoryCall)
4676: {
4677: cpu.z80DE = psMemRead->memoryCall(dwTemp, psMemRead);
4678: cpu.z80DE |= (UINT32) ((UINT32) psMemRead->memoryCall(dwTemp + 1, psMemRead) << 8);
4679: }
4680: else
4681: {
4682: cpu.z80DE = *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr));
4683: cpu.z80DE |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr + 1)) << 8);
4684: }
4685: psMemRead = NULL;
4686: break;
4687: }
4688: ++psMemRead;
4689: }
4690:
4691: if (psMemRead)
4692: {
4693: cpu.z80DE = cpu.z80Base[dwTemp];
4694: cpu.z80DE |= (UINT32) ((UINT32) cpu.z80Base[dwTemp + 1] << 8);
4695: }
4696:
4697: break;
4698: }
4699: case 0x5c:
4700: {
4701: sdwCyclesRemaining -= 8;
4702: InvalidInstruction(2);
4703: break;
4704: }
4705: case 0x5d:
4706: {
4707: sdwCyclesRemaining -= 8;
4708: InvalidInstruction(2);
4709: break;
4710: }
4711: case 0x5e:
4712: {
4713: sdwCyclesRemaining -= 8;
4714: cpu.z80interruptMode = 2;
4715: break;
4716: }
4717: case 0x5f:
4718: {
4719: sdwCyclesRemaining -= 9;
4720: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
4721: cpu.z80F |= bPostORFlags[cpu.z80r];
4722: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_OVERFLOW_PARITY)) | ((cpu.z80iff & IFF2) << 1);
4723: cpu.z80A = cpu.z80r;
4724: bTemp = (cpu.z80r + (cpu.z80B + sdwCyclesRemaining + 1 + cpu.z80H)) ^ cpu.z80A;
4725: cpu.z80r = (cpu.z80r & 0x80) | (bTemp & 0x7f);
4726: break;
4727: }
4728: case 0x60:
4729: {
4730: sdwCyclesRemaining -= 12;
4731: dwAddr = cpu.z80C;
4732: psIoRead = cpu.z80IoRead; /* Beginning of our handler */
4733: while (psIoRead->lowIoAddr != 0xffff)
4734: {
4735: if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
4736: {
4737: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4738: cpu.z80H = psIoRead->IOCall(dwAddr, psIoRead);
4739: psIoRead = NULL;
4740: break;
4741: }
4742: ++psIoRead;
4743: }
4744:
4745: if (psIoRead)
4746: {
4747: cpu.z80H = 0xff; /* Unclaimed I/O read */
4748: }
4749:
4750: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
4751: cpu.z80F |= bPostORFlags[cpu.z80H];
4752: break;
4753: }
4754: case 0x61:
4755: {
4756: sdwCyclesRemaining -= 12;
4757: dwAddr = cpu.z80C;
4758: psIoWrite = cpu.z80IoWrite; /* Beginning of our handler */
4759: while (psIoWrite->lowIoAddr != 0xffff)
4760: {
4761: if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
4762: {
4763: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4764: psIoWrite->IOCall(dwAddr, cpu.z80H, psIoWrite);
4765: psIoWrite = NULL;
4766: break;
4767: }
4768: ++psIoWrite;
4769: }
4770:
4771: break;
4772: }
4773: case 0x62:
4774: {
4775: sdwCyclesRemaining -= 15;
4776: dwTemp = cpu.z80HL - cpu.z80HL - (cpu.z80F & Z80_FLAG_CARRY);
4777: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
4778: cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
4779: if (0 == (dwTemp & 0xffff))
4780: {
4781: cpu.z80F |= Z80_FLAG_ZERO;
4782: }
4783: cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80HL) >> 8) & Z80_FLAG_HALF_CARRY);
4784: cpu.z80F |= ((((cpu.z80HL ^ cpu.z80HL) & (cpu.z80HL ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
4785: cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
4786: cpu.z80HL = dwTemp & 0xffff;
4787: break;
4788: }
4789: case 0x63:
4790: {
4791: sdwCyclesRemaining -= 20;
4792: dwTemp = *pbPC++;
4793: dwTemp |= ((UINT32) *pbPC++ << 8);
4794: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
4795: while (psMemWrite->lowAddr != 0xffffffff)
4796: {
4797: if ((dwTemp >= psMemWrite->lowAddr) && (dwTemp <= psMemWrite->highAddr))
4798: {
4799: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4800: if (psMemWrite->memoryCall)
4801: {
4802: psMemWrite->memoryCall(dwTemp, (cpu.z80HL & 0xff), psMemWrite);
4803: psMemWrite->memoryCall(dwTemp + 1, (cpu.z80HL >> 8), psMemWrite);
4804: }
4805: else
4806: {
4807: *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr)) = cpu.z80HL;
4808: *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr) + 1) = cpu.z80HL >> 8;
4809: }
4810: psMemWrite = NULL;
4811: break;
4812: }
4813: ++psMemWrite;
4814: }
4815:
4816: if (psMemWrite)
4817: {
4818: cpu.z80Base[dwTemp] = (UINT8) cpu.z80HL;
4819: cpu.z80Base[dwTemp + 1] = (UINT8) ((UINT32) cpu.z80HL >> 8);
4820: }
4821:
4822: break;
4823: }
4824: case 0x64:
4825: {
4826: sdwCyclesRemaining -= 8;
4827: InvalidInstruction(2);
4828: break;
4829: }
4830: case 0x65:
4831: {
4832: sdwCyclesRemaining -= 8;
4833: InvalidInstruction(2);
4834: break;
4835: }
4836: case 0x66:
4837: {
4838: sdwCyclesRemaining -= 8;
4839: InvalidInstruction(2);
4840: break;
4841: }
4842: case 0x67:
4843: {
4844: sdwCyclesRemaining -= 18;
4845: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
4846: while (psMemRead->lowAddr != 0xffffffff)
4847: {
4848: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
4849: {
4850: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4851: if (psMemRead->memoryCall)
4852: {
4853: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
4854: }
4855: else
4856: {
4857: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
4858: }
4859: psMemRead = NULL;
4860: break;
4861: }
4862: ++psMemRead;
4863: }
4864:
4865: if (psMemRead)
4866: {
4867: bTemp = cpu.z80Base[cpu.z80HL];
4868: }
4869:
4870: bTemp2 = (cpu.z80A & 0x0f) << 4;
4871: cpu.z80A = (cpu.z80A & 0xf0) | (bTemp & 0x0f);
4872: bTemp = (bTemp >> 4) | bTemp2;
4873: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
4874: while (psMemWrite->lowAddr != 0xffffffff)
4875: {
4876: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
4877: {
4878: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4879: if (psMemWrite->memoryCall)
4880: {
4881: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
4882: }
4883: else
4884: {
4885: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
4886: }
4887: psMemWrite = NULL;
4888: break;
4889: }
4890: ++psMemWrite;
4891: }
4892:
4893: if (psMemWrite)
4894: {
4895: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
4896: }
4897:
4898: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
4899: cpu.z80F |= bPostORFlags[cpu.z80A];
4900: break;
4901: }
4902: case 0x68:
4903: {
4904: sdwCyclesRemaining -= 12;
4905: dwAddr = cpu.z80C;
4906: psIoRead = cpu.z80IoRead; /* Beginning of our handler */
4907: while (psIoRead->lowIoAddr != 0xffff)
4908: {
4909: if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
4910: {
4911: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4912: cpu.z80L = psIoRead->IOCall(dwAddr, psIoRead);
4913: psIoRead = NULL;
4914: break;
4915: }
4916: ++psIoRead;
4917: }
4918:
4919: if (psIoRead)
4920: {
4921: cpu.z80L = 0xff; /* Unclaimed I/O read */
4922: }
4923:
4924: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
4925: cpu.z80F |= bPostORFlags[cpu.z80L];
4926: break;
4927: }
4928: case 0x69:
4929: {
4930: sdwCyclesRemaining -= 12;
4931: dwAddr = cpu.z80C;
4932: psIoWrite = cpu.z80IoWrite; /* Beginning of our handler */
4933: while (psIoWrite->lowIoAddr != 0xffff)
4934: {
4935: if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
4936: {
4937: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4938: psIoWrite->IOCall(dwAddr, cpu.z80L, psIoWrite);
4939: psIoWrite = NULL;
4940: break;
4941: }
4942: ++psIoWrite;
4943: }
4944:
4945: break;
4946: }
4947: case 0x6a:
4948: {
4949: sdwCyclesRemaining -= 15;
4950: dwTemp = cpu.z80HL + cpu.z80HL + (cpu.z80F & Z80_FLAG_CARRY);
4951: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
4952: cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
4953: if (0 == (dwTemp & 0xffff))
4954: {
4955: cpu.z80F |= Z80_FLAG_ZERO;
4956: }
4957: cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80HL) >> 8) & Z80_FLAG_HALF_CARRY);
4958: cpu.z80F |= ((((cpu.z80HL ^ cpu.z80HL ^ 0x8000) & (cpu.z80HL ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
4959: cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
4960: cpu.z80HL = dwTemp & 0xffff;
4961: break;
4962: }
4963: case 0x6b:
4964: {
4965: sdwCyclesRemaining -= 20;
4966: InvalidInstruction(2);
4967: break;
4968: }
4969: case 0x6c:
4970: {
4971: sdwCyclesRemaining -= 8;
4972: InvalidInstruction(2);
4973: break;
4974: }
4975: case 0x6d:
4976: {
4977: sdwCyclesRemaining -= 8;
4978: InvalidInstruction(2);
4979: break;
4980: }
4981: case 0x6e:
4982: {
4983: sdwCyclesRemaining -= 8;
4984: InvalidInstruction(2);
4985: break;
4986: }
4987: case 0x6f:
4988: {
4989: sdwCyclesRemaining -= 18;
4990: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
4991: while (psMemRead->lowAddr != 0xffffffff)
4992: {
4993: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
4994: {
4995: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
4996: if (psMemRead->memoryCall)
4997: {
4998: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
4999: }
5000: else
5001: {
5002: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
5003: }
5004: psMemRead = NULL;
5005: break;
5006: }
5007: ++psMemRead;
5008: }
5009:
5010: if (psMemRead)
5011: {
5012: bTemp = cpu.z80Base[cpu.z80HL];
5013: }
5014:
5015: bTemp2 = (cpu.z80A & 0x0f);
5016: cpu.z80A = (cpu.z80A & 0xf0) | (bTemp >> 4);
5017: bTemp = (bTemp << 4) | bTemp2;
5018: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
5019: while (psMemWrite->lowAddr != 0xffffffff)
5020: {
5021: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
5022: {
5023: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5024: if (psMemWrite->memoryCall)
5025: {
5026: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
5027: }
5028: else
5029: {
5030: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
5031: }
5032: psMemWrite = NULL;
5033: break;
5034: }
5035: ++psMemWrite;
5036: }
5037:
5038: if (psMemWrite)
5039: {
5040: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
5041: }
5042:
5043: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
5044: cpu.z80F |= bPostORFlags[cpu.z80A];
5045: break;
5046: }
5047: case 0x70:
5048: {
5049: sdwCyclesRemaining -= 12;
5050: InvalidInstruction(2);
5051: break;
5052: }
5053: case 0x71:
5054: {
5055: sdwCyclesRemaining -= 12;
5056: InvalidInstruction(2);
5057: break;
5058: }
5059: case 0x72:
5060: {
5061: sdwCyclesRemaining -= 15;
5062: dwTemp = cpu.z80HL - cpu.z80sp - (cpu.z80F & Z80_FLAG_CARRY);
5063: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
5064: cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
5065: if (0 == (dwTemp & 0xffff))
5066: {
5067: cpu.z80F |= Z80_FLAG_ZERO;
5068: }
5069: cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80sp) >> 8) & Z80_FLAG_HALF_CARRY);
5070: cpu.z80F |= ((((cpu.z80sp ^ cpu.z80HL) & (cpu.z80sp ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
5071: cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
5072: cpu.z80HL = dwTemp & 0xffff;
5073: break;
5074: }
5075: case 0x73:
5076: {
5077: sdwCyclesRemaining -= 20;
5078: dwTemp = *pbPC++;
5079: dwTemp |= ((UINT32) *pbPC++ << 8);
5080: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
5081: while (psMemWrite->lowAddr != 0xffffffff)
5082: {
5083: if ((dwTemp >= psMemWrite->lowAddr) && (dwTemp <= psMemWrite->highAddr))
5084: {
5085: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5086: if (psMemWrite->memoryCall)
5087: {
5088: psMemWrite->memoryCall(dwTemp, (cpu.z80sp & 0xff), psMemWrite);
5089: psMemWrite->memoryCall(dwTemp + 1, (cpu.z80sp >> 8), psMemWrite);
5090: }
5091: else
5092: {
5093: *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr)) = cpu.z80sp;
5094: *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr) + 1) = cpu.z80sp >> 8;
5095: }
5096: psMemWrite = NULL;
5097: break;
5098: }
5099: ++psMemWrite;
5100: }
5101:
5102: if (psMemWrite)
5103: {
5104: cpu.z80Base[dwTemp] = (UINT8) cpu.z80sp;
5105: cpu.z80Base[dwTemp + 1] = (UINT8) ((UINT32) cpu.z80sp >> 8);
5106: }
5107:
5108: break;
5109: }
5110: case 0x74:
5111: {
5112: sdwCyclesRemaining -= 8;
5113: InvalidInstruction(2);
5114: break;
5115: }
5116: case 0x75:
5117: {
5118: sdwCyclesRemaining -= 8;
5119: InvalidInstruction(2);
5120: break;
5121: }
5122: case 0x76:
5123: {
5124: sdwCyclesRemaining -= 8;
5125: InvalidInstruction(2);
5126: break;
5127: }
5128: case 0x77:
5129: {
5130: InvalidInstruction(2);
5131: break;
5132: }
5133: case 0x78:
5134: {
5135: sdwCyclesRemaining -= 12;
5136: dwAddr = cpu.z80C;
5137: psIoRead = cpu.z80IoRead; /* Beginning of our handler */
5138: while (psIoRead->lowIoAddr != 0xffff)
5139: {
5140: if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
5141: {
5142: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5143: cpu.z80A = psIoRead->IOCall(dwAddr, psIoRead);
5144: psIoRead = NULL;
5145: break;
5146: }
5147: ++psIoRead;
5148: }
5149:
5150: if (psIoRead)
5151: {
5152: cpu.z80A = 0xff; /* Unclaimed I/O read */
5153: }
5154:
5155: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
5156: cpu.z80F |= bPostORFlags[cpu.z80A];
5157: break;
5158: }
5159: case 0x79:
5160: {
5161: sdwCyclesRemaining -= 12;
5162: dwAddr = cpu.z80C;
5163: psIoWrite = cpu.z80IoWrite; /* Beginning of our handler */
5164: while (psIoWrite->lowIoAddr != 0xffff)
5165: {
5166: if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
5167: {
5168: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5169: psIoWrite->IOCall(dwAddr, cpu.z80A, psIoWrite);
5170: psIoWrite = NULL;
5171: break;
5172: }
5173: ++psIoWrite;
5174: }
5175:
5176: break;
5177: }
5178: case 0x7a:
5179: {
5180: sdwCyclesRemaining -= 15;
5181: dwTemp = cpu.z80HL + cpu.z80sp + (cpu.z80F & Z80_FLAG_CARRY);
5182: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
5183: cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
5184: if (0 == (dwTemp & 0xffff))
5185: {
5186: cpu.z80F |= Z80_FLAG_ZERO;
5187: }
5188: cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80sp) >> 8) & Z80_FLAG_HALF_CARRY);
5189: cpu.z80F |= ((((cpu.z80sp ^ cpu.z80HL ^ 0x8000) & (cpu.z80sp ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
5190: cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
5191: cpu.z80HL = dwTemp & 0xffff;
5192: break;
5193: }
5194: case 0x7b:
5195: {
5196: sdwCyclesRemaining -= 20;
5197: dwTemp = *pbPC++;
5198: dwTemp |= ((UINT32) *pbPC++ << 8);
5199: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
5200: while (psMemRead->lowAddr != 0xffffffff)
5201: {
5202: if ((dwTemp >= psMemRead->lowAddr) && (dwTemp <= psMemRead->highAddr))
5203: {
5204: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5205: if (psMemRead->memoryCall)
5206: {
5207: cpu.z80sp = psMemRead->memoryCall(dwTemp, psMemRead);
5208: cpu.z80sp |= (UINT32) ((UINT32) psMemRead->memoryCall(dwTemp + 1, psMemRead) << 8);
5209: }
5210: else
5211: {
5212: cpu.z80sp = *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr));
5213: cpu.z80sp |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr + 1)) << 8);
5214: }
5215: psMemRead = NULL;
5216: break;
5217: }
5218: ++psMemRead;
5219: }
5220:
5221: if (psMemRead)
5222: {
5223: cpu.z80sp = cpu.z80Base[dwTemp];
5224: cpu.z80sp |= (UINT32) ((UINT32) cpu.z80Base[dwTemp + 1] << 8);
5225: }
5226:
5227: break;
5228: }
5229: case 0x7c:
5230: {
5231: sdwCyclesRemaining -= 8;
5232: InvalidInstruction(2);
5233: break;
5234: }
5235: case 0x7d:
5236: {
5237: sdwCyclesRemaining -= 8;
5238: InvalidInstruction(2);
5239: break;
5240: }
5241: case 0x7e:
5242: {
5243: sdwCyclesRemaining -= 8;
5244: InvalidInstruction(2);
5245: break;
5246: }
5247: case 0x7f:
5248: {
5249: InvalidInstruction(2);
5250: break;
5251: }
5252: case 0x80:
5253: {
5254: InvalidInstruction(2);
5255: break;
5256: }
5257: case 0x81:
5258: {
5259: InvalidInstruction(2);
5260: break;
5261: }
5262: case 0x82:
5263: {
5264: InvalidInstruction(2);
5265: break;
5266: }
5267: case 0x83:
5268: {
5269: InvalidInstruction(2);
5270: break;
5271: }
5272: case 0x84:
5273: {
5274: InvalidInstruction(2);
5275: break;
5276: }
5277: case 0x85:
5278: {
5279: InvalidInstruction(2);
5280: break;
5281: }
5282: case 0x86:
5283: {
5284: InvalidInstruction(2);
5285: break;
5286: }
5287: case 0x87:
5288: {
5289: InvalidInstruction(2);
5290: break;
5291: }
5292: case 0x88:
5293: {
5294: InvalidInstruction(2);
5295: break;
5296: }
5297: case 0x89:
5298: {
5299: InvalidInstruction(2);
5300: break;
5301: }
5302: case 0x8a:
5303: {
5304: InvalidInstruction(2);
5305: break;
5306: }
5307: case 0x8b:
5308: {
5309: InvalidInstruction(2);
5310: break;
5311: }
5312: case 0x8c:
5313: {
5314: InvalidInstruction(2);
5315: break;
5316: }
5317: case 0x8d:
5318: {
5319: InvalidInstruction(2);
5320: break;
5321: }
5322: case 0x8e:
5323: {
5324: InvalidInstruction(2);
5325: break;
5326: }
5327: case 0x8f:
5328: {
5329: InvalidInstruction(2);
5330: break;
5331: }
5332: case 0x90:
5333: {
5334: InvalidInstruction(2);
5335: break;
5336: }
5337: case 0x91:
5338: {
5339: InvalidInstruction(2);
5340: break;
5341: }
5342: case 0x92:
5343: {
5344: InvalidInstruction(2);
5345: break;
5346: }
5347: case 0x93:
5348: {
5349: InvalidInstruction(2);
5350: break;
5351: }
5352: case 0x94:
5353: {
5354: InvalidInstruction(2);
5355: break;
5356: }
5357: case 0x95:
5358: {
5359: InvalidInstruction(2);
5360: break;
5361: }
5362: case 0x96:
5363: {
5364: InvalidInstruction(2);
5365: break;
5366: }
5367: case 0x97:
5368: {
5369: InvalidInstruction(2);
5370: break;
5371: }
5372: case 0x98:
5373: {
5374: InvalidInstruction(2);
5375: break;
5376: }
5377: case 0x99:
5378: {
5379: InvalidInstruction(2);
5380: break;
5381: }
5382: case 0x9a:
5383: {
5384: InvalidInstruction(2);
5385: break;
5386: }
5387: case 0x9b:
5388: {
5389: InvalidInstruction(2);
5390: break;
5391: }
5392: case 0x9c:
5393: {
5394: InvalidInstruction(2);
5395: break;
5396: }
5397: case 0x9d:
5398: {
5399: InvalidInstruction(2);
5400: break;
5401: }
5402: case 0x9e:
5403: {
5404: InvalidInstruction(2);
5405: break;
5406: }
5407: case 0x9f:
5408: {
5409: InvalidInstruction(2);
5410: break;
5411: }
5412: case 0xa0:
5413: {
5414: sdwCyclesRemaining -= 16;
5415: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
5416: while (psMemRead->lowAddr != 0xffffffff)
5417: {
5418: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
5419: {
5420: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5421: if (psMemRead->memoryCall)
5422: {
5423: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
5424: }
5425: else
5426: {
5427: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
5428: }
5429: psMemRead = NULL;
5430: break;
5431: }
5432: ++psMemRead;
5433: }
5434:
5435: if (psMemRead)
5436: {
5437: bTemp = cpu.z80Base[cpu.z80HL];
5438: }
5439:
5440: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
5441: while (psMemWrite->lowAddr != 0xffffffff)
5442: {
5443: if ((cpu.z80DE >= psMemWrite->lowAddr) && (cpu.z80DE <= psMemWrite->highAddr))
5444: {
5445: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5446: if (psMemWrite->memoryCall)
5447: {
5448: psMemWrite->memoryCall(cpu.z80DE, bTemp, psMemWrite);
5449: }
5450: else
5451: {
5452: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80DE - psMemWrite->lowAddr)) = bTemp;
5453: }
5454: psMemWrite = NULL;
5455: break;
5456: }
5457: ++psMemWrite;
5458: }
5459:
5460: if (psMemWrite)
5461: {
5462: cpu.z80Base[cpu.z80DE] = (UINT8) bTemp;
5463: }
5464:
5465: ++cpu.z80HL;
5466: ++cpu.z80DE;
5467: --cpu.z80BC;
5468: cpu.z80HL &= 0xffff;
5469: cpu.z80DE &= 0xffff;
5470: cpu.z80BC &= 0xffff;
5471: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY);
5472: if (cpu.z80BC)
5473: {
5474: cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
5475: }
5476: break;
5477: }
5478: case 0xa1:
5479: {
5480: sdwCyclesRemaining -= 16;
5481: {
5482: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
5483: while (psMemRead->lowAddr != 0xffffffff)
5484: {
5485: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
5486: {
5487: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5488: if (psMemRead->memoryCall)
5489: {
5490: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
5491: }
5492: else
5493: {
5494: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
5495: }
5496: psMemRead = NULL;
5497: break;
5498: }
5499: ++psMemRead;
5500: }
5501:
5502: if (psMemRead)
5503: {
5504: bTemp = cpu.z80Base[cpu.z80HL];
5505: }
5506:
5507: cpu.z80HL++;
5508: cpu.z80HL &= 0xffff;
5509: cpu.z80BC--;
5510: cpu.z80BC &= 0xffff;
5511: }
5512: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
5513: cpu.z80F |= (pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO));
5514: if (cpu.z80BC)
5515: {
5516: cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
5517: }
5518: break;
5519: }
5520: case 0xa2:
5521: {
5522: sdwCyclesRemaining -= 16;
5523: {
5524: psIoRead = cpu.z80IoRead; /* Beginning of our handler */
5525: while (psIoRead->lowIoAddr != 0xffff)
5526: {
5527: if ((cpu.z80B >= psIoRead->lowIoAddr) && (cpu.z80B <= psIoRead->highIoAddr))
5528: {
5529: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5530: bTemp = psIoRead->IOCall(cpu.z80B, psIoRead);
5531: psIoRead = NULL;
5532: break;
5533: }
5534: ++psIoRead;
5535: }
5536:
5537: if (psIoRead)
5538: {
5539: bTemp = 0xff; /* Unclaimed I/O read */
5540: }
5541:
5542: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
5543: while (psMemWrite->lowAddr != 0xffffffff)
5544: {
5545: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
5546: {
5547: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5548: if (psMemWrite->memoryCall)
5549: {
5550: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
5551: }
5552: else
5553: {
5554: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
5555: }
5556: psMemWrite = NULL;
5557: break;
5558: }
5559: ++psMemWrite;
5560: }
5561:
5562: if (psMemWrite)
5563: {
5564: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
5565: }
5566:
5567: cpu.z80HL++;
5568: cpu.z80HL &= 0xffff;
5569: sdwCyclesRemaining -= 16;
5570: cpu.z80B--;
5571: }
5572: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
5573: cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
5574: if (cpu.z80B)
5575: {
5576: cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
5577: pbPC -= 2;
5578: }
5579: break;
5580: }
5581: case 0xa3:
5582: {
5583: sdwCyclesRemaining -= 16;
5584: {
5585: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
5586: while (psMemRead->lowAddr != 0xffffffff)
5587: {
5588: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
5589: {
5590: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5591: if (psMemRead->memoryCall)
5592: {
5593: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
5594: }
5595: else
5596: {
5597: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
5598: }
5599: psMemRead = NULL;
5600: break;
5601: }
5602: ++psMemRead;
5603: }
5604:
5605: if (psMemRead)
5606: {
5607: bTemp = cpu.z80Base[cpu.z80HL];
5608: }
5609:
5610: psIoWrite = cpu.z80IoWrite; /* Beginning of our handler */
5611: while (psIoWrite->lowIoAddr != 0xffff)
5612: {
5613: if ((cpu.z80BC >= psIoWrite->lowIoAddr) && (cpu.z80BC <= psIoWrite->highIoAddr))
5614: {
5615: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5616: psIoWrite->IOCall(cpu.z80BC, bTemp, psIoWrite);
5617: psIoWrite = NULL;
5618: break;
5619: }
5620: ++psIoWrite;
5621: }
5622:
5623: cpu.z80HL++;
5624: cpu.z80HL &= 0xffff;
5625: sdwCyclesRemaining -= 16;
5626: cpu.z80B--;
5627: }
5628: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
5629: cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
5630: if (cpu.z80B)
5631: {
5632: cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
5633: }
5634: break;
5635: }
5636: case 0xa4:
5637: {
5638: InvalidInstruction(2);
5639: break;
5640: }
5641: case 0xa5:
5642: {
5643: InvalidInstruction(2);
5644: break;
5645: }
5646: case 0xa6:
5647: {
5648: InvalidInstruction(2);
5649: break;
5650: }
5651: case 0xa7:
5652: {
5653: InvalidInstruction(2);
5654: break;
5655: }
5656: case 0xa8:
5657: {
5658: sdwCyclesRemaining -= 16;
5659: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
5660: while (psMemRead->lowAddr != 0xffffffff)
5661: {
5662: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
5663: {
5664: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5665: if (psMemRead->memoryCall)
5666: {
5667: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
5668: }
5669: else
5670: {
5671: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
5672: }
5673: psMemRead = NULL;
5674: break;
5675: }
5676: ++psMemRead;
5677: }
5678:
5679: if (psMemRead)
5680: {
5681: bTemp = cpu.z80Base[cpu.z80HL];
5682: }
5683:
5684: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
5685: while (psMemWrite->lowAddr != 0xffffffff)
5686: {
5687: if ((cpu.z80DE >= psMemWrite->lowAddr) && (cpu.z80DE <= psMemWrite->highAddr))
5688: {
5689: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5690: if (psMemWrite->memoryCall)
5691: {
5692: psMemWrite->memoryCall(cpu.z80DE, bTemp, psMemWrite);
5693: }
5694: else
5695: {
5696: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80DE - psMemWrite->lowAddr)) = bTemp;
5697: }
5698: psMemWrite = NULL;
5699: break;
5700: }
5701: ++psMemWrite;
5702: }
5703:
5704: if (psMemWrite)
5705: {
5706: cpu.z80Base[cpu.z80DE] = (UINT8) bTemp;
5707: }
5708:
5709: --cpu.z80HL;
5710: --cpu.z80DE;
5711: --cpu.z80BC;
5712: cpu.z80HL &= 0xffff;
5713: cpu.z80DE &= 0xffff;
5714: cpu.z80BC &= 0xffff;
5715: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY);
5716: if (cpu.z80BC)
5717: {
5718: cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
5719: }
5720: break;
5721: }
5722: case 0xa9:
5723: {
5724: sdwCyclesRemaining -= 16;
5725: {
5726: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
5727: while (psMemRead->lowAddr != 0xffffffff)
5728: {
5729: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
5730: {
5731: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5732: if (psMemRead->memoryCall)
5733: {
5734: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
5735: }
5736: else
5737: {
5738: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
5739: }
5740: psMemRead = NULL;
5741: break;
5742: }
5743: ++psMemRead;
5744: }
5745:
5746: if (psMemRead)
5747: {
5748: bTemp = cpu.z80Base[cpu.z80HL];
5749: }
5750:
5751: cpu.z80HL--;
5752: cpu.z80HL &= 0xffff;
5753: cpu.z80BC--;
5754: cpu.z80BC &= 0xffff;
5755: }
5756: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
5757: cpu.z80F |= (pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO));
5758: if (cpu.z80BC)
5759: {
5760: cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
5761: }
5762: break;
5763: }
5764: case 0xaa:
5765: {
5766: sdwCyclesRemaining -= 16;
5767: {
5768: psIoRead = cpu.z80IoRead; /* Beginning of our handler */
5769: while (psIoRead->lowIoAddr != 0xffff)
5770: {
5771: if ((cpu.z80B >= psIoRead->lowIoAddr) && (cpu.z80B <= psIoRead->highIoAddr))
5772: {
5773: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5774: bTemp = psIoRead->IOCall(cpu.z80B, psIoRead);
5775: psIoRead = NULL;
5776: break;
5777: }
5778: ++psIoRead;
5779: }
5780:
5781: if (psIoRead)
5782: {
5783: bTemp = 0xff; /* Unclaimed I/O read */
5784: }
5785:
5786: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
5787: while (psMemWrite->lowAddr != 0xffffffff)
5788: {
5789: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
5790: {
5791: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5792: if (psMemWrite->memoryCall)
5793: {
5794: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
5795: }
5796: else
5797: {
5798: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
5799: }
5800: psMemWrite = NULL;
5801: break;
5802: }
5803: ++psMemWrite;
5804: }
5805:
5806: if (psMemWrite)
5807: {
5808: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
5809: }
5810:
5811: cpu.z80HL--;
5812: cpu.z80HL &= 0xffff;
5813: sdwCyclesRemaining -= 16;
5814: cpu.z80B--;
5815: }
5816: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
5817: cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
5818: if (cpu.z80B)
5819: {
5820: cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
5821: pbPC -= 2;
5822: }
5823: break;
5824: }
5825: case 0xab:
5826: {
5827: sdwCyclesRemaining -= 16;
5828: {
5829: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
5830: while (psMemRead->lowAddr != 0xffffffff)
5831: {
5832: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
5833: {
5834: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5835: if (psMemRead->memoryCall)
5836: {
5837: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
5838: }
5839: else
5840: {
5841: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
5842: }
5843: psMemRead = NULL;
5844: break;
5845: }
5846: ++psMemRead;
5847: }
5848:
5849: if (psMemRead)
5850: {
5851: bTemp = cpu.z80Base[cpu.z80HL];
5852: }
5853:
5854: psIoWrite = cpu.z80IoWrite; /* Beginning of our handler */
5855: while (psIoWrite->lowIoAddr != 0xffff)
5856: {
5857: if ((cpu.z80BC >= psIoWrite->lowIoAddr) && (cpu.z80BC <= psIoWrite->highIoAddr))
5858: {
5859: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5860: psIoWrite->IOCall(cpu.z80BC, bTemp, psIoWrite);
5861: psIoWrite = NULL;
5862: break;
5863: }
5864: ++psIoWrite;
5865: }
5866:
5867: cpu.z80HL--;
5868: cpu.z80HL &= 0xffff;
5869: sdwCyclesRemaining -= 16;
5870: cpu.z80B--;
5871: }
5872: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
5873: cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
5874: if (cpu.z80B)
5875: {
5876: cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
5877: }
5878: break;
5879: }
5880: case 0xac:
5881: {
5882: InvalidInstruction(2);
5883: break;
5884: }
5885: case 0xad:
5886: {
5887: InvalidInstruction(2);
5888: break;
5889: }
5890: case 0xae:
5891: {
5892: InvalidInstruction(2);
5893: break;
5894: }
5895: case 0xaf:
5896: {
5897: InvalidInstruction(2);
5898: break;
5899: }
5900: case 0xb0:
5901: {
5902: sdwCyclesRemaining -= 16;
5903: while ((sdwCyclesRemaining > 0) && (cpu.z80BC))
5904: {
5905: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
5906: while (psMemRead->lowAddr != 0xffffffff)
5907: {
5908: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
5909: {
5910: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5911: if (psMemRead->memoryCall)
5912: {
5913: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
5914: }
5915: else
5916: {
5917: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
5918: }
5919: psMemRead = NULL;
5920: break;
5921: }
5922: ++psMemRead;
5923: }
5924:
5925: if (psMemRead)
5926: {
5927: bTemp = cpu.z80Base[cpu.z80HL];
5928: }
5929:
5930: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
5931: while (psMemWrite->lowAddr != 0xffffffff)
5932: {
5933: if ((cpu.z80DE >= psMemWrite->lowAddr) && (cpu.z80DE <= psMemWrite->highAddr))
5934: {
5935: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5936: if (psMemWrite->memoryCall)
5937: {
5938: psMemWrite->memoryCall(cpu.z80DE, bTemp, psMemWrite);
5939: }
5940: else
5941: {
5942: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80DE - psMemWrite->lowAddr)) = bTemp;
5943: }
5944: psMemWrite = NULL;
5945: break;
5946: }
5947: ++psMemWrite;
5948: }
5949:
5950: if (psMemWrite)
5951: {
5952: cpu.z80Base[cpu.z80DE] = (UINT8) bTemp;
5953: }
5954:
5955: ++cpu.z80HL;
5956: ++cpu.z80DE;
5957: --cpu.z80BC;
5958: cpu.z80HL &= 0xffff;
5959: cpu.z80DE &= 0xffff;
5960: cpu.z80BC &= 0xffff;
5961: sdwCyclesRemaining -= 21;
5962: }
5963: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY);
5964: if (cpu.z80BC)
5965: {
5966: pbPC -= 2; /* Back up so we hit this instruction again */
5967: cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
5968: }
5969: sdwCyclesRemaining -= 16;
5970: break;
5971: }
5972: case 0xb1:
5973: {
5974: sdwCyclesRemaining -= 16;
5975: while ((sdwCyclesRemaining >= 0) && (cpu.z80BC))
5976: {
5977: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
5978: while (psMemRead->lowAddr != 0xffffffff)
5979: {
5980: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
5981: {
5982: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
5983: if (psMemRead->memoryCall)
5984: {
5985: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
5986: }
5987: else
5988: {
5989: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
5990: }
5991: psMemRead = NULL;
5992: break;
5993: }
5994: ++psMemRead;
5995: }
5996:
5997: if (psMemRead)
5998: {
5999: bTemp = cpu.z80Base[cpu.z80HL];
6000: }
6001:
6002: cpu.z80HL++;
6003: cpu.z80HL &= 0xffff;
6004: cpu.z80BC--;
6005: cpu.z80BC &= 0xffff;
6006: sdwCyclesRemaining -= 16;
6007: if (cpu.z80A == bTemp)
6008: {
6009: break;
6010: }
6011: }
6012: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
6013: cpu.z80F |= (pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO));
6014: if (cpu.z80BC)
6015: {
6016: cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
6017: }
6018: break;
6019: }
6020: case 0xb2:
6021: {
6022: sdwCyclesRemaining -= 16;
6023: while ((sdwCyclesRemaining > 0) && (cpu.z80B))
6024: {
6025: psIoRead = cpu.z80IoRead; /* Beginning of our handler */
6026: while (psIoRead->lowIoAddr != 0xffff)
6027: {
6028: if ((cpu.z80B >= psIoRead->lowIoAddr) && (cpu.z80B <= psIoRead->highIoAddr))
6029: {
6030: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6031: bTemp = psIoRead->IOCall(cpu.z80B, psIoRead);
6032: psIoRead = NULL;
6033: break;
6034: }
6035: ++psIoRead;
6036: }
6037:
6038: if (psIoRead)
6039: {
6040: bTemp = 0xff; /* Unclaimed I/O read */
6041: }
6042:
6043: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
6044: while (psMemWrite->lowAddr != 0xffffffff)
6045: {
6046: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
6047: {
6048: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6049: if (psMemWrite->memoryCall)
6050: {
6051: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
6052: }
6053: else
6054: {
6055: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
6056: }
6057: psMemWrite = NULL;
6058: break;
6059: }
6060: ++psMemWrite;
6061: }
6062:
6063: if (psMemWrite)
6064: {
6065: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
6066: }
6067:
6068: cpu.z80HL++;
6069: cpu.z80HL &= 0xffff;
6070: sdwCyclesRemaining -= 16;
6071: cpu.z80B--;
6072: }
6073: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
6074: cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
6075: if (cpu.z80B)
6076: {
6077: cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
6078: pbPC -= 2;
6079: }
6080: break;
6081: }
6082: case 0xb3:
6083: {
6084: sdwCyclesRemaining -= 16;
6085: while ((sdwCyclesRemaining > 0) && (cpu.z80B))
6086: {
6087: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
6088: while (psMemRead->lowAddr != 0xffffffff)
6089: {
6090: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
6091: {
6092: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6093: if (psMemRead->memoryCall)
6094: {
6095: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
6096: }
6097: else
6098: {
6099: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
6100: }
6101: psMemRead = NULL;
6102: break;
6103: }
6104: ++psMemRead;
6105: }
6106:
6107: if (psMemRead)
6108: {
6109: bTemp = cpu.z80Base[cpu.z80HL];
6110: }
6111:
6112: psIoWrite = cpu.z80IoWrite; /* Beginning of our handler */
6113: while (psIoWrite->lowIoAddr != 0xffff)
6114: {
6115: if ((cpu.z80BC >= psIoWrite->lowIoAddr) && (cpu.z80BC <= psIoWrite->highIoAddr))
6116: {
6117: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6118: psIoWrite->IOCall(cpu.z80BC, bTemp, psIoWrite);
6119: psIoWrite = NULL;
6120: break;
6121: }
6122: ++psIoWrite;
6123: }
6124:
6125: cpu.z80HL++;
6126: cpu.z80HL &= 0xffff;
6127: sdwCyclesRemaining -= 16;
6128: cpu.z80B--;
6129: }
6130: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
6131: cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
6132: if (cpu.z80B)
6133: {
6134: cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
6135: }
6136: break;
6137: }
6138: case 0xb4:
6139: {
6140: InvalidInstruction(2);
6141: break;
6142: }
6143: case 0xb5:
6144: {
6145: InvalidInstruction(2);
6146: break;
6147: }
6148: case 0xb6:
6149: {
6150: InvalidInstruction(2);
6151: break;
6152: }
6153: case 0xb7:
6154: {
6155: InvalidInstruction(2);
6156: break;
6157: }
6158: case 0xb8:
6159: {
6160: sdwCyclesRemaining -= 16;
6161: while ((sdwCyclesRemaining > 0) && (cpu.z80BC))
6162: {
6163: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
6164: while (psMemRead->lowAddr != 0xffffffff)
6165: {
6166: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
6167: {
6168: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6169: if (psMemRead->memoryCall)
6170: {
6171: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
6172: }
6173: else
6174: {
6175: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
6176: }
6177: psMemRead = NULL;
6178: break;
6179: }
6180: ++psMemRead;
6181: }
6182:
6183: if (psMemRead)
6184: {
6185: bTemp = cpu.z80Base[cpu.z80HL];
6186: }
6187:
6188: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
6189: while (psMemWrite->lowAddr != 0xffffffff)
6190: {
6191: if ((cpu.z80DE >= psMemWrite->lowAddr) && (cpu.z80DE <= psMemWrite->highAddr))
6192: {
6193: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6194: if (psMemWrite->memoryCall)
6195: {
6196: psMemWrite->memoryCall(cpu.z80DE, bTemp, psMemWrite);
6197: }
6198: else
6199: {
6200: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80DE - psMemWrite->lowAddr)) = bTemp;
6201: }
6202: psMemWrite = NULL;
6203: break;
6204: }
6205: ++psMemWrite;
6206: }
6207:
6208: if (psMemWrite)
6209: {
6210: cpu.z80Base[cpu.z80DE] = (UINT8) bTemp;
6211: }
6212:
6213: --cpu.z80HL;
6214: --cpu.z80DE;
6215: --cpu.z80BC;
6216: cpu.z80HL &= 0xffff;
6217: cpu.z80DE &= 0xffff;
6218: cpu.z80BC &= 0xffff;
6219: sdwCyclesRemaining -= 21;
6220: }
6221: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY);
6222: if (cpu.z80BC)
6223: {
6224: pbPC -= 2; /* Back up so we hit this instruction again */
6225: cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
6226: }
6227: sdwCyclesRemaining -= 16;
6228: break;
6229: }
6230: case 0xb9:
6231: {
6232: sdwCyclesRemaining -= 16;
6233: while ((sdwCyclesRemaining >= 0) && (cpu.z80BC))
6234: {
6235: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
6236: while (psMemRead->lowAddr != 0xffffffff)
6237: {
6238: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
6239: {
6240: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6241: if (psMemRead->memoryCall)
6242: {
6243: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
6244: }
6245: else
6246: {
6247: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
6248: }
6249: psMemRead = NULL;
6250: break;
6251: }
6252: ++psMemRead;
6253: }
6254:
6255: if (psMemRead)
6256: {
6257: bTemp = cpu.z80Base[cpu.z80HL];
6258: }
6259:
6260: cpu.z80HL--;
6261: cpu.z80HL &= 0xffff;
6262: cpu.z80BC--;
6263: cpu.z80BC &= 0xffff;
6264: sdwCyclesRemaining -= 16;
6265: if (cpu.z80A == bTemp)
6266: {
6267: break;
6268: }
6269: }
6270: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
6271: cpu.z80F |= (pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO));
6272: if (cpu.z80BC)
6273: {
6274: cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
6275: }
6276: break;
6277: }
6278: case 0xba:
6279: {
6280: sdwCyclesRemaining -= 16;
6281: while ((sdwCyclesRemaining > 0) && (cpu.z80B))
6282: {
6283: psIoRead = cpu.z80IoRead; /* Beginning of our handler */
6284: while (psIoRead->lowIoAddr != 0xffff)
6285: {
6286: if ((cpu.z80B >= psIoRead->lowIoAddr) && (cpu.z80B <= psIoRead->highIoAddr))
6287: {
6288: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6289: bTemp = psIoRead->IOCall(cpu.z80B, psIoRead);
6290: psIoRead = NULL;
6291: break;
6292: }
6293: ++psIoRead;
6294: }
6295:
6296: if (psIoRead)
6297: {
6298: bTemp = 0xff; /* Unclaimed I/O read */
6299: }
6300:
6301: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
6302: while (psMemWrite->lowAddr != 0xffffffff)
6303: {
6304: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
6305: {
6306: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6307: if (psMemWrite->memoryCall)
6308: {
6309: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
6310: }
6311: else
6312: {
6313: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
6314: }
6315: psMemWrite = NULL;
6316: break;
6317: }
6318: ++psMemWrite;
6319: }
6320:
6321: if (psMemWrite)
6322: {
6323: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
6324: }
6325:
6326: cpu.z80HL--;
6327: cpu.z80HL &= 0xffff;
6328: sdwCyclesRemaining -= 16;
6329: cpu.z80B--;
6330: }
6331: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
6332: cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
6333: if (cpu.z80B)
6334: {
6335: cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
6336: pbPC -= 2;
6337: }
6338: break;
6339: }
6340: case 0xbb:
6341: {
6342: sdwCyclesRemaining -= 16;
6343: while ((sdwCyclesRemaining > 0) && (cpu.z80B))
6344: {
6345: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
6346: while (psMemRead->lowAddr != 0xffffffff)
6347: {
6348: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
6349: {
6350: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6351: if (psMemRead->memoryCall)
6352: {
6353: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
6354: }
6355: else
6356: {
6357: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
6358: }
6359: psMemRead = NULL;
6360: break;
6361: }
6362: ++psMemRead;
6363: }
6364:
6365: if (psMemRead)
6366: {
6367: bTemp = cpu.z80Base[cpu.z80HL];
6368: }
6369:
6370: psIoWrite = cpu.z80IoWrite; /* Beginning of our handler */
6371: while (psIoWrite->lowIoAddr != 0xffff)
6372: {
6373: if ((cpu.z80BC >= psIoWrite->lowIoAddr) && (cpu.z80BC <= psIoWrite->highIoAddr))
6374: {
6375: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6376: psIoWrite->IOCall(cpu.z80BC, bTemp, psIoWrite);
6377: psIoWrite = NULL;
6378: break;
6379: }
6380: ++psIoWrite;
6381: }
6382:
6383: cpu.z80HL--;
6384: cpu.z80HL &= 0xffff;
6385: sdwCyclesRemaining -= 16;
6386: cpu.z80B--;
6387: }
6388: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
6389: cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
6390: if (cpu.z80B)
6391: {
6392: cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
6393: }
6394: break;
6395: }
6396: case 0xbc:
6397: {
6398: InvalidInstruction(2);
6399: break;
6400: }
6401: case 0xbd:
6402: {
6403: InvalidInstruction(2);
6404: break;
6405: }
6406: case 0xbe:
6407: {
6408: InvalidInstruction(2);
6409: break;
6410: }
6411: case 0xbf:
6412: {
6413: InvalidInstruction(2);
6414: break;
6415: }
6416: case 0xc0:
6417: {
6418: InvalidInstruction(2);
6419: break;
6420: }
6421: case 0xc1:
6422: {
6423: InvalidInstruction(2);
6424: break;
6425: }
6426: case 0xc2:
6427: {
6428: InvalidInstruction(2);
6429: break;
6430: }
6431: case 0xc3:
6432: {
6433: InvalidInstruction(2);
6434: break;
6435: }
6436: case 0xc4:
6437: {
6438: InvalidInstruction(2);
6439: break;
6440: }
6441: case 0xc5:
6442: {
6443: InvalidInstruction(2);
6444: break;
6445: }
6446: case 0xc6:
6447: {
6448: InvalidInstruction(2);
6449: break;
6450: }
6451: case 0xc7:
6452: {
6453: InvalidInstruction(2);
6454: break;
6455: }
6456: case 0xc8:
6457: {
6458: InvalidInstruction(2);
6459: break;
6460: }
6461: case 0xc9:
6462: {
6463: InvalidInstruction(2);
6464: break;
6465: }
6466: case 0xca:
6467: {
6468: InvalidInstruction(2);
6469: break;
6470: }
6471: case 0xcb:
6472: {
6473: InvalidInstruction(2);
6474: break;
6475: }
6476: case 0xcc:
6477: {
6478: InvalidInstruction(2);
6479: break;
6480: }
6481: case 0xcd:
6482: {
6483: InvalidInstruction(2);
6484: break;
6485: }
6486: case 0xce:
6487: {
6488: InvalidInstruction(2);
6489: break;
6490: }
6491: case 0xcf:
6492: {
6493: InvalidInstruction(2);
6494: break;
6495: }
6496: case 0xd0:
6497: {
6498: InvalidInstruction(2);
6499: break;
6500: }
6501: case 0xd1:
6502: {
6503: InvalidInstruction(2);
6504: break;
6505: }
6506: case 0xd2:
6507: {
6508: InvalidInstruction(2);
6509: break;
6510: }
6511: case 0xd3:
6512: {
6513: InvalidInstruction(2);
6514: break;
6515: }
6516: case 0xd4:
6517: {
6518: InvalidInstruction(2);
6519: break;
6520: }
6521: case 0xd5:
6522: {
6523: InvalidInstruction(2);
6524: break;
6525: }
6526: case 0xd6:
6527: {
6528: InvalidInstruction(2);
6529: break;
6530: }
6531: case 0xd7:
6532: {
6533: InvalidInstruction(2);
6534: break;
6535: }
6536: case 0xd8:
6537: {
6538: InvalidInstruction(2);
6539: break;
6540: }
6541: case 0xd9:
6542: {
6543: InvalidInstruction(2);
6544: break;
6545: }
6546: case 0xda:
6547: {
6548: InvalidInstruction(2);
6549: break;
6550: }
6551: case 0xdb:
6552: {
6553: InvalidInstruction(2);
6554: break;
6555: }
6556: case 0xdc:
6557: {
6558: InvalidInstruction(2);
6559: break;
6560: }
6561: case 0xdd:
6562: {
6563: InvalidInstruction(2);
6564: break;
6565: }
6566: case 0xde:
6567: {
6568: InvalidInstruction(2);
6569: break;
6570: }
6571: case 0xdf:
6572: {
6573: InvalidInstruction(2);
6574: break;
6575: }
6576: case 0xe0:
6577: {
6578: InvalidInstruction(2);
6579: break;
6580: }
6581: case 0xe1:
6582: {
6583: InvalidInstruction(2);
6584: break;
6585: }
6586: case 0xe2:
6587: {
6588: InvalidInstruction(2);
6589: break;
6590: }
6591: case 0xe3:
6592: {
6593: InvalidInstruction(2);
6594: break;
6595: }
6596: case 0xe4:
6597: {
6598: InvalidInstruction(2);
6599: break;
6600: }
6601: case 0xe5:
6602: {
6603: InvalidInstruction(2);
6604: break;
6605: }
6606: case 0xe6:
6607: {
6608: InvalidInstruction(2);
6609: break;
6610: }
6611: case 0xe7:
6612: {
6613: InvalidInstruction(2);
6614: break;
6615: }
6616: case 0xe8:
6617: {
6618: InvalidInstruction(2);
6619: break;
6620: }
6621: case 0xe9:
6622: {
6623: InvalidInstruction(2);
6624: break;
6625: }
6626: case 0xea:
6627: {
6628: InvalidInstruction(2);
6629: break;
6630: }
6631: case 0xeb:
6632: {
6633: InvalidInstruction(2);
6634: break;
6635: }
6636: case 0xec:
6637: {
6638: InvalidInstruction(2);
6639: break;
6640: }
6641: case 0xed:
6642: {
6643: InvalidInstruction(2);
6644: break;
6645: }
6646: case 0xee:
6647: {
6648: InvalidInstruction(2);
6649: break;
6650: }
6651: case 0xef:
6652: {
6653: InvalidInstruction(2);
6654: break;
6655: }
6656: case 0xf0:
6657: {
6658: InvalidInstruction(2);
6659: break;
6660: }
6661: case 0xf1:
6662: {
6663: InvalidInstruction(2);
6664: break;
6665: }
6666: case 0xf2:
6667: {
6668: InvalidInstruction(2);
6669: break;
6670: }
6671: case 0xf3:
6672: {
6673: InvalidInstruction(2);
6674: break;
6675: }
6676: case 0xf4:
6677: {
6678: InvalidInstruction(2);
6679: break;
6680: }
6681: case 0xf5:
6682: {
6683: InvalidInstruction(2);
6684: break;
6685: }
6686: case 0xf6:
6687: {
6688: InvalidInstruction(2);
6689: break;
6690: }
6691: case 0xf7:
6692: {
6693: InvalidInstruction(2);
6694: break;
6695: }
6696: case 0xf8:
6697: {
6698: InvalidInstruction(2);
6699: break;
6700: }
6701: case 0xf9:
6702: {
6703: InvalidInstruction(2);
6704: break;
6705: }
6706: case 0xfa:
6707: {
6708: InvalidInstruction(2);
6709: break;
6710: }
6711: case 0xfb:
6712: {
6713: InvalidInstruction(2);
6714: break;
6715: }
6716: case 0xfc:
6717: {
6718: InvalidInstruction(2);
6719: break;
6720: }
6721: case 0xfd:
6722: {
6723: InvalidInstruction(2);
6724: break;
6725: }
6726: case 0xfe:
6727: {
6728: InvalidInstruction(2);
6729: break;
6730: }
6731: case 0xff:
6732: {
6733: InvalidInstruction(2);
6734: break;
6735: }
6736: }
6737: }
6738:
6739: void DDHandler(void)
6740: {
6741: switch (*pbPC++)
6742: {
6743: case 0x00:
6744: {
6745: InvalidInstruction(2);
6746: break;
6747: }
6748: case 0x01:
6749: {
6750: InvalidInstruction(2);
6751: break;
6752: }
6753: case 0x02:
6754: {
6755: InvalidInstruction(2);
6756: break;
6757: }
6758: case 0x03:
6759: {
6760: InvalidInstruction(2);
6761: break;
6762: }
6763: case 0x04:
6764: {
6765: InvalidInstruction(2);
6766: break;
6767: }
6768: case 0x05:
6769: {
6770: InvalidInstruction(2);
6771: break;
6772: }
6773: case 0x06:
6774: {
6775: InvalidInstruction(2);
6776: break;
6777: }
6778: case 0x07:
6779: {
6780: InvalidInstruction(2);
6781: break;
6782: }
6783: case 0x08:
6784: {
6785: InvalidInstruction(2);
6786: break;
6787: }
6788: case 0x09:
6789: {
6790: sdwCyclesRemaining -= 15;
6791: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
6792: dwTemp = cpu.z80IX + cpu.z80BC;
6793: cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IX ^ dwTemp ^ cpu.z80BC) >> 8) & Z80_FLAG_HALF_CARRY);
6794: cpu.z80IX = dwTemp & 0xffff;
6795: break;
6796: }
6797: case 0x0a:
6798: {
6799: InvalidInstruction(2);
6800: break;
6801: }
6802: case 0x0b:
6803: {
6804: InvalidInstruction(2);
6805: break;
6806: }
6807: case 0x0c:
6808: {
6809: InvalidInstruction(2);
6810: break;
6811: }
6812: case 0x0d:
6813: {
6814: InvalidInstruction(2);
6815: break;
6816: }
6817: case 0x0e:
6818: {
6819: InvalidInstruction(2);
6820: break;
6821: }
6822: case 0x0f:
6823: {
6824: InvalidInstruction(2);
6825: break;
6826: }
6827: case 0x10:
6828: {
6829: InvalidInstruction(2);
6830: break;
6831: }
6832: case 0x11:
6833: {
6834: InvalidInstruction(2);
6835: break;
6836: }
6837: case 0x12:
6838: {
6839: InvalidInstruction(2);
6840: break;
6841: }
6842: case 0x13:
6843: {
6844: InvalidInstruction(2);
6845: break;
6846: }
6847: case 0x14:
6848: {
6849: InvalidInstruction(2);
6850: break;
6851: }
6852: case 0x15:
6853: {
6854: InvalidInstruction(2);
6855: break;
6856: }
6857: case 0x16:
6858: {
6859: InvalidInstruction(2);
6860: break;
6861: }
6862: case 0x17:
6863: {
6864: InvalidInstruction(2);
6865: break;
6866: }
6867: case 0x18:
6868: {
6869: InvalidInstruction(2);
6870: break;
6871: }
6872: case 0x19:
6873: {
6874: sdwCyclesRemaining -= 15;
6875: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
6876: dwTemp = cpu.z80IX + cpu.z80DE;
6877: cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IX ^ dwTemp ^ cpu.z80DE) >> 8) & Z80_FLAG_HALF_CARRY);
6878: cpu.z80IX = dwTemp & 0xffff;
6879: break;
6880: }
6881: case 0x1a:
6882: {
6883: InvalidInstruction(2);
6884: break;
6885: }
6886: case 0x1b:
6887: {
6888: InvalidInstruction(2);
6889: break;
6890: }
6891: case 0x1c:
6892: {
6893: InvalidInstruction(2);
6894: break;
6895: }
6896: case 0x1d:
6897: {
6898: InvalidInstruction(2);
6899: break;
6900: }
6901: case 0x1e:
6902: {
6903: InvalidInstruction(2);
6904: break;
6905: }
6906: case 0x1f:
6907: {
6908: InvalidInstruction(2);
6909: break;
6910: }
6911: case 0x20:
6912: {
6913: InvalidInstruction(2);
6914: break;
6915: }
6916: case 0x21:
6917: {
6918: sdwCyclesRemaining -= 14;
6919: cpu.z80IX = *pbPC++;
6920: cpu.z80IX |= ((UINT32) *pbPC++ << 8);
6921: break;
6922: }
6923: case 0x22:
6924: {
6925: sdwCyclesRemaining -= 20;
6926: dwAddr = *pbPC++;
6927: dwAddr |= ((UINT32) *pbPC++ << 8);
6928: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
6929: while (psMemWrite->lowAddr != 0xffffffff)
6930: {
6931: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
6932: {
6933: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
6934: if (psMemWrite->memoryCall)
6935: {
6936: psMemWrite->memoryCall(dwAddr, (cpu.z80IX & 0xff), psMemWrite);
6937: psMemWrite->memoryCall(dwAddr + 1, (cpu.z80IX >> 8), psMemWrite);
6938: }
6939: else
6940: {
6941: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = cpu.z80IX;
6942: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr) + 1) = cpu.z80IX >> 8;
6943: }
6944: psMemWrite = NULL;
6945: break;
6946: }
6947: ++psMemWrite;
6948: }
6949:
6950: if (psMemWrite)
6951: {
6952: cpu.z80Base[dwAddr] = (UINT8) cpu.z80IX;
6953: cpu.z80Base[dwAddr + 1] = (UINT8) ((UINT32) cpu.z80IX >> 8);
6954: }
6955:
6956: break;
6957: }
6958: case 0x23:
6959: {
6960: sdwCyclesRemaining -= 10;
6961: cpu.z80IX++;
6962: cpu.z80IX &= 0xffff;
6963: break;
6964: }
6965: case 0x24:
6966: {
6967: sdwCyclesRemaining -= 9;
6968: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
6969: cpu.z80F |= bPostIncFlags[cpu.z80XH++];
6970: break;
6971: }
6972: case 0x25:
6973: {
6974: sdwCyclesRemaining -= 9;
6975: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
6976: cpu.z80F |= bPostDecFlags[cpu.z80XH--];
6977: break;
6978: }
6979: case 0x26:
6980: {
6981: sdwCyclesRemaining -= 9;
6982: cpu.z80XH = *pbPC++;
6983: break;
6984: }
6985: case 0x27:
6986: {
6987: InvalidInstruction(2);
6988: break;
6989: }
6990: case 0x28:
6991: {
6992: InvalidInstruction(2);
6993: break;
6994: }
6995: case 0x29:
6996: {
6997: sdwCyclesRemaining -= 15;
6998: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
6999: dwTemp = cpu.z80IX + cpu.z80IX;
7000: cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IX ^ dwTemp ^ cpu.z80HL) >> 8) & Z80_FLAG_HALF_CARRY);
7001: cpu.z80IX = dwTemp & 0xffff;
7002: break;
7003: }
7004: case 0x2a:
7005: {
7006: sdwCyclesRemaining -= 20;
7007: dwAddr = *pbPC++;
7008: dwAddr |= ((UINT32) *pbPC++ << 8);
7009: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
7010: while (psMemRead->lowAddr != 0xffffffff)
7011: {
7012: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
7013: {
7014: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7015: if (psMemRead->memoryCall)
7016: {
7017: cpu.z80IX = psMemRead->memoryCall(dwAddr, psMemRead);
7018: cpu.z80IX |= (UINT32) ((UINT32) psMemRead->memoryCall(dwAddr + 1, psMemRead) << 8);
7019: }
7020: else
7021: {
7022: cpu.z80IX = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
7023: cpu.z80IX |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr + 1)) << 8);
7024: }
7025: psMemRead = NULL;
7026: break;
7027: }
7028: ++psMemRead;
7029: }
7030:
7031: if (psMemRead)
7032: {
7033: cpu.z80IX = cpu.z80Base[dwAddr];
7034: cpu.z80IX |= (UINT32) ((UINT32) cpu.z80Base[dwAddr + 1] << 8);
7035: }
7036:
7037: break;
7038: }
7039: case 0x2b:
7040: {
7041: sdwCyclesRemaining -= 10;
7042: cpu.z80IX--;
7043: cpu.z80IX &= 0xffff;
7044: break;
7045: }
7046: case 0x2c:
7047: {
7048: sdwCyclesRemaining -= 9;
7049: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
7050: cpu.z80F |= bPostIncFlags[cpu.z80XL++];
7051: break;
7052: }
7053: case 0x2d:
7054: {
7055: sdwCyclesRemaining -= 9;
7056: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
7057: cpu.z80F |= bPostDecFlags[cpu.z80XL--];
7058: break;
7059: }
7060: case 0x2e:
7061: {
7062: sdwCyclesRemaining -= 9;
7063: cpu.z80XL = *pbPC++;
7064: break;
7065: }
7066: case 0x2f:
7067: {
7068: InvalidInstruction(2);
7069: break;
7070: }
7071: case 0x30:
7072: {
7073: InvalidInstruction(2);
7074: break;
7075: }
7076: case 0x31:
7077: {
7078: InvalidInstruction(2);
7079: break;
7080: }
7081: case 0x32:
7082: {
7083: InvalidInstruction(2);
7084: break;
7085: }
7086: case 0x33:
7087: {
7088: InvalidInstruction(2);
7089: break;
7090: }
7091: case 0x34:
7092: {
7093: sdwCyclesRemaining -= 23;
7094: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
7095: dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
7096: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
7097: while (psMemRead->lowAddr != 0xffffffff)
7098: {
7099: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
7100: {
7101: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7102: if (psMemRead->memoryCall)
7103: {
7104: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
7105: }
7106: else
7107: {
7108: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
7109: }
7110: psMemRead = NULL;
7111: break;
7112: }
7113: ++psMemRead;
7114: }
7115:
7116: if (psMemRead)
7117: {
7118: bTemp = cpu.z80Base[dwAddr];
7119: }
7120:
7121: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
7122: cpu.z80F |= bPostIncFlags[bTemp++];
7123: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
7124: while (psMemWrite->lowAddr != 0xffffffff)
7125: {
7126: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
7127: {
7128: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7129: if (psMemWrite->memoryCall)
7130: {
7131: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
7132: }
7133: else
7134: {
7135: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
7136: }
7137: psMemWrite = NULL;
7138: break;
7139: }
7140: ++psMemWrite;
7141: }
7142:
7143: if (psMemWrite)
7144: {
7145: cpu.z80Base[dwAddr] = (UINT8) bTemp;
7146: }
7147:
7148: break;
7149: }
7150: case 0x35:
7151: {
7152: sdwCyclesRemaining -= 23;
7153: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
7154: dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
7155: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
7156: while (psMemRead->lowAddr != 0xffffffff)
7157: {
7158: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
7159: {
7160: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7161: if (psMemRead->memoryCall)
7162: {
7163: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
7164: }
7165: else
7166: {
7167: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
7168: }
7169: psMemRead = NULL;
7170: break;
7171: }
7172: ++psMemRead;
7173: }
7174:
7175: if (psMemRead)
7176: {
7177: bTemp = cpu.z80Base[dwAddr];
7178: }
7179:
7180: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
7181: cpu.z80F |= bPostDecFlags[bTemp--];
7182: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
7183: while (psMemWrite->lowAddr != 0xffffffff)
7184: {
7185: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
7186: {
7187: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7188: if (psMemWrite->memoryCall)
7189: {
7190: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
7191: }
7192: else
7193: {
7194: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
7195: }
7196: psMemWrite = NULL;
7197: break;
7198: }
7199: ++psMemWrite;
7200: }
7201:
7202: if (psMemWrite)
7203: {
7204: cpu.z80Base[dwAddr] = (UINT8) bTemp;
7205: }
7206:
7207: break;
7208: }
7209: case 0x36:
7210: {
7211: sdwCyclesRemaining -= 19;
7212: sdwAddr = (INT8) *pbPC++; // Get the offset
7213: sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7214: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
7215: while (psMemWrite->lowAddr != 0xffffffff)
7216: {
7217: if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
7218: {
7219: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7220: if (psMemWrite->memoryCall)
7221: {
7222: psMemWrite->memoryCall(sdwAddr, *pbPC++, psMemWrite);
7223: }
7224: else
7225: {
7226: *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = *pbPC++;
7227: }
7228: psMemWrite = NULL;
7229: break;
7230: }
7231: ++psMemWrite;
7232: }
7233:
7234: if (psMemWrite)
7235: {
7236: cpu.z80Base[sdwAddr] = (UINT8) *pbPC++;
7237: }
7238:
7239: break;
7240: }
7241: case 0x37:
7242: {
7243: InvalidInstruction(2);
7244: break;
7245: }
7246: case 0x38:
7247: {
7248: InvalidInstruction(2);
7249: break;
7250: }
7251: case 0x39:
7252: {
7253: sdwCyclesRemaining -= 15;
7254: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
7255: dwTemp = cpu.z80IX + cpu.z80sp;
7256: cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IX ^ dwTemp ^ cpu.z80sp) >> 8) & Z80_FLAG_HALF_CARRY);
7257: cpu.z80IX = dwTemp & 0xffff;
7258: break;
7259: }
7260: case 0x3a:
7261: {
7262: InvalidInstruction(2);
7263: break;
7264: }
7265: case 0x3b:
7266: {
7267: InvalidInstruction(2);
7268: break;
7269: }
7270: case 0x3c:
7271: {
7272: InvalidInstruction(2);
7273: break;
7274: }
7275: case 0x3d:
7276: {
7277: InvalidInstruction(2);
7278: break;
7279: }
7280: case 0x3e:
7281: {
7282: InvalidInstruction(2);
7283: break;
7284: }
7285: case 0x3f:
7286: {
7287: InvalidInstruction(2);
7288: break;
7289: }
7290: case 0x40:
7291: {
7292: InvalidInstruction(2);
7293: break;
7294: }
7295: case 0x41:
7296: {
7297: InvalidInstruction(2);
7298: break;
7299: }
7300: case 0x42:
7301: {
7302: InvalidInstruction(2);
7303: break;
7304: }
7305: case 0x43:
7306: {
7307: InvalidInstruction(2);
7308: break;
7309: }
7310: case 0x44:
7311: {
7312: sdwCyclesRemaining -= 9;
7313: cpu.z80B = cpu.z80XH;
7314: break;
7315: }
7316: case 0x45:
7317: {
7318: sdwCyclesRemaining -= 9;
7319: cpu.z80B = cpu.z80XL;
7320: break;
7321: }
7322: case 0x46:
7323: {
7324: sdwCyclesRemaining -= 19;
7325: sdwAddr = (INT8) *pbPC++; // Get the offset
7326: sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7327: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
7328: while (psMemRead->lowAddr != 0xffffffff)
7329: {
7330: if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
7331: {
7332: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7333: if (psMemRead->memoryCall)
7334: {
7335: cpu.z80B = psMemRead->memoryCall(sdwAddr, psMemRead);
7336: }
7337: else
7338: {
7339: cpu.z80B = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
7340: }
7341: psMemRead = NULL;
7342: break;
7343: }
7344: ++psMemRead;
7345: }
7346:
7347: if (psMemRead)
7348: {
7349: cpu.z80B = cpu.z80Base[sdwAddr];
7350: }
7351:
7352: break;
7353: }
7354: case 0x47:
7355: {
7356: InvalidInstruction(2);
7357: break;
7358: }
7359: case 0x48:
7360: {
7361: InvalidInstruction(2);
7362: break;
7363: }
7364: case 0x49:
7365: {
7366: InvalidInstruction(2);
7367: break;
7368: }
7369: case 0x4a:
7370: {
7371: InvalidInstruction(2);
7372: break;
7373: }
7374: case 0x4b:
7375: {
7376: InvalidInstruction(2);
7377: break;
7378: }
7379: case 0x4c:
7380: {
7381: sdwCyclesRemaining -= 9;
7382: cpu.z80C = cpu.z80XH;
7383: break;
7384: }
7385: case 0x4d:
7386: {
7387: sdwCyclesRemaining -= 9;
7388: cpu.z80C = cpu.z80XL;
7389: break;
7390: }
7391: case 0x4e:
7392: {
7393: sdwCyclesRemaining -= 19;
7394: sdwAddr = (INT8) *pbPC++; // Get the offset
7395: sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7396: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
7397: while (psMemRead->lowAddr != 0xffffffff)
7398: {
7399: if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
7400: {
7401: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7402: if (psMemRead->memoryCall)
7403: {
7404: cpu.z80C = psMemRead->memoryCall(sdwAddr, psMemRead);
7405: }
7406: else
7407: {
7408: cpu.z80C = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
7409: }
7410: psMemRead = NULL;
7411: break;
7412: }
7413: ++psMemRead;
7414: }
7415:
7416: if (psMemRead)
7417: {
7418: cpu.z80C = cpu.z80Base[sdwAddr];
7419: }
7420:
7421: break;
7422: }
7423: case 0x4f:
7424: {
7425: InvalidInstruction(2);
7426: break;
7427: }
7428: case 0x50:
7429: {
7430: InvalidInstruction(2);
7431: break;
7432: }
7433: case 0x51:
7434: {
7435: InvalidInstruction(2);
7436: break;
7437: }
7438: case 0x52:
7439: {
7440: InvalidInstruction(2);
7441: break;
7442: }
7443: case 0x53:
7444: {
7445: InvalidInstruction(2);
7446: break;
7447: }
7448: case 0x54:
7449: {
7450: sdwCyclesRemaining -= 9;
7451: cpu.z80D = cpu.z80XH;
7452: break;
7453: }
7454: case 0x55:
7455: {
7456: sdwCyclesRemaining -= 9;
7457: cpu.z80D = cpu.z80XL;
7458: break;
7459: }
7460: case 0x56:
7461: {
7462: sdwCyclesRemaining -= 19;
7463: sdwAddr = (INT8) *pbPC++; // Get the offset
7464: sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7465: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
7466: while (psMemRead->lowAddr != 0xffffffff)
7467: {
7468: if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
7469: {
7470: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7471: if (psMemRead->memoryCall)
7472: {
7473: cpu.z80D = psMemRead->memoryCall(sdwAddr, psMemRead);
7474: }
7475: else
7476: {
7477: cpu.z80D = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
7478: }
7479: psMemRead = NULL;
7480: break;
7481: }
7482: ++psMemRead;
7483: }
7484:
7485: if (psMemRead)
7486: {
7487: cpu.z80D = cpu.z80Base[sdwAddr];
7488: }
7489:
7490: break;
7491: }
7492: case 0x57:
7493: {
7494: InvalidInstruction(2);
7495: break;
7496: }
7497: case 0x58:
7498: {
7499: InvalidInstruction(2);
7500: break;
7501: }
7502: case 0x59:
7503: {
7504: InvalidInstruction(2);
7505: break;
7506: }
7507: case 0x5a:
7508: {
7509: InvalidInstruction(2);
7510: break;
7511: }
7512: case 0x5b:
7513: {
7514: InvalidInstruction(2);
7515: break;
7516: }
7517: case 0x5c:
7518: {
7519: sdwCyclesRemaining -= 9;
7520: cpu.z80E = cpu.z80XH;
7521: break;
7522: }
7523: case 0x5d:
7524: {
7525: sdwCyclesRemaining -= 9;
7526: cpu.z80E = cpu.z80XL;
7527: break;
7528: }
7529: case 0x5e:
7530: {
7531: sdwCyclesRemaining -= 19;
7532: sdwAddr = (INT8) *pbPC++; // Get the offset
7533: sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7534: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
7535: while (psMemRead->lowAddr != 0xffffffff)
7536: {
7537: if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
7538: {
7539: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7540: if (psMemRead->memoryCall)
7541: {
7542: cpu.z80E = psMemRead->memoryCall(sdwAddr, psMemRead);
7543: }
7544: else
7545: {
7546: cpu.z80E = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
7547: }
7548: psMemRead = NULL;
7549: break;
7550: }
7551: ++psMemRead;
7552: }
7553:
7554: if (psMemRead)
7555: {
7556: cpu.z80E = cpu.z80Base[sdwAddr];
7557: }
7558:
7559: break;
7560: }
7561: case 0x5f:
7562: {
7563: InvalidInstruction(2);
7564: break;
7565: }
7566: case 0x60:
7567: {
7568: sdwCyclesRemaining -= 9;
7569: cpu.z80XH = cpu.z80B;
7570: break;
7571: }
7572: case 0x61:
7573: {
7574: sdwCyclesRemaining -= 9;
7575: cpu.z80XH = cpu.z80C;
7576: break;
7577: }
7578: case 0x62:
7579: {
7580: sdwCyclesRemaining -= 9;
7581: cpu.z80XH = cpu.z80D;
7582: break;
7583: }
7584: case 0x63:
7585: {
7586: sdwCyclesRemaining -= 9;
7587: cpu.z80XH = cpu.z80E;
7588: break;
7589: }
7590: case 0x64:
7591: {
7592: sdwCyclesRemaining -= 9;
7593: break;
7594: }
7595: case 0x65:
7596: {
7597: sdwCyclesRemaining -= 9;
7598: cpu.z80XH = cpu.z80XL;
7599: break;
7600: }
7601: case 0x66:
7602: {
7603: sdwCyclesRemaining -= 19;
7604: sdwAddr = (INT8) *pbPC++; // Get the offset
7605: sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7606: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
7607: while (psMemRead->lowAddr != 0xffffffff)
7608: {
7609: if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
7610: {
7611: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7612: if (psMemRead->memoryCall)
7613: {
7614: cpu.z80H = psMemRead->memoryCall(sdwAddr, psMemRead);
7615: }
7616: else
7617: {
7618: cpu.z80H = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
7619: }
7620: psMemRead = NULL;
7621: break;
7622: }
7623: ++psMemRead;
7624: }
7625:
7626: if (psMemRead)
7627: {
7628: cpu.z80H = cpu.z80Base[sdwAddr];
7629: }
7630:
7631: break;
7632: }
7633: case 0x67:
7634: {
7635: sdwCyclesRemaining -= 9;
7636: cpu.z80XH = cpu.z80A;
7637: break;
7638: }
7639: case 0x68:
7640: {
7641: sdwCyclesRemaining -= 9;
7642: cpu.z80XL = cpu.z80B;
7643: break;
7644: }
7645: case 0x69:
7646: {
7647: sdwCyclesRemaining -= 9;
7648: cpu.z80XL = cpu.z80C;
7649: break;
7650: }
7651: case 0x6a:
7652: {
7653: sdwCyclesRemaining -= 9;
7654: cpu.z80XL = cpu.z80D;
7655: break;
7656: }
7657: case 0x6b:
7658: {
7659: sdwCyclesRemaining -= 9;
7660: cpu.z80XL = cpu.z80E;
7661: break;
7662: }
7663: case 0x6c:
7664: {
7665: sdwCyclesRemaining -= 9;
7666: cpu.z80XL = cpu.z80XH;
7667: break;
7668: }
7669: case 0x6d:
7670: {
7671: sdwCyclesRemaining -= 9;
7672: break;
7673: }
7674: case 0x6e:
7675: {
7676: sdwCyclesRemaining -= 19;
7677: sdwAddr = (INT8) *pbPC++; // Get the offset
7678: sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7679: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
7680: while (psMemRead->lowAddr != 0xffffffff)
7681: {
7682: if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
7683: {
7684: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7685: if (psMemRead->memoryCall)
7686: {
7687: cpu.z80L = psMemRead->memoryCall(sdwAddr, psMemRead);
7688: }
7689: else
7690: {
7691: cpu.z80L = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
7692: }
7693: psMemRead = NULL;
7694: break;
7695: }
7696: ++psMemRead;
7697: }
7698:
7699: if (psMemRead)
7700: {
7701: cpu.z80L = cpu.z80Base[sdwAddr];
7702: }
7703:
7704: break;
7705: }
7706: case 0x6f:
7707: {
7708: sdwCyclesRemaining -= 9;
7709: cpu.z80XL = cpu.z80A;
7710: break;
7711: }
7712: case 0x70:
7713: {
7714: sdwCyclesRemaining -= 19;
7715: sdwAddr = (INT8) *pbPC++; // Get the offset
7716: sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7717: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
7718: while (psMemWrite->lowAddr != 0xffffffff)
7719: {
7720: if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
7721: {
7722: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7723: if (psMemWrite->memoryCall)
7724: {
7725: psMemWrite->memoryCall(sdwAddr, cpu.z80B, psMemWrite);
7726: }
7727: else
7728: {
7729: *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80B;
7730: }
7731: psMemWrite = NULL;
7732: break;
7733: }
7734: ++psMemWrite;
7735: }
7736:
7737: if (psMemWrite)
7738: {
7739: cpu.z80Base[sdwAddr] = (UINT8) cpu.z80B;
7740: }
7741:
7742: break;
7743: }
7744: case 0x71:
7745: {
7746: sdwCyclesRemaining -= 19;
7747: sdwAddr = (INT8) *pbPC++; // Get the offset
7748: sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7749: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
7750: while (psMemWrite->lowAddr != 0xffffffff)
7751: {
7752: if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
7753: {
7754: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7755: if (psMemWrite->memoryCall)
7756: {
7757: psMemWrite->memoryCall(sdwAddr, cpu.z80C, psMemWrite);
7758: }
7759: else
7760: {
7761: *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80C;
7762: }
7763: psMemWrite = NULL;
7764: break;
7765: }
7766: ++psMemWrite;
7767: }
7768:
7769: if (psMemWrite)
7770: {
7771: cpu.z80Base[sdwAddr] = (UINT8) cpu.z80C;
7772: }
7773:
7774: break;
7775: }
7776: case 0x72:
7777: {
7778: sdwCyclesRemaining -= 19;
7779: sdwAddr = (INT8) *pbPC++; // Get the offset
7780: sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7781: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
7782: while (psMemWrite->lowAddr != 0xffffffff)
7783: {
7784: if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
7785: {
7786: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7787: if (psMemWrite->memoryCall)
7788: {
7789: psMemWrite->memoryCall(sdwAddr, cpu.z80D, psMemWrite);
7790: }
7791: else
7792: {
7793: *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80D;
7794: }
7795: psMemWrite = NULL;
7796: break;
7797: }
7798: ++psMemWrite;
7799: }
7800:
7801: if (psMemWrite)
7802: {
7803: cpu.z80Base[sdwAddr] = (UINT8) cpu.z80D;
7804: }
7805:
7806: break;
7807: }
7808: case 0x73:
7809: {
7810: sdwCyclesRemaining -= 19;
7811: sdwAddr = (INT8) *pbPC++; // Get the offset
7812: sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7813: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
7814: while (psMemWrite->lowAddr != 0xffffffff)
7815: {
7816: if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
7817: {
7818: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7819: if (psMemWrite->memoryCall)
7820: {
7821: psMemWrite->memoryCall(sdwAddr, cpu.z80E, psMemWrite);
7822: }
7823: else
7824: {
7825: *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80E;
7826: }
7827: psMemWrite = NULL;
7828: break;
7829: }
7830: ++psMemWrite;
7831: }
7832:
7833: if (psMemWrite)
7834: {
7835: cpu.z80Base[sdwAddr] = (UINT8) cpu.z80E;
7836: }
7837:
7838: break;
7839: }
7840: case 0x74:
7841: {
7842: sdwCyclesRemaining -= 19;
7843: sdwAddr = (INT8) *pbPC++; // Get the offset
7844: sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7845: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
7846: while (psMemWrite->lowAddr != 0xffffffff)
7847: {
7848: if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
7849: {
7850: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7851: if (psMemWrite->memoryCall)
7852: {
7853: psMemWrite->memoryCall(sdwAddr, cpu.z80H, psMemWrite);
7854: }
7855: else
7856: {
7857: *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80H;
7858: }
7859: psMemWrite = NULL;
7860: break;
7861: }
7862: ++psMemWrite;
7863: }
7864:
7865: if (psMemWrite)
7866: {
7867: cpu.z80Base[sdwAddr] = (UINT8) cpu.z80H;
7868: }
7869:
7870: break;
7871: }
7872: case 0x75:
7873: {
7874: sdwCyclesRemaining -= 19;
7875: sdwAddr = (INT8) *pbPC++; // Get the offset
7876: sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7877: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
7878: while (psMemWrite->lowAddr != 0xffffffff)
7879: {
7880: if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
7881: {
7882: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7883: if (psMemWrite->memoryCall)
7884: {
7885: psMemWrite->memoryCall(sdwAddr, cpu.z80L, psMemWrite);
7886: }
7887: else
7888: {
7889: *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80L;
7890: }
7891: psMemWrite = NULL;
7892: break;
7893: }
7894: ++psMemWrite;
7895: }
7896:
7897: if (psMemWrite)
7898: {
7899: cpu.z80Base[sdwAddr] = (UINT8) cpu.z80L;
7900: }
7901:
7902: break;
7903: }
7904: case 0x76:
7905: {
7906: sdwCyclesRemaining -= 19;
7907: InvalidInstruction(2);
7908: break;
7909: }
7910: case 0x77:
7911: {
7912: sdwCyclesRemaining -= 19;
7913: sdwAddr = (INT8) *pbPC++; // Get the offset
7914: sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7915: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
7916: while (psMemWrite->lowAddr != 0xffffffff)
7917: {
7918: if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
7919: {
7920: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7921: if (psMemWrite->memoryCall)
7922: {
7923: psMemWrite->memoryCall(sdwAddr, cpu.z80A, psMemWrite);
7924: }
7925: else
7926: {
7927: *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80A;
7928: }
7929: psMemWrite = NULL;
7930: break;
7931: }
7932: ++psMemWrite;
7933: }
7934:
7935: if (psMemWrite)
7936: {
7937: cpu.z80Base[sdwAddr] = (UINT8) cpu.z80A;
7938: }
7939:
7940: break;
7941: }
7942: case 0x78:
7943: {
7944: InvalidInstruction(2);
7945: break;
7946: }
7947: case 0x79:
7948: {
7949: InvalidInstruction(2);
7950: break;
7951: }
7952: case 0x7a:
7953: {
7954: InvalidInstruction(2);
7955: break;
7956: }
7957: case 0x7b:
7958: {
7959: InvalidInstruction(2);
7960: break;
7961: }
7962: case 0x7c:
7963: {
7964: sdwCyclesRemaining -= 9;
7965: cpu.z80A = cpu.z80XH;
7966: break;
7967: }
7968: case 0x7d:
7969: {
7970: sdwCyclesRemaining -= 9;
7971: cpu.z80A = cpu.z80XL;
7972: break;
7973: }
7974: case 0x7e:
7975: {
7976: sdwCyclesRemaining -= 19;
7977: sdwAddr = (INT8) *pbPC++; // Get the offset
7978: sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
7979: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
7980: while (psMemRead->lowAddr != 0xffffffff)
7981: {
7982: if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
7983: {
7984: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
7985: if (psMemRead->memoryCall)
7986: {
7987: cpu.z80A = psMemRead->memoryCall(sdwAddr, psMemRead);
7988: }
7989: else
7990: {
7991: cpu.z80A = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
7992: }
7993: psMemRead = NULL;
7994: break;
7995: }
7996: ++psMemRead;
7997: }
7998:
7999: if (psMemRead)
8000: {
8001: cpu.z80A = cpu.z80Base[sdwAddr];
8002: }
8003:
8004: break;
8005: }
8006: case 0x7f:
8007: {
8008: InvalidInstruction(2);
8009: break;
8010: }
8011: case 0x80:
8012: {
8013: InvalidInstruction(2);
8014: break;
8015: }
8016: case 0x81:
8017: {
8018: InvalidInstruction(2);
8019: break;
8020: }
8021: case 0x82:
8022: {
8023: InvalidInstruction(2);
8024: break;
8025: }
8026: case 0x83:
8027: {
8028: InvalidInstruction(2);
8029: break;
8030: }
8031: case 0x84:
8032: {
8033: sdwCyclesRemaining -= 9;
8034: bTemp2 = cpu.z80A + cpu.z80XH;
8035: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
8036: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8037: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80XH];
8038: break;
8039: }
8040: case 0x85:
8041: {
8042: sdwCyclesRemaining -= 9;
8043: bTemp2 = cpu.z80A + cpu.z80XL;
8044: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
8045: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8046: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80XL];
8047: break;
8048: }
8049: case 0x86:
8050: {
8051: sdwCyclesRemaining -= 19;
8052: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
8053: dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
8054: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
8055: while (psMemRead->lowAddr != 0xffffffff)
8056: {
8057: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
8058: {
8059: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8060: if (psMemRead->memoryCall)
8061: {
8062: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
8063: }
8064: else
8065: {
8066: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
8067: }
8068: psMemRead = NULL;
8069: break;
8070: }
8071: ++psMemRead;
8072: }
8073:
8074: if (psMemRead)
8075: {
8076: bTemp = cpu.z80Base[dwAddr];
8077: }
8078:
8079: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
8080: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8081: pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp];
8082: cpu.z80A += bTemp;
8083: break;
8084: }
8085: case 0x87:
8086: {
8087: InvalidInstruction(2);
8088: break;
8089: }
8090: case 0x88:
8091: {
8092: InvalidInstruction(2);
8093: break;
8094: }
8095: case 0x89:
8096: {
8097: InvalidInstruction(2);
8098: break;
8099: }
8100: case 0x8a:
8101: {
8102: InvalidInstruction(2);
8103: break;
8104: }
8105: case 0x8b:
8106: {
8107: InvalidInstruction(2);
8108: break;
8109: }
8110: case 0x8c:
8111: {
8112: sdwCyclesRemaining -= 9;
8113: bTemp2 = cpu.z80A + cpu.z80XH + (cpu.z80F & Z80_FLAG_CARRY);
8114: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
8115: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8116: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80XH | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
8117: break;
8118: }
8119: case 0x8d:
8120: {
8121: sdwCyclesRemaining -= 9;
8122: bTemp2 = cpu.z80A + cpu.z80XL + (cpu.z80F & Z80_FLAG_CARRY);
8123: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
8124: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8125: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80XL | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
8126: break;
8127: }
8128: case 0x8e:
8129: {
8130: sdwCyclesRemaining -= 19;
8131: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
8132: dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
8133: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
8134: while (psMemRead->lowAddr != 0xffffffff)
8135: {
8136: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
8137: {
8138: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8139: if (psMemRead->memoryCall)
8140: {
8141: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
8142: }
8143: else
8144: {
8145: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
8146: }
8147: psMemRead = NULL;
8148: break;
8149: }
8150: ++psMemRead;
8151: }
8152:
8153: if (psMemRead)
8154: {
8155: bTemp = cpu.z80Base[dwAddr];
8156: }
8157:
8158: bTemp2 = (cpu.z80F & Z80_FLAG_CARRY);
8159: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
8160: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8161: pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
8162: cpu.z80A += bTemp + bTemp2;
8163: break;
8164: }
8165: case 0x8f:
8166: {
8167: InvalidInstruction(2);
8168: break;
8169: }
8170: case 0x90:
8171: {
8172: InvalidInstruction(2);
8173: break;
8174: }
8175: case 0x91:
8176: {
8177: InvalidInstruction(2);
8178: break;
8179: }
8180: case 0x92:
8181: {
8182: InvalidInstruction(2);
8183: break;
8184: }
8185: case 0x93:
8186: {
8187: InvalidInstruction(2);
8188: break;
8189: }
8190: case 0x94:
8191: {
8192: sdwCyclesRemaining -= 9;
8193: bTemp2 = cpu.z80A - cpu.z80XH;
8194: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
8195: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8196: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80XH];
8197: break;
8198: }
8199: case 0x95:
8200: {
8201: sdwCyclesRemaining -= 9;
8202: bTemp2 = cpu.z80A - cpu.z80XL;
8203: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
8204: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8205: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80XL];
8206: break;
8207: }
8208: case 0x96:
8209: {
8210: sdwCyclesRemaining -= 19;
8211: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
8212: dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
8213: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
8214: while (psMemRead->lowAddr != 0xffffffff)
8215: {
8216: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
8217: {
8218: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8219: if (psMemRead->memoryCall)
8220: {
8221: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
8222: }
8223: else
8224: {
8225: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
8226: }
8227: psMemRead = NULL;
8228: break;
8229: }
8230: ++psMemRead;
8231: }
8232:
8233: if (psMemRead)
8234: {
8235: bTemp = cpu.z80Base[dwAddr];
8236: }
8237:
8238: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
8239: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8240: pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
8241: cpu.z80A -= bTemp;
8242: break;
8243: }
8244: case 0x97:
8245: {
8246: InvalidInstruction(2);
8247: break;
8248: }
8249: case 0x98:
8250: {
8251: InvalidInstruction(2);
8252: break;
8253: }
8254: case 0x99:
8255: {
8256: InvalidInstruction(2);
8257: break;
8258: }
8259: case 0x9a:
8260: {
8261: InvalidInstruction(2);
8262: break;
8263: }
8264: case 0x9b:
8265: {
8266: InvalidInstruction(2);
8267: break;
8268: }
8269: case 0x9c:
8270: {
8271: sdwCyclesRemaining -= 9;
8272: bTemp2 = cpu.z80A - cpu.z80XH - (cpu.z80F & Z80_FLAG_CARRY);
8273: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
8274: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8275: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80XH | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
8276: break;
8277: }
8278: case 0x9d:
8279: {
8280: sdwCyclesRemaining -= 9;
8281: bTemp2 = cpu.z80A - cpu.z80XL - (cpu.z80F & Z80_FLAG_CARRY);
8282: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
8283: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8284: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80XL | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
8285: break;
8286: }
8287: case 0x9e:
8288: {
8289: sdwCyclesRemaining -= 19;
8290: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
8291: dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
8292: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
8293: while (psMemRead->lowAddr != 0xffffffff)
8294: {
8295: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
8296: {
8297: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8298: if (psMemRead->memoryCall)
8299: {
8300: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
8301: }
8302: else
8303: {
8304: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
8305: }
8306: psMemRead = NULL;
8307: break;
8308: }
8309: ++psMemRead;
8310: }
8311:
8312: if (psMemRead)
8313: {
8314: bTemp = cpu.z80Base[dwAddr];
8315: }
8316:
8317: bTemp2 = cpu.z80A;
8318: cpu.z80A = cpu.z80A - bTemp - (cpu.z80F & Z80_FLAG_CARRY);
8319: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
8320: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8321: pbSubSbcTable[((UINT32) bTemp2 << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
8322: break;
8323: }
8324: case 0x9f:
8325: {
8326: InvalidInstruction(2);
8327: break;
8328: }
8329: case 0xa0:
8330: {
8331: InvalidInstruction(2);
8332: break;
8333: }
8334: case 0xa1:
8335: {
8336: InvalidInstruction(2);
8337: break;
8338: }
8339: case 0xa2:
8340: {
8341: InvalidInstruction(2);
8342: break;
8343: }
8344: case 0xa3:
8345: {
8346: InvalidInstruction(2);
8347: break;
8348: }
8349: case 0xa4:
8350: {
8351: sdwCyclesRemaining -= 9;
8352: cpu.z80A &= cpu.z80XH;
8353: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8354: cpu.z80F |= bPostANDFlags[cpu.z80A];
8355:
8356: break;
8357: }
8358: case 0xa5:
8359: {
8360: sdwCyclesRemaining -= 9;
8361: cpu.z80A &= cpu.z80XL;
8362: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8363: cpu.z80F |= bPostANDFlags[cpu.z80A];
8364:
8365: break;
8366: }
8367: case 0xa6:
8368: {
8369: sdwCyclesRemaining -= 19;
8370: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
8371: dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
8372: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
8373: while (psMemRead->lowAddr != 0xffffffff)
8374: {
8375: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
8376: {
8377: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8378: if (psMemRead->memoryCall)
8379: {
8380: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
8381: }
8382: else
8383: {
8384: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
8385: }
8386: psMemRead = NULL;
8387: break;
8388: }
8389: ++psMemRead;
8390: }
8391:
8392: if (psMemRead)
8393: {
8394: bTemp = cpu.z80Base[dwAddr];
8395: }
8396:
8397: cpu.z80A &= bTemp;
8398: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8399: cpu.z80F |= bPostANDFlags[cpu.z80A];
8400:
8401: break;
8402: }
8403: case 0xa7:
8404: {
8405: InvalidInstruction(2);
8406: break;
8407: }
8408: case 0xa8:
8409: {
8410: InvalidInstruction(2);
8411: break;
8412: }
8413: case 0xa9:
8414: {
8415: InvalidInstruction(2);
8416: break;
8417: }
8418: case 0xaa:
8419: {
8420: InvalidInstruction(2);
8421: break;
8422: }
8423: case 0xab:
8424: {
8425: InvalidInstruction(2);
8426: break;
8427: }
8428: case 0xac:
8429: {
8430: sdwCyclesRemaining -= 9;
8431: cpu.z80A ^= cpu.z80XH;
8432: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8433: cpu.z80F |= bPostORFlags[cpu.z80A];
8434:
8435: break;
8436: }
8437: case 0xad:
8438: {
8439: sdwCyclesRemaining -= 9;
8440: cpu.z80A ^= cpu.z80XL;
8441: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8442: cpu.z80F |= bPostORFlags[cpu.z80A];
8443:
8444: break;
8445: }
8446: case 0xae:
8447: {
8448: sdwCyclesRemaining -= 19;
8449: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
8450: dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
8451: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
8452: while (psMemRead->lowAddr != 0xffffffff)
8453: {
8454: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
8455: {
8456: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8457: if (psMemRead->memoryCall)
8458: {
8459: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
8460: }
8461: else
8462: {
8463: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
8464: }
8465: psMemRead = NULL;
8466: break;
8467: }
8468: ++psMemRead;
8469: }
8470:
8471: if (psMemRead)
8472: {
8473: bTemp = cpu.z80Base[dwAddr];
8474: }
8475:
8476: cpu.z80A ^= bTemp;
8477: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8478: cpu.z80F |= bPostORFlags[cpu.z80A];
8479:
8480: break;
8481: }
8482: case 0xaf:
8483: {
8484: InvalidInstruction(2);
8485: break;
8486: }
8487: case 0xb0:
8488: {
8489: InvalidInstruction(2);
8490: break;
8491: }
8492: case 0xb1:
8493: {
8494: InvalidInstruction(2);
8495: break;
8496: }
8497: case 0xb2:
8498: {
8499: InvalidInstruction(2);
8500: break;
8501: }
8502: case 0xb3:
8503: {
8504: InvalidInstruction(2);
8505: break;
8506: }
8507: case 0xb4:
8508: {
8509: sdwCyclesRemaining -= 9;
8510: cpu.z80A |= cpu.z80XH;
8511: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8512: cpu.z80F |= bPostORFlags[cpu.z80A];
8513:
8514: break;
8515: }
8516: case 0xb5:
8517: {
8518: sdwCyclesRemaining -= 9;
8519: cpu.z80A |= cpu.z80XL;
8520: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8521: cpu.z80F |= bPostORFlags[cpu.z80A];
8522:
8523: break;
8524: }
8525: case 0xb6:
8526: {
8527: sdwCyclesRemaining -= 19;
8528: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
8529: dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
8530: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
8531: while (psMemRead->lowAddr != 0xffffffff)
8532: {
8533: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
8534: {
8535: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8536: if (psMemRead->memoryCall)
8537: {
8538: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
8539: }
8540: else
8541: {
8542: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
8543: }
8544: psMemRead = NULL;
8545: break;
8546: }
8547: ++psMemRead;
8548: }
8549:
8550: if (psMemRead)
8551: {
8552: bTemp = cpu.z80Base[dwAddr];
8553: }
8554:
8555: cpu.z80A |= bTemp;
8556: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8557: cpu.z80F |= bPostORFlags[cpu.z80A];
8558:
8559: break;
8560: }
8561: case 0xb7:
8562: {
8563: InvalidInstruction(2);
8564: break;
8565: }
8566: case 0xb8:
8567: {
8568: InvalidInstruction(2);
8569: break;
8570: }
8571: case 0xb9:
8572: {
8573: InvalidInstruction(2);
8574: break;
8575: }
8576: case 0xba:
8577: {
8578: InvalidInstruction(2);
8579: break;
8580: }
8581: case 0xbb:
8582: {
8583: InvalidInstruction(2);
8584: break;
8585: }
8586: case 0xbc:
8587: {
8588: sdwCyclesRemaining -= 9;
8589: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8590: cpu.z80F |= bPostORFlags[cpu.z80A];
8591:
8592: break;
8593: }
8594: case 0xbd:
8595: {
8596: sdwCyclesRemaining -= 9;
8597: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
8598: cpu.z80F |= bPostORFlags[cpu.z80A];
8599:
8600: break;
8601: }
8602: case 0xbe:
8603: {
8604: sdwCyclesRemaining -= 19;
8605: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
8606: dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
8607: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
8608: while (psMemRead->lowAddr != 0xffffffff)
8609: {
8610: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
8611: {
8612: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8613: if (psMemRead->memoryCall)
8614: {
8615: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
8616: }
8617: else
8618: {
8619: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
8620: }
8621: psMemRead = NULL;
8622: break;
8623: }
8624: ++psMemRead;
8625: }
8626:
8627: if (psMemRead)
8628: {
8629: bTemp = cpu.z80Base[dwAddr];
8630: }
8631:
8632: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
8633: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
8634: pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
8635: break;
8636: }
8637: case 0xbf:
8638: {
8639: InvalidInstruction(2);
8640: break;
8641: }
8642: case 0xc0:
8643: {
8644: InvalidInstruction(2);
8645: break;
8646: }
8647: case 0xc1:
8648: {
8649: InvalidInstruction(2);
8650: break;
8651: }
8652: case 0xc2:
8653: {
8654: InvalidInstruction(2);
8655: break;
8656: }
8657: case 0xc3:
8658: {
8659: InvalidInstruction(2);
8660: break;
8661: }
8662: case 0xc4:
8663: {
8664: InvalidInstruction(2);
8665: break;
8666: }
8667: case 0xc5:
8668: {
8669: InvalidInstruction(2);
8670: break;
8671: }
8672: case 0xc6:
8673: {
8674: InvalidInstruction(2);
8675: break;
8676: }
8677: case 0xc7:
8678: {
8679: InvalidInstruction(2);
8680: break;
8681: }
8682: case 0xc8:
8683: {
8684: InvalidInstruction(2);
8685: break;
8686: }
8687: case 0xc9:
8688: {
8689: InvalidInstruction(2);
8690: break;
8691: }
8692: case 0xca:
8693: {
8694: InvalidInstruction(2);
8695: break;
8696: }
8697: case 0xcb:
8698: {
8699: DDFDCBHandler(0);
8700: break;
8701: }
8702: case 0xcc:
8703: {
8704: InvalidInstruction(2);
8705: break;
8706: }
8707: case 0xcd:
8708: {
8709: InvalidInstruction(2);
8710: break;
8711: }
8712: case 0xce:
8713: {
8714: InvalidInstruction(2);
8715: break;
8716: }
8717: case 0xcf:
8718: {
8719: InvalidInstruction(2);
8720: break;
8721: }
8722: case 0xd0:
8723: {
8724: InvalidInstruction(2);
8725: break;
8726: }
8727: case 0xd1:
8728: {
8729: InvalidInstruction(2);
8730: break;
8731: }
8732: case 0xd2:
8733: {
8734: InvalidInstruction(2);
8735: break;
8736: }
8737: case 0xd3:
8738: {
8739: InvalidInstruction(2);
8740: break;
8741: }
8742: case 0xd4:
8743: {
8744: InvalidInstruction(2);
8745: break;
8746: }
8747: case 0xd5:
8748: {
8749: InvalidInstruction(2);
8750: break;
8751: }
8752: case 0xd6:
8753: {
8754: InvalidInstruction(2);
8755: break;
8756: }
8757: case 0xd7:
8758: {
8759: InvalidInstruction(2);
8760: break;
8761: }
8762: case 0xd8:
8763: {
8764: InvalidInstruction(2);
8765: break;
8766: }
8767: case 0xd9:
8768: {
8769: InvalidInstruction(2);
8770: break;
8771: }
8772: case 0xda:
8773: {
8774: InvalidInstruction(2);
8775: break;
8776: }
8777: case 0xdb:
8778: {
8779: InvalidInstruction(2);
8780: break;
8781: }
8782: case 0xdc:
8783: {
8784: InvalidInstruction(2);
8785: break;
8786: }
8787: case 0xdd:
8788: {
8789: InvalidInstruction(2);
8790: break;
8791: }
8792: case 0xde:
8793: {
8794: InvalidInstruction(2);
8795: break;
8796: }
8797: case 0xdf:
8798: {
8799: InvalidInstruction(2);
8800: break;
8801: }
8802: case 0xe0:
8803: {
8804: InvalidInstruction(2);
8805: break;
8806: }
8807: case 0xe1:
8808: {
8809: sdwCyclesRemaining -= 14;
8810: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
8811: while (psMemRead->lowAddr != 0xffffffff)
8812: {
8813: if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
8814: {
8815: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8816: if (psMemRead->memoryCall)
8817: {
8818: cpu.z80IX = psMemRead->memoryCall(cpu.z80sp, psMemRead);
8819: cpu.z80IX |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
8820: }
8821: else
8822: {
8823: cpu.z80IX = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
8824: cpu.z80IX |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
8825: }
8826: psMemRead = NULL;
8827: break;
8828: }
8829: ++psMemRead;
8830: }
8831:
8832: if (psMemRead)
8833: {
8834: cpu.z80IX = cpu.z80Base[cpu.z80sp];
8835: cpu.z80IX |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
8836: }
8837:
8838: cpu.z80sp += 2;
8839: pbSP = (cpu.z80Base + cpu.z80sp); /* Normalize the stack pointer */
8840: break;
8841: }
8842: case 0xe2:
8843: {
8844: InvalidInstruction(2);
8845: break;
8846: }
8847: case 0xe3:
8848: {
8849: sdwCyclesRemaining -= 23;
8850: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
8851: while (psMemRead->lowAddr != 0xffffffff)
8852: {
8853: if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
8854: {
8855: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8856: if (psMemRead->memoryCall)
8857: {
8858: dwAddr = psMemRead->memoryCall(cpu.z80sp, psMemRead);
8859: dwAddr |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
8860: }
8861: else
8862: {
8863: dwAddr = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
8864: dwAddr |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
8865: }
8866: psMemRead = NULL;
8867: break;
8868: }
8869: ++psMemRead;
8870: }
8871:
8872: if (psMemRead)
8873: {
8874: dwAddr = cpu.z80Base[cpu.z80sp];
8875: dwAddr |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
8876: }
8877:
8878: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
8879: while (psMemWrite->lowAddr != 0xffffffff)
8880: {
8881: if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
8882: {
8883: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8884: if (psMemWrite->memoryCall)
8885: {
8886: psMemWrite->memoryCall(cpu.z80sp, (cpu.z80IX & 0xff), psMemWrite);
8887: psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80IX >> 8), psMemWrite);
8888: }
8889: else
8890: {
8891: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80IX;
8892: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80IX >> 8;
8893: }
8894: psMemWrite = NULL;
8895: break;
8896: }
8897: ++psMemWrite;
8898: }
8899:
8900: if (psMemWrite)
8901: {
8902: cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80IX;
8903: cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80IX >> 8);
8904: }
8905:
8906: cpu.z80IX = dwAddr;
8907: break;
8908: }
8909: case 0xe4:
8910: {
8911: InvalidInstruction(2);
8912: break;
8913: }
8914: case 0xe5:
8915: {
8916: sdwCyclesRemaining -= 15;
8917: cpu.z80sp -= 2;
8918: pbSP = (cpu.z80Base + cpu.z80sp); /* Normalize the stack pointer */
8919: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
8920: while (psMemWrite->lowAddr != 0xffffffff)
8921: {
8922: if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
8923: {
8924: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
8925: if (psMemWrite->memoryCall)
8926: {
8927: psMemWrite->memoryCall(cpu.z80sp, (cpu.z80IX & 0xff), psMemWrite);
8928: psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80IX >> 8), psMemWrite);
8929: }
8930: else
8931: {
8932: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80IX;
8933: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80IX >> 8;
8934: }
8935: psMemWrite = NULL;
8936: break;
8937: }
8938: ++psMemWrite;
8939: }
8940:
8941: if (psMemWrite)
8942: {
8943: cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80IX;
8944: cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80IX >> 8);
8945: }
8946:
8947: break;
8948: }
8949: case 0xe6:
8950: {
8951: InvalidInstruction(2);
8952: break;
8953: }
8954: case 0xe7:
8955: {
8956: InvalidInstruction(2);
8957: break;
8958: }
8959: case 0xe8:
8960: {
8961: InvalidInstruction(2);
8962: break;
8963: }
8964: case 0xe9:
8965: {
8966: sdwCyclesRemaining -= 8;
8967: pbPC = cpu.z80Base + cpu.z80IX;
8968: break;
8969: }
8970: case 0xea:
8971: {
8972: InvalidInstruction(2);
8973: break;
8974: }
8975: case 0xeb:
8976: {
8977: InvalidInstruction(2);
8978: break;
8979: }
8980: case 0xec:
8981: {
8982: InvalidInstruction(2);
8983: break;
8984: }
8985: case 0xed:
8986: {
8987: InvalidInstruction(2);
8988: break;
8989: }
8990: case 0xee:
8991: {
8992: InvalidInstruction(2);
8993: break;
8994: }
8995: case 0xef:
8996: {
8997: InvalidInstruction(2);
8998: break;
8999: }
9000: case 0xf0:
9001: {
9002: InvalidInstruction(2);
9003: break;
9004: }
9005: case 0xf1:
9006: {
9007: InvalidInstruction(2);
9008: break;
9009: }
9010: case 0xf2:
9011: {
9012: InvalidInstruction(2);
9013: break;
9014: }
9015: case 0xf3:
9016: {
9017: InvalidInstruction(2);
9018: break;
9019: }
9020: case 0xf4:
9021: {
9022: InvalidInstruction(2);
9023: break;
9024: }
9025: case 0xf5:
9026: {
9027: InvalidInstruction(2);
9028: break;
9029: }
9030: case 0xf6:
9031: {
9032: InvalidInstruction(2);
9033: break;
9034: }
9035: case 0xf7:
9036: {
9037: InvalidInstruction(2);
9038: break;
9039: }
9040: case 0xf8:
9041: {
9042: InvalidInstruction(2);
9043: break;
9044: }
9045: case 0xf9:
9046: {
9047: sdwCyclesRemaining -= 10;
9048: cpu.z80sp = cpu.z80IX;
9049: break;
9050: }
9051: case 0xfa:
9052: {
9053: InvalidInstruction(2);
9054: break;
9055: }
9056: case 0xfb:
9057: {
9058: InvalidInstruction(2);
9059: break;
9060: }
9061: case 0xfc:
9062: {
9063: InvalidInstruction(2);
9064: break;
9065: }
9066: case 0xfd:
9067: {
9068: InvalidInstruction(2);
9069: break;
9070: }
9071: case 0xfe:
9072: {
9073: InvalidInstruction(2);
9074: break;
9075: }
9076: case 0xff:
9077: {
9078: InvalidInstruction(2);
9079: break;
9080: }
9081: }
9082: }
9083: void DDFDCBHandler(UINT32 dwWhich)
9084: {
9085: if (dwWhich)
9086: {
9087: dwAddr = (UINT32) ((INT32) cpu.z80IY + ((INT32) *pbPC++)) & 0xffff;
9088: }
9089: else
9090: {
9091: dwAddr = (UINT32) ((INT32) cpu.z80IX + ((INT32) *pbPC++)) & 0xffff;
9092: }
9093:
9094: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
9095: while (psMemRead->lowAddr != 0xffffffff)
9096: {
9097: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
9098: {
9099: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
9100: if (psMemRead->memoryCall)
9101: {
9102: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
9103: }
9104: else
9105: {
9106: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
9107: }
9108: psMemRead = NULL;
9109: break;
9110: }
9111: ++psMemRead;
9112: }
9113:
9114: if (psMemRead)
9115: {
9116: bTemp = cpu.z80Base[dwAddr];
9117: }
9118:
9119: switch (*pbPC++)
9120: {
9121: case 0x00:
9122: {
9123: InvalidInstruction(4);
9124: break;
9125: }
9126: case 0x01:
9127: {
9128: InvalidInstruction(4);
9129: break;
9130: }
9131: case 0x02:
9132: {
9133: InvalidInstruction(4);
9134: break;
9135: }
9136: case 0x03:
9137: {
9138: InvalidInstruction(4);
9139: break;
9140: }
9141: case 0x04:
9142: {
9143: InvalidInstruction(4);
9144: break;
9145: }
9146: case 0x05:
9147: {
9148: InvalidInstruction(4);
9149: break;
9150: }
9151: case 0x06:
9152: {
9153: sdwCyclesRemaining -= 23;
9154: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
9155: bTemp2 = (bTemp >> 7);
9156: bTemp = (bTemp << 1) | bTemp2;
9157: cpu.z80F |= bTemp2 | bPostORFlags[bTemp];
9158: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
9159: while (psMemWrite->lowAddr != 0xffffffff)
9160: {
9161: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
9162: {
9163: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
9164: if (psMemWrite->memoryCall)
9165: {
9166: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
9167: }
9168: else
9169: {
9170: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
9171: }
9172: psMemWrite = NULL;
9173: break;
9174: }
9175: ++psMemWrite;
9176: }
9177:
9178: if (psMemWrite)
9179: {
9180: cpu.z80Base[dwAddr] = (UINT8) bTemp;
9181: }
9182:
9183: break;
9184: }
9185: case 0x07:
9186: {
9187: InvalidInstruction(4);
9188: break;
9189: }
9190: case 0x08:
9191: {
9192: InvalidInstruction(4);
9193: break;
9194: }
9195: case 0x09:
9196: {
9197: InvalidInstruction(4);
9198: break;
9199: }
9200: case 0x0a:
9201: {
9202: InvalidInstruction(4);
9203: break;
9204: }
9205: case 0x0b:
9206: {
9207: InvalidInstruction(4);
9208: break;
9209: }
9210: case 0x0c:
9211: {
9212: InvalidInstruction(4);
9213: break;
9214: }
9215: case 0x0d:
9216: {
9217: InvalidInstruction(4);
9218: break;
9219: }
9220: case 0x0e:
9221: {
9222: sdwCyclesRemaining -= 23;
9223: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
9224: cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
9225: bTemp = (bTemp >> 1) | (bTemp << 7);
9226: cpu.z80F |= bPostORFlags[bTemp];
9227: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
9228: while (psMemWrite->lowAddr != 0xffffffff)
9229: {
9230: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
9231: {
9232: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
9233: if (psMemWrite->memoryCall)
9234: {
9235: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
9236: }
9237: else
9238: {
9239: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
9240: }
9241: psMemWrite = NULL;
9242: break;
9243: }
9244: ++psMemWrite;
9245: }
9246:
9247: if (psMemWrite)
9248: {
9249: cpu.z80Base[dwAddr] = (UINT8) bTemp;
9250: }
9251:
9252: break;
9253: }
9254: case 0x0f:
9255: {
9256: InvalidInstruction(4);
9257: break;
9258: }
9259: case 0x10:
9260: {
9261: InvalidInstruction(4);
9262: break;
9263: }
9264: case 0x11:
9265: {
9266: InvalidInstruction(4);
9267: break;
9268: }
9269: case 0x12:
9270: {
9271: InvalidInstruction(4);
9272: break;
9273: }
9274: case 0x13:
9275: {
9276: InvalidInstruction(4);
9277: break;
9278: }
9279: case 0x14:
9280: {
9281: InvalidInstruction(4);
9282: break;
9283: }
9284: case 0x15:
9285: {
9286: InvalidInstruction(4);
9287: break;
9288: }
9289: case 0x16:
9290: {
9291: sdwCyclesRemaining -= 23;
9292: bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
9293: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
9294: cpu.z80F |= (bTemp >> 7);
9295: bTemp = (bTemp << 1) | bTemp2;
9296: cpu.z80F |= bPostORFlags[bTemp];
9297: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
9298: while (psMemWrite->lowAddr != 0xffffffff)
9299: {
9300: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
9301: {
9302: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
9303: if (psMemWrite->memoryCall)
9304: {
9305: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
9306: }
9307: else
9308: {
9309: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
9310: }
9311: psMemWrite = NULL;
9312: break;
9313: }
9314: ++psMemWrite;
9315: }
9316:
9317: if (psMemWrite)
9318: {
9319: cpu.z80Base[dwAddr] = (UINT8) bTemp;
9320: }
9321:
9322: break;
9323: }
9324: case 0x17:
9325: {
9326: InvalidInstruction(4);
9327: break;
9328: }
9329: case 0x18:
9330: {
9331: InvalidInstruction(4);
9332: break;
9333: }
9334: case 0x19:
9335: {
9336: InvalidInstruction(4);
9337: break;
9338: }
9339: case 0x1a:
9340: {
9341: InvalidInstruction(4);
9342: break;
9343: }
9344: case 0x1b:
9345: {
9346: InvalidInstruction(4);
9347: break;
9348: }
9349: case 0x1c:
9350: {
9351: InvalidInstruction(4);
9352: break;
9353: }
9354: case 0x1d:
9355: {
9356: InvalidInstruction(4);
9357: break;
9358: }
9359: case 0x1e:
9360: {
9361: sdwCyclesRemaining -= 23;
9362: bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
9363: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
9364: cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
9365: bTemp = (bTemp >> 1) | bTemp2;
9366: cpu.z80F |= bPostORFlags[bTemp];
9367: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
9368: while (psMemWrite->lowAddr != 0xffffffff)
9369: {
9370: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
9371: {
9372: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
9373: if (psMemWrite->memoryCall)
9374: {
9375: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
9376: }
9377: else
9378: {
9379: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
9380: }
9381: psMemWrite = NULL;
9382: break;
9383: }
9384: ++psMemWrite;
9385: }
9386:
9387: if (psMemWrite)
9388: {
9389: cpu.z80Base[dwAddr] = (UINT8) bTemp;
9390: }
9391:
9392: break;
9393: }
9394: case 0x1f:
9395: {
9396: InvalidInstruction(4);
9397: break;
9398: }
9399: case 0x20:
9400: {
9401: InvalidInstruction(4);
9402: break;
9403: }
9404: case 0x21:
9405: {
9406: InvalidInstruction(4);
9407: break;
9408: }
9409: case 0x22:
9410: {
9411: InvalidInstruction(4);
9412: break;
9413: }
9414: case 0x23:
9415: {
9416: InvalidInstruction(4);
9417: break;
9418: }
9419: case 0x24:
9420: {
9421: InvalidInstruction(4);
9422: break;
9423: }
9424: case 0x25:
9425: {
9426: InvalidInstruction(4);
9427: break;
9428: }
9429: case 0x26:
9430: {
9431: sdwCyclesRemaining -= 23;
9432: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
9433: cpu.z80F |= (bTemp >> 7);
9434: bTemp = (bTemp << 1);
9435: cpu.z80F |= bPostORFlags[bTemp];
9436: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
9437: while (psMemWrite->lowAddr != 0xffffffff)
9438: {
9439: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
9440: {
9441: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
9442: if (psMemWrite->memoryCall)
9443: {
9444: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
9445: }
9446: else
9447: {
9448: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
9449: }
9450: psMemWrite = NULL;
9451: break;
9452: }
9453: ++psMemWrite;
9454: }
9455:
9456: if (psMemWrite)
9457: {
9458: cpu.z80Base[dwAddr] = (UINT8) bTemp;
9459: }
9460:
9461: break;
9462: }
9463: case 0x27:
9464: {
9465: InvalidInstruction(4);
9466: break;
9467: }
9468: case 0x28:
9469: {
9470: InvalidInstruction(4);
9471: break;
9472: }
9473: case 0x29:
9474: {
9475: InvalidInstruction(4);
9476: break;
9477: }
9478: case 0x2a:
9479: {
9480: InvalidInstruction(4);
9481: break;
9482: }
9483: case 0x2b:
9484: {
9485: InvalidInstruction(4);
9486: break;
9487: }
9488: case 0x2c:
9489: {
9490: InvalidInstruction(4);
9491: break;
9492: }
9493: case 0x2d:
9494: {
9495: InvalidInstruction(4);
9496: break;
9497: }
9498: case 0x2e:
9499: {
9500: sdwCyclesRemaining -= 23;
9501: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
9502: cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
9503: bTemp = (bTemp >> 1) | (bTemp & 0x80);
9504: cpu.z80F |= bPostORFlags[bTemp];
9505: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
9506: while (psMemWrite->lowAddr != 0xffffffff)
9507: {
9508: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
9509: {
9510: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
9511: if (psMemWrite->memoryCall)
9512: {
9513: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
9514: }
9515: else
9516: {
9517: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
9518: }
9519: psMemWrite = NULL;
9520: break;
9521: }
9522: ++psMemWrite;
9523: }
9524:
9525: if (psMemWrite)
9526: {
9527: cpu.z80Base[dwAddr] = (UINT8) bTemp;
9528: }
9529:
9530: break;
9531: }
9532: case 0x2f:
9533: {
9534: InvalidInstruction(4);
9535: break;
9536: }
9537: case 0x30:
9538: {
9539: InvalidInstruction(4);
9540: break;
9541: }
9542: case 0x31:
9543: {
9544: InvalidInstruction(4);
9545: break;
9546: }
9547: case 0x32:
9548: {
9549: InvalidInstruction(4);
9550: break;
9551: }
9552: case 0x33:
9553: {
9554: InvalidInstruction(4);
9555: break;
9556: }
9557: case 0x34:
9558: {
9559: InvalidInstruction(4);
9560: break;
9561: }
9562: case 0x35:
9563: {
9564: InvalidInstruction(4);
9565: break;
9566: }
9567: case 0x36:
9568: {
9569: sdwCyclesRemaining -= 23;
9570: InvalidInstruction(4);
9571: break;
9572: }
9573: case 0x37:
9574: {
9575: InvalidInstruction(4);
9576: break;
9577: }
9578: case 0x38:
9579: {
9580: InvalidInstruction(4);
9581: break;
9582: }
9583: case 0x39:
9584: {
9585: InvalidInstruction(4);
9586: break;
9587: }
9588: case 0x3a:
9589: {
9590: InvalidInstruction(4);
9591: break;
9592: }
9593: case 0x3b:
9594: {
9595: InvalidInstruction(4);
9596: break;
9597: }
9598: case 0x3c:
9599: {
9600: InvalidInstruction(4);
9601: break;
9602: }
9603: case 0x3d:
9604: {
9605: InvalidInstruction(4);
9606: break;
9607: }
9608: case 0x3e:
9609: {
9610: sdwCyclesRemaining -= 23;
9611: cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
9612: cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
9613: bTemp = (bTemp >> 1);
9614: cpu.z80F |= bPostORFlags[bTemp];
9615: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
9616: while (psMemWrite->lowAddr != 0xffffffff)
9617: {
9618: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
9619: {
9620: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
9621: if (psMemWrite->memoryCall)
9622: {
9623: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
9624: }
9625: else
9626: {
9627: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
9628: }
9629: psMemWrite = NULL;
9630: break;
9631: }
9632: ++psMemWrite;
9633: }
9634:
9635: if (psMemWrite)
9636: {
9637: cpu.z80Base[dwAddr] = (UINT8) bTemp;
9638: }
9639:
9640: break;
9641: }
9642: case 0x3f:
9643: {
9644: InvalidInstruction(4);
9645: break;
9646: }
9647: case 0x40:
9648: {
9649: sdwCyclesRemaining -= 20;
9650: InvalidInstruction(4);
9651: break;
9652: }
9653: case 0x41:
9654: {
9655: sdwCyclesRemaining -= 20;
9656: InvalidInstruction(4);
9657: break;
9658: }
9659: case 0x42:
9660: {
9661: sdwCyclesRemaining -= 20;
9662: InvalidInstruction(4);
9663: break;
9664: }
9665: case 0x43:
9666: {
9667: sdwCyclesRemaining -= 20;
9668: InvalidInstruction(4);
9669: break;
9670: }
9671: case 0x44:
9672: {
9673: sdwCyclesRemaining -= 20;
9674: InvalidInstruction(4);
9675: break;
9676: }
9677: case 0x45:
9678: {
9679: sdwCyclesRemaining -= 20;
9680: InvalidInstruction(4);
9681: break;
9682: }
9683: case 0x46:
9684: {
9685: sdwCyclesRemaining -= 20;
9686: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
9687: if (!(bTemp & 0x01))
9688: {
9689: cpu.z80F |= Z80_FLAG_ZERO;
9690: }
9691: break;
9692: }
9693: case 0x47:
9694: {
9695: sdwCyclesRemaining -= 20;
9696: InvalidInstruction(4);
9697: break;
9698: }
9699: case 0x48:
9700: {
9701: sdwCyclesRemaining -= 20;
9702: InvalidInstruction(4);
9703: break;
9704: }
9705: case 0x49:
9706: {
9707: sdwCyclesRemaining -= 20;
9708: InvalidInstruction(4);
9709: break;
9710: }
9711: case 0x4a:
9712: {
9713: sdwCyclesRemaining -= 20;
9714: InvalidInstruction(4);
9715: break;
9716: }
9717: case 0x4b:
9718: {
9719: sdwCyclesRemaining -= 20;
9720: InvalidInstruction(4);
9721: break;
9722: }
9723: case 0x4c:
9724: {
9725: sdwCyclesRemaining -= 20;
9726: InvalidInstruction(4);
9727: break;
9728: }
9729: case 0x4d:
9730: {
9731: sdwCyclesRemaining -= 20;
9732: InvalidInstruction(4);
9733: break;
9734: }
9735: case 0x4e:
9736: {
9737: sdwCyclesRemaining -= 20;
9738: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
9739: if (!(bTemp & 0x02))
9740: {
9741: cpu.z80F |= Z80_FLAG_ZERO;
9742: }
9743: break;
9744: }
9745: case 0x4f:
9746: {
9747: sdwCyclesRemaining -= 20;
9748: InvalidInstruction(4);
9749: break;
9750: }
9751: case 0x50:
9752: {
9753: sdwCyclesRemaining -= 20;
9754: InvalidInstruction(4);
9755: break;
9756: }
9757: case 0x51:
9758: {
9759: sdwCyclesRemaining -= 20;
9760: InvalidInstruction(4);
9761: break;
9762: }
9763: case 0x52:
9764: {
9765: sdwCyclesRemaining -= 20;
9766: InvalidInstruction(4);
9767: break;
9768: }
9769: case 0x53:
9770: {
9771: sdwCyclesRemaining -= 20;
9772: InvalidInstruction(4);
9773: break;
9774: }
9775: case 0x54:
9776: {
9777: sdwCyclesRemaining -= 20;
9778: InvalidInstruction(4);
9779: break;
9780: }
9781: case 0x55:
9782: {
9783: sdwCyclesRemaining -= 20;
9784: InvalidInstruction(4);
9785: break;
9786: }
9787: case 0x56:
9788: {
9789: sdwCyclesRemaining -= 20;
9790: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
9791: if (!(bTemp & 0x04))
9792: {
9793: cpu.z80F |= Z80_FLAG_ZERO;
9794: }
9795: break;
9796: }
9797: case 0x57:
9798: {
9799: sdwCyclesRemaining -= 20;
9800: InvalidInstruction(4);
9801: break;
9802: }
9803: case 0x58:
9804: {
9805: sdwCyclesRemaining -= 20;
9806: InvalidInstruction(4);
9807: break;
9808: }
9809: case 0x59:
9810: {
9811: sdwCyclesRemaining -= 20;
9812: InvalidInstruction(4);
9813: break;
9814: }
9815: case 0x5a:
9816: {
9817: sdwCyclesRemaining -= 20;
9818: InvalidInstruction(4);
9819: break;
9820: }
9821: case 0x5b:
9822: {
9823: sdwCyclesRemaining -= 20;
9824: InvalidInstruction(4);
9825: break;
9826: }
9827: case 0x5c:
9828: {
9829: sdwCyclesRemaining -= 20;
9830: InvalidInstruction(4);
9831: break;
9832: }
9833: case 0x5d:
9834: {
9835: sdwCyclesRemaining -= 20;
9836: InvalidInstruction(4);
9837: break;
9838: }
9839: case 0x5e:
9840: {
9841: sdwCyclesRemaining -= 20;
9842: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
9843: if (!(bTemp & 0x08))
9844: {
9845: cpu.z80F |= Z80_FLAG_ZERO;
9846: }
9847: break;
9848: }
9849: case 0x5f:
9850: {
9851: sdwCyclesRemaining -= 20;
9852: InvalidInstruction(4);
9853: break;
9854: }
9855: case 0x60:
9856: {
9857: sdwCyclesRemaining -= 20;
9858: InvalidInstruction(4);
9859: break;
9860: }
9861: case 0x61:
9862: {
9863: sdwCyclesRemaining -= 20;
9864: InvalidInstruction(4);
9865: break;
9866: }
9867: case 0x62:
9868: {
9869: sdwCyclesRemaining -= 20;
9870: InvalidInstruction(4);
9871: break;
9872: }
9873: case 0x63:
9874: {
9875: sdwCyclesRemaining -= 20;
9876: InvalidInstruction(4);
9877: break;
9878: }
9879: case 0x64:
9880: {
9881: sdwCyclesRemaining -= 20;
9882: InvalidInstruction(4);
9883: break;
9884: }
9885: case 0x65:
9886: {
9887: sdwCyclesRemaining -= 20;
9888: InvalidInstruction(4);
9889: break;
9890: }
9891: case 0x66:
9892: {
9893: sdwCyclesRemaining -= 20;
9894: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
9895: if (!(bTemp & 0x10))
9896: {
9897: cpu.z80F |= Z80_FLAG_ZERO;
9898: }
9899: break;
9900: }
9901: case 0x67:
9902: {
9903: sdwCyclesRemaining -= 20;
9904: InvalidInstruction(4);
9905: break;
9906: }
9907: case 0x68:
9908: {
9909: sdwCyclesRemaining -= 20;
9910: InvalidInstruction(4);
9911: break;
9912: }
9913: case 0x69:
9914: {
9915: sdwCyclesRemaining -= 20;
9916: InvalidInstruction(4);
9917: break;
9918: }
9919: case 0x6a:
9920: {
9921: sdwCyclesRemaining -= 20;
9922: InvalidInstruction(4);
9923: break;
9924: }
9925: case 0x6b:
9926: {
9927: sdwCyclesRemaining -= 20;
9928: InvalidInstruction(4);
9929: break;
9930: }
9931: case 0x6c:
9932: {
9933: sdwCyclesRemaining -= 20;
9934: InvalidInstruction(4);
9935: break;
9936: }
9937: case 0x6d:
9938: {
9939: sdwCyclesRemaining -= 20;
9940: InvalidInstruction(4);
9941: break;
9942: }
9943: case 0x6e:
9944: {
9945: sdwCyclesRemaining -= 20;
9946: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
9947: if (!(bTemp & 0x20))
9948: {
9949: cpu.z80F |= Z80_FLAG_ZERO;
9950: }
9951: break;
9952: }
9953: case 0x6f:
9954: {
9955: sdwCyclesRemaining -= 20;
9956: InvalidInstruction(4);
9957: break;
9958: }
9959: case 0x70:
9960: {
9961: sdwCyclesRemaining -= 20;
9962: InvalidInstruction(4);
9963: break;
9964: }
9965: case 0x71:
9966: {
9967: sdwCyclesRemaining -= 20;
9968: InvalidInstruction(4);
9969: break;
9970: }
9971: case 0x72:
9972: {
9973: sdwCyclesRemaining -= 20;
9974: InvalidInstruction(4);
9975: break;
9976: }
9977: case 0x73:
9978: {
9979: sdwCyclesRemaining -= 20;
9980: InvalidInstruction(4);
9981: break;
9982: }
9983: case 0x74:
9984: {
9985: sdwCyclesRemaining -= 20;
9986: InvalidInstruction(4);
9987: break;
9988: }
9989: case 0x75:
9990: {
9991: sdwCyclesRemaining -= 20;
9992: InvalidInstruction(4);
9993: break;
9994: }
9995: case 0x76:
9996: {
9997: sdwCyclesRemaining -= 20;
9998: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
9999: if (!(bTemp & 0x40))
10000: {
10001: cpu.z80F |= Z80_FLAG_ZERO;
10002: }
10003: break;
10004: }
10005: case 0x77:
10006: {
10007: sdwCyclesRemaining -= 20;
10008: InvalidInstruction(4);
10009: break;
10010: }
10011: case 0x78:
10012: {
10013: sdwCyclesRemaining -= 20;
10014: InvalidInstruction(4);
10015: break;
10016: }
10017: case 0x79:
10018: {
10019: sdwCyclesRemaining -= 20;
10020: InvalidInstruction(4);
10021: break;
10022: }
10023: case 0x7a:
10024: {
10025: sdwCyclesRemaining -= 20;
10026: InvalidInstruction(4);
10027: break;
10028: }
10029: case 0x7b:
10030: {
10031: sdwCyclesRemaining -= 20;
10032: InvalidInstruction(4);
10033: break;
10034: }
10035: case 0x7c:
10036: {
10037: sdwCyclesRemaining -= 20;
10038: InvalidInstruction(4);
10039: break;
10040: }
10041: case 0x7d:
10042: {
10043: sdwCyclesRemaining -= 20;
10044: InvalidInstruction(4);
10045: break;
10046: }
10047: case 0x7e:
10048: {
10049: sdwCyclesRemaining -= 20;
10050: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
10051: if (!(bTemp & 0x80))
10052: {
10053: cpu.z80F |= Z80_FLAG_ZERO;
10054: }
10055: break;
10056: }
10057: case 0x7f:
10058: {
10059: sdwCyclesRemaining -= 20;
10060: InvalidInstruction(4);
10061: break;
10062: }
10063: case 0x80:
10064: {
10065: InvalidInstruction(4);
10066: break;
10067: }
10068: case 0x81:
10069: {
10070: InvalidInstruction(4);
10071: break;
10072: }
10073: case 0x82:
10074: {
10075: InvalidInstruction(4);
10076: break;
10077: }
10078: case 0x83:
10079: {
10080: InvalidInstruction(4);
10081: break;
10082: }
10083: case 0x84:
10084: {
10085: InvalidInstruction(4);
10086: break;
10087: }
10088: case 0x85:
10089: {
10090: InvalidInstruction(4);
10091: break;
10092: }
10093: case 0x86:
10094: {
10095: sdwCyclesRemaining -= 23;
10096: bTemp &= 0xfe;
10097: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
10098: while (psMemWrite->lowAddr != 0xffffffff)
10099: {
10100: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10101: {
10102: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10103: if (psMemWrite->memoryCall)
10104: {
10105: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10106: }
10107: else
10108: {
10109: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10110: }
10111: psMemWrite = NULL;
10112: break;
10113: }
10114: ++psMemWrite;
10115: }
10116:
10117: if (psMemWrite)
10118: {
10119: cpu.z80Base[dwAddr] = (UINT8) bTemp;
10120: }
10121:
10122: break;
10123: }
10124: case 0x87:
10125: {
10126: InvalidInstruction(4);
10127: break;
10128: }
10129: case 0x88:
10130: {
10131: InvalidInstruction(4);
10132: break;
10133: }
10134: case 0x89:
10135: {
10136: InvalidInstruction(4);
10137: break;
10138: }
10139: case 0x8a:
10140: {
10141: InvalidInstruction(4);
10142: break;
10143: }
10144: case 0x8b:
10145: {
10146: InvalidInstruction(4);
10147: break;
10148: }
10149: case 0x8c:
10150: {
10151: InvalidInstruction(4);
10152: break;
10153: }
10154: case 0x8d:
10155: {
10156: InvalidInstruction(4);
10157: break;
10158: }
10159: case 0x8e:
10160: {
10161: sdwCyclesRemaining -= 23;
10162: bTemp &= 0xfd;
10163: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
10164: while (psMemWrite->lowAddr != 0xffffffff)
10165: {
10166: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10167: {
10168: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10169: if (psMemWrite->memoryCall)
10170: {
10171: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10172: }
10173: else
10174: {
10175: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10176: }
10177: psMemWrite = NULL;
10178: break;
10179: }
10180: ++psMemWrite;
10181: }
10182:
10183: if (psMemWrite)
10184: {
10185: cpu.z80Base[dwAddr] = (UINT8) bTemp;
10186: }
10187:
10188: break;
10189: }
10190: case 0x8f:
10191: {
10192: InvalidInstruction(4);
10193: break;
10194: }
10195: case 0x90:
10196: {
10197: InvalidInstruction(4);
10198: break;
10199: }
10200: case 0x91:
10201: {
10202: InvalidInstruction(4);
10203: break;
10204: }
10205: case 0x92:
10206: {
10207: InvalidInstruction(4);
10208: break;
10209: }
10210: case 0x93:
10211: {
10212: InvalidInstruction(4);
10213: break;
10214: }
10215: case 0x94:
10216: {
10217: InvalidInstruction(4);
10218: break;
10219: }
10220: case 0x95:
10221: {
10222: InvalidInstruction(4);
10223: break;
10224: }
10225: case 0x96:
10226: {
10227: sdwCyclesRemaining -= 23;
10228: bTemp &= 0xfb;
10229: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
10230: while (psMemWrite->lowAddr != 0xffffffff)
10231: {
10232: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10233: {
10234: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10235: if (psMemWrite->memoryCall)
10236: {
10237: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10238: }
10239: else
10240: {
10241: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10242: }
10243: psMemWrite = NULL;
10244: break;
10245: }
10246: ++psMemWrite;
10247: }
10248:
10249: if (psMemWrite)
10250: {
10251: cpu.z80Base[dwAddr] = (UINT8) bTemp;
10252: }
10253:
10254: break;
10255: }
10256: case 0x97:
10257: {
10258: InvalidInstruction(4);
10259: break;
10260: }
10261: case 0x98:
10262: {
10263: InvalidInstruction(4);
10264: break;
10265: }
10266: case 0x99:
10267: {
10268: InvalidInstruction(4);
10269: break;
10270: }
10271: case 0x9a:
10272: {
10273: InvalidInstruction(4);
10274: break;
10275: }
10276: case 0x9b:
10277: {
10278: InvalidInstruction(4);
10279: break;
10280: }
10281: case 0x9c:
10282: {
10283: InvalidInstruction(4);
10284: break;
10285: }
10286: case 0x9d:
10287: {
10288: InvalidInstruction(4);
10289: break;
10290: }
10291: case 0x9e:
10292: {
10293: sdwCyclesRemaining -= 23;
10294: bTemp &= 0xf7;
10295: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
10296: while (psMemWrite->lowAddr != 0xffffffff)
10297: {
10298: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10299: {
10300: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10301: if (psMemWrite->memoryCall)
10302: {
10303: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10304: }
10305: else
10306: {
10307: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10308: }
10309: psMemWrite = NULL;
10310: break;
10311: }
10312: ++psMemWrite;
10313: }
10314:
10315: if (psMemWrite)
10316: {
10317: cpu.z80Base[dwAddr] = (UINT8) bTemp;
10318: }
10319:
10320: break;
10321: }
10322: case 0x9f:
10323: {
10324: InvalidInstruction(4);
10325: break;
10326: }
10327: case 0xa0:
10328: {
10329: InvalidInstruction(4);
10330: break;
10331: }
10332: case 0xa1:
10333: {
10334: InvalidInstruction(4);
10335: break;
10336: }
10337: case 0xa2:
10338: {
10339: InvalidInstruction(4);
10340: break;
10341: }
10342: case 0xa3:
10343: {
10344: InvalidInstruction(4);
10345: break;
10346: }
10347: case 0xa4:
10348: {
10349: InvalidInstruction(4);
10350: break;
10351: }
10352: case 0xa5:
10353: {
10354: InvalidInstruction(4);
10355: break;
10356: }
10357: case 0xa6:
10358: {
10359: sdwCyclesRemaining -= 23;
10360: bTemp &= 0xef;
10361: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
10362: while (psMemWrite->lowAddr != 0xffffffff)
10363: {
10364: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10365: {
10366: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10367: if (psMemWrite->memoryCall)
10368: {
10369: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10370: }
10371: else
10372: {
10373: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10374: }
10375: psMemWrite = NULL;
10376: break;
10377: }
10378: ++psMemWrite;
10379: }
10380:
10381: if (psMemWrite)
10382: {
10383: cpu.z80Base[dwAddr] = (UINT8) bTemp;
10384: }
10385:
10386: break;
10387: }
10388: case 0xa7:
10389: {
10390: InvalidInstruction(4);
10391: break;
10392: }
10393: case 0xa8:
10394: {
10395: InvalidInstruction(4);
10396: break;
10397: }
10398: case 0xa9:
10399: {
10400: InvalidInstruction(4);
10401: break;
10402: }
10403: case 0xaa:
10404: {
10405: InvalidInstruction(4);
10406: break;
10407: }
10408: case 0xab:
10409: {
10410: InvalidInstruction(4);
10411: break;
10412: }
10413: case 0xac:
10414: {
10415: InvalidInstruction(4);
10416: break;
10417: }
10418: case 0xad:
10419: {
10420: InvalidInstruction(4);
10421: break;
10422: }
10423: case 0xae:
10424: {
10425: sdwCyclesRemaining -= 23;
10426: bTemp &= 0xdf;
10427: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
10428: while (psMemWrite->lowAddr != 0xffffffff)
10429: {
10430: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10431: {
10432: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10433: if (psMemWrite->memoryCall)
10434: {
10435: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10436: }
10437: else
10438: {
10439: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10440: }
10441: psMemWrite = NULL;
10442: break;
10443: }
10444: ++psMemWrite;
10445: }
10446:
10447: if (psMemWrite)
10448: {
10449: cpu.z80Base[dwAddr] = (UINT8) bTemp;
10450: }
10451:
10452: break;
10453: }
10454: case 0xaf:
10455: {
10456: InvalidInstruction(4);
10457: break;
10458: }
10459: case 0xb0:
10460: {
10461: InvalidInstruction(4);
10462: break;
10463: }
10464: case 0xb1:
10465: {
10466: InvalidInstruction(4);
10467: break;
10468: }
10469: case 0xb2:
10470: {
10471: InvalidInstruction(4);
10472: break;
10473: }
10474: case 0xb3:
10475: {
10476: InvalidInstruction(4);
10477: break;
10478: }
10479: case 0xb4:
10480: {
10481: InvalidInstruction(4);
10482: break;
10483: }
10484: case 0xb5:
10485: {
10486: InvalidInstruction(4);
10487: break;
10488: }
10489: case 0xb6:
10490: {
10491: sdwCyclesRemaining -= 23;
10492: bTemp &= 0xbf;
10493: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
10494: while (psMemWrite->lowAddr != 0xffffffff)
10495: {
10496: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10497: {
10498: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10499: if (psMemWrite->memoryCall)
10500: {
10501: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10502: }
10503: else
10504: {
10505: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10506: }
10507: psMemWrite = NULL;
10508: break;
10509: }
10510: ++psMemWrite;
10511: }
10512:
10513: if (psMemWrite)
10514: {
10515: cpu.z80Base[dwAddr] = (UINT8) bTemp;
10516: }
10517:
10518: break;
10519: }
10520: case 0xb7:
10521: {
10522: InvalidInstruction(4);
10523: break;
10524: }
10525: case 0xb8:
10526: {
10527: InvalidInstruction(4);
10528: break;
10529: }
10530: case 0xb9:
10531: {
10532: InvalidInstruction(4);
10533: break;
10534: }
10535: case 0xba:
10536: {
10537: InvalidInstruction(4);
10538: break;
10539: }
10540: case 0xbb:
10541: {
10542: InvalidInstruction(4);
10543: break;
10544: }
10545: case 0xbc:
10546: {
10547: InvalidInstruction(4);
10548: break;
10549: }
10550: case 0xbd:
10551: {
10552: InvalidInstruction(4);
10553: break;
10554: }
10555: case 0xbe:
10556: {
10557: sdwCyclesRemaining -= 23;
10558: bTemp &= 0x7f;
10559: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
10560: while (psMemWrite->lowAddr != 0xffffffff)
10561: {
10562: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10563: {
10564: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10565: if (psMemWrite->memoryCall)
10566: {
10567: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10568: }
10569: else
10570: {
10571: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10572: }
10573: psMemWrite = NULL;
10574: break;
10575: }
10576: ++psMemWrite;
10577: }
10578:
10579: if (psMemWrite)
10580: {
10581: cpu.z80Base[dwAddr] = (UINT8) bTemp;
10582: }
10583:
10584: break;
10585: }
10586: case 0xbf:
10587: {
10588: InvalidInstruction(4);
10589: break;
10590: }
10591: case 0xc0:
10592: {
10593: InvalidInstruction(4);
10594: break;
10595: }
10596: case 0xc1:
10597: {
10598: InvalidInstruction(4);
10599: break;
10600: }
10601: case 0xc2:
10602: {
10603: InvalidInstruction(4);
10604: break;
10605: }
10606: case 0xc3:
10607: {
10608: InvalidInstruction(4);
10609: break;
10610: }
10611: case 0xc4:
10612: {
10613: InvalidInstruction(4);
10614: break;
10615: }
10616: case 0xc5:
10617: {
10618: InvalidInstruction(4);
10619: break;
10620: }
10621: case 0xc6:
10622: {
10623: sdwCyclesRemaining -= 23;
10624: bTemp |= 0x01;
10625: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
10626: while (psMemWrite->lowAddr != 0xffffffff)
10627: {
10628: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10629: {
10630: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10631: if (psMemWrite->memoryCall)
10632: {
10633: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10634: }
10635: else
10636: {
10637: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10638: }
10639: psMemWrite = NULL;
10640: break;
10641: }
10642: ++psMemWrite;
10643: }
10644:
10645: if (psMemWrite)
10646: {
10647: cpu.z80Base[dwAddr] = (UINT8) bTemp;
10648: }
10649:
10650: break;
10651: }
10652: case 0xc7:
10653: {
10654: InvalidInstruction(4);
10655: break;
10656: }
10657: case 0xc8:
10658: {
10659: InvalidInstruction(4);
10660: break;
10661: }
10662: case 0xc9:
10663: {
10664: InvalidInstruction(4);
10665: break;
10666: }
10667: case 0xca:
10668: {
10669: InvalidInstruction(4);
10670: break;
10671: }
10672: case 0xcb:
10673: {
10674: InvalidInstruction(4);
10675: break;
10676: }
10677: case 0xcc:
10678: {
10679: InvalidInstruction(4);
10680: break;
10681: }
10682: case 0xcd:
10683: {
10684: InvalidInstruction(4);
10685: break;
10686: }
10687: case 0xce:
10688: {
10689: sdwCyclesRemaining -= 23;
10690: bTemp |= 0x02;
10691: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
10692: while (psMemWrite->lowAddr != 0xffffffff)
10693: {
10694: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10695: {
10696: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10697: if (psMemWrite->memoryCall)
10698: {
10699: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10700: }
10701: else
10702: {
10703: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10704: }
10705: psMemWrite = NULL;
10706: break;
10707: }
10708: ++psMemWrite;
10709: }
10710:
10711: if (psMemWrite)
10712: {
10713: cpu.z80Base[dwAddr] = (UINT8) bTemp;
10714: }
10715:
10716: break;
10717: }
10718: case 0xcf:
10719: {
10720: InvalidInstruction(4);
10721: break;
10722: }
10723: case 0xd0:
10724: {
10725: InvalidInstruction(4);
10726: break;
10727: }
10728: case 0xd1:
10729: {
10730: InvalidInstruction(4);
10731: break;
10732: }
10733: case 0xd2:
10734: {
10735: InvalidInstruction(4);
10736: break;
10737: }
10738: case 0xd3:
10739: {
10740: InvalidInstruction(4);
10741: break;
10742: }
10743: case 0xd4:
10744: {
10745: InvalidInstruction(4);
10746: break;
10747: }
10748: case 0xd5:
10749: {
10750: InvalidInstruction(4);
10751: break;
10752: }
10753: case 0xd6:
10754: {
10755: sdwCyclesRemaining -= 23;
10756: bTemp |= 0x04;
10757: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
10758: while (psMemWrite->lowAddr != 0xffffffff)
10759: {
10760: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10761: {
10762: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10763: if (psMemWrite->memoryCall)
10764: {
10765: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10766: }
10767: else
10768: {
10769: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10770: }
10771: psMemWrite = NULL;
10772: break;
10773: }
10774: ++psMemWrite;
10775: }
10776:
10777: if (psMemWrite)
10778: {
10779: cpu.z80Base[dwAddr] = (UINT8) bTemp;
10780: }
10781:
10782: break;
10783: }
10784: case 0xd7:
10785: {
10786: InvalidInstruction(4);
10787: break;
10788: }
10789: case 0xd8:
10790: {
10791: InvalidInstruction(4);
10792: break;
10793: }
10794: case 0xd9:
10795: {
10796: InvalidInstruction(4);
10797: break;
10798: }
10799: case 0xda:
10800: {
10801: InvalidInstruction(4);
10802: break;
10803: }
10804: case 0xdb:
10805: {
10806: InvalidInstruction(4);
10807: break;
10808: }
10809: case 0xdc:
10810: {
10811: InvalidInstruction(4);
10812: break;
10813: }
10814: case 0xdd:
10815: {
10816: InvalidInstruction(4);
10817: break;
10818: }
10819: case 0xde:
10820: {
10821: sdwCyclesRemaining -= 23;
10822: bTemp |= 0x08;
10823: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
10824: while (psMemWrite->lowAddr != 0xffffffff)
10825: {
10826: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10827: {
10828: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10829: if (psMemWrite->memoryCall)
10830: {
10831: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10832: }
10833: else
10834: {
10835: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10836: }
10837: psMemWrite = NULL;
10838: break;
10839: }
10840: ++psMemWrite;
10841: }
10842:
10843: if (psMemWrite)
10844: {
10845: cpu.z80Base[dwAddr] = (UINT8) bTemp;
10846: }
10847:
10848: break;
10849: }
10850: case 0xdf:
10851: {
10852: InvalidInstruction(4);
10853: break;
10854: }
10855: case 0xe0:
10856: {
10857: InvalidInstruction(4);
10858: break;
10859: }
10860: case 0xe1:
10861: {
10862: InvalidInstruction(4);
10863: break;
10864: }
10865: case 0xe2:
10866: {
10867: InvalidInstruction(4);
10868: break;
10869: }
10870: case 0xe3:
10871: {
10872: InvalidInstruction(4);
10873: break;
10874: }
10875: case 0xe4:
10876: {
10877: InvalidInstruction(4);
10878: break;
10879: }
10880: case 0xe5:
10881: {
10882: InvalidInstruction(4);
10883: break;
10884: }
10885: case 0xe6:
10886: {
10887: sdwCyclesRemaining -= 23;
10888: bTemp |= 0x10;
10889: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
10890: while (psMemWrite->lowAddr != 0xffffffff)
10891: {
10892: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10893: {
10894: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10895: if (psMemWrite->memoryCall)
10896: {
10897: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10898: }
10899: else
10900: {
10901: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10902: }
10903: psMemWrite = NULL;
10904: break;
10905: }
10906: ++psMemWrite;
10907: }
10908:
10909: if (psMemWrite)
10910: {
10911: cpu.z80Base[dwAddr] = (UINT8) bTemp;
10912: }
10913:
10914: break;
10915: }
10916: case 0xe7:
10917: {
10918: InvalidInstruction(4);
10919: break;
10920: }
10921: case 0xe8:
10922: {
10923: InvalidInstruction(4);
10924: break;
10925: }
10926: case 0xe9:
10927: {
10928: InvalidInstruction(4);
10929: break;
10930: }
10931: case 0xea:
10932: {
10933: InvalidInstruction(4);
10934: break;
10935: }
10936: case 0xeb:
10937: {
10938: InvalidInstruction(4);
10939: break;
10940: }
10941: case 0xec:
10942: {
10943: InvalidInstruction(4);
10944: break;
10945: }
10946: case 0xed:
10947: {
10948: InvalidInstruction(4);
10949: break;
10950: }
10951: case 0xee:
10952: {
10953: sdwCyclesRemaining -= 23;
10954: bTemp |= 0x20;
10955: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
10956: while (psMemWrite->lowAddr != 0xffffffff)
10957: {
10958: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
10959: {
10960: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
10961: if (psMemWrite->memoryCall)
10962: {
10963: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
10964: }
10965: else
10966: {
10967: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
10968: }
10969: psMemWrite = NULL;
10970: break;
10971: }
10972: ++psMemWrite;
10973: }
10974:
10975: if (psMemWrite)
10976: {
10977: cpu.z80Base[dwAddr] = (UINT8) bTemp;
10978: }
10979:
10980: break;
10981: }
10982: case 0xef:
10983: {
10984: InvalidInstruction(4);
10985: break;
10986: }
10987: case 0xf0:
10988: {
10989: InvalidInstruction(4);
10990: break;
10991: }
10992: case 0xf1:
10993: {
10994: InvalidInstruction(4);
10995: break;
10996: }
10997: case 0xf2:
10998: {
10999: InvalidInstruction(4);
11000: break;
11001: }
11002: case 0xf3:
11003: {
11004: InvalidInstruction(4);
11005: break;
11006: }
11007: case 0xf4:
11008: {
11009: InvalidInstruction(4);
11010: break;
11011: }
11012: case 0xf5:
11013: {
11014: InvalidInstruction(4);
11015: break;
11016: }
11017: case 0xf6:
11018: {
11019: sdwCyclesRemaining -= 23;
11020: bTemp |= 0x40;
11021: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
11022: while (psMemWrite->lowAddr != 0xffffffff)
11023: {
11024: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
11025: {
11026: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11027: if (psMemWrite->memoryCall)
11028: {
11029: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
11030: }
11031: else
11032: {
11033: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
11034: }
11035: psMemWrite = NULL;
11036: break;
11037: }
11038: ++psMemWrite;
11039: }
11040:
11041: if (psMemWrite)
11042: {
11043: cpu.z80Base[dwAddr] = (UINT8) bTemp;
11044: }
11045:
11046: break;
11047: }
11048: case 0xf7:
11049: {
11050: InvalidInstruction(4);
11051: break;
11052: }
11053: case 0xf8:
11054: {
11055: InvalidInstruction(4);
11056: break;
11057: }
11058: case 0xf9:
11059: {
11060: InvalidInstruction(4);
11061: break;
11062: }
11063: case 0xfa:
11064: {
11065: InvalidInstruction(4);
11066: break;
11067: }
11068: case 0xfb:
11069: {
11070: InvalidInstruction(4);
11071: break;
11072: }
11073: case 0xfc:
11074: {
11075: InvalidInstruction(4);
11076: break;
11077: }
11078: case 0xfd:
11079: {
11080: InvalidInstruction(4);
11081: break;
11082: }
11083: case 0xfe:
11084: {
11085: sdwCyclesRemaining -= 23;
11086: bTemp |= 0x80;
11087: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
11088: while (psMemWrite->lowAddr != 0xffffffff)
11089: {
11090: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
11091: {
11092: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11093: if (psMemWrite->memoryCall)
11094: {
11095: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
11096: }
11097: else
11098: {
11099: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
11100: }
11101: psMemWrite = NULL;
11102: break;
11103: }
11104: ++psMemWrite;
11105: }
11106:
11107: if (psMemWrite)
11108: {
11109: cpu.z80Base[dwAddr] = (UINT8) bTemp;
11110: }
11111:
11112: break;
11113: }
11114: case 0xff:
11115: {
11116: InvalidInstruction(4);
11117: break;
11118: }
11119: }
11120: }
11121: void FDHandler(void)
11122: {
11123: switch (*pbPC++)
11124: {
11125: case 0x00:
11126: {
11127: InvalidInstruction(2);
11128: break;
11129: }
11130: case 0x01:
11131: {
11132: InvalidInstruction(2);
11133: break;
11134: }
11135: case 0x02:
11136: {
11137: InvalidInstruction(2);
11138: break;
11139: }
11140: case 0x03:
11141: {
11142: InvalidInstruction(2);
11143: break;
11144: }
11145: case 0x04:
11146: {
11147: InvalidInstruction(2);
11148: break;
11149: }
11150: case 0x05:
11151: {
11152: InvalidInstruction(2);
11153: break;
11154: }
11155: case 0x06:
11156: {
11157: InvalidInstruction(2);
11158: break;
11159: }
11160: case 0x07:
11161: {
11162: InvalidInstruction(2);
11163: break;
11164: }
11165: case 0x08:
11166: {
11167: InvalidInstruction(2);
11168: break;
11169: }
11170: case 0x09:
11171: {
11172: sdwCyclesRemaining -= 15;
11173: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
11174: dwTemp = cpu.z80IY + cpu.z80BC;
11175: cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IY ^ dwTemp ^ cpu.z80BC) >> 8) & Z80_FLAG_HALF_CARRY);
11176: cpu.z80IY = dwTemp & 0xffff;
11177: break;
11178: }
11179: case 0x0a:
11180: {
11181: InvalidInstruction(2);
11182: break;
11183: }
11184: case 0x0b:
11185: {
11186: InvalidInstruction(2);
11187: break;
11188: }
11189: case 0x0c:
11190: {
11191: InvalidInstruction(2);
11192: break;
11193: }
11194: case 0x0d:
11195: {
11196: InvalidInstruction(2);
11197: break;
11198: }
11199: case 0x0e:
11200: {
11201: InvalidInstruction(2);
11202: break;
11203: }
11204: case 0x0f:
11205: {
11206: InvalidInstruction(2);
11207: break;
11208: }
11209: case 0x10:
11210: {
11211: InvalidInstruction(2);
11212: break;
11213: }
11214: case 0x11:
11215: {
11216: InvalidInstruction(2);
11217: break;
11218: }
11219: case 0x12:
11220: {
11221: InvalidInstruction(2);
11222: break;
11223: }
11224: case 0x13:
11225: {
11226: InvalidInstruction(2);
11227: break;
11228: }
11229: case 0x14:
11230: {
11231: InvalidInstruction(2);
11232: break;
11233: }
11234: case 0x15:
11235: {
11236: InvalidInstruction(2);
11237: break;
11238: }
11239: case 0x16:
11240: {
11241: InvalidInstruction(2);
11242: break;
11243: }
11244: case 0x17:
11245: {
11246: InvalidInstruction(2);
11247: break;
11248: }
11249: case 0x18:
11250: {
11251: InvalidInstruction(2);
11252: break;
11253: }
11254: case 0x19:
11255: {
11256: sdwCyclesRemaining -= 15;
11257: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
11258: dwTemp = cpu.z80IY + cpu.z80DE;
11259: cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IY ^ dwTemp ^ cpu.z80DE) >> 8) & Z80_FLAG_HALF_CARRY);
11260: cpu.z80IY = dwTemp & 0xffff;
11261: break;
11262: }
11263: case 0x1a:
11264: {
11265: InvalidInstruction(2);
11266: break;
11267: }
11268: case 0x1b:
11269: {
11270: InvalidInstruction(2);
11271: break;
11272: }
11273: case 0x1c:
11274: {
11275: InvalidInstruction(2);
11276: break;
11277: }
11278: case 0x1d:
11279: {
11280: InvalidInstruction(2);
11281: break;
11282: }
11283: case 0x1e:
11284: {
11285: InvalidInstruction(2);
11286: break;
11287: }
11288: case 0x1f:
11289: {
11290: InvalidInstruction(2);
11291: break;
11292: }
11293: case 0x20:
11294: {
11295: InvalidInstruction(2);
11296: break;
11297: }
11298: case 0x21:
11299: {
11300: sdwCyclesRemaining -= 14;
11301: cpu.z80IY = *pbPC++;
11302: cpu.z80IY |= ((UINT32) *pbPC++ << 8);
11303: break;
11304: }
11305: case 0x22:
11306: {
11307: sdwCyclesRemaining -= 20;
11308: dwAddr = *pbPC++;
11309: dwAddr |= ((UINT32) *pbPC++ << 8);
11310: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
11311: while (psMemWrite->lowAddr != 0xffffffff)
11312: {
11313: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
11314: {
11315: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11316: if (psMemWrite->memoryCall)
11317: {
11318: psMemWrite->memoryCall(dwAddr, (cpu.z80IY & 0xff), psMemWrite);
11319: psMemWrite->memoryCall(dwAddr + 1, (cpu.z80IY >> 8), psMemWrite);
11320: }
11321: else
11322: {
11323: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = cpu.z80IY;
11324: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr) + 1) = cpu.z80IY >> 8;
11325: }
11326: psMemWrite = NULL;
11327: break;
11328: }
11329: ++psMemWrite;
11330: }
11331:
11332: if (psMemWrite)
11333: {
11334: cpu.z80Base[dwAddr] = (UINT8) cpu.z80IY;
11335: cpu.z80Base[dwAddr + 1] = (UINT8) ((UINT32) cpu.z80IY >> 8);
11336: }
11337:
11338: break;
11339: }
11340: case 0x23:
11341: {
11342: sdwCyclesRemaining -= 10;
11343: cpu.z80IY++;
11344: cpu.z80IY &= 0xffff;
11345: break;
11346: }
11347: case 0x24:
11348: {
11349: sdwCyclesRemaining -= 9;
11350: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
11351: cpu.z80F |= bPostIncFlags[cpu.z80YH++];
11352: break;
11353: }
11354: case 0x25:
11355: {
11356: sdwCyclesRemaining -= 9;
11357: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
11358: cpu.z80F |= bPostDecFlags[cpu.z80YH--];
11359: break;
11360: }
11361: case 0x26:
11362: {
11363: sdwCyclesRemaining -= 9;
11364: cpu.z80YH = *pbPC++;
11365: break;
11366: }
11367: case 0x27:
11368: {
11369: InvalidInstruction(2);
11370: break;
11371: }
11372: case 0x28:
11373: {
11374: InvalidInstruction(2);
11375: break;
11376: }
11377: case 0x29:
11378: {
11379: sdwCyclesRemaining -= 15;
11380: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
11381: dwTemp = cpu.z80IY + cpu.z80IY;
11382: cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IY ^ dwTemp ^ cpu.z80HL) >> 8) & Z80_FLAG_HALF_CARRY);
11383: cpu.z80IY = dwTemp & 0xffff;
11384: break;
11385: }
11386: case 0x2a:
11387: {
11388: sdwCyclesRemaining -= 20;
11389: dwAddr = *pbPC++;
11390: dwAddr |= ((UINT32) *pbPC++ << 8);
11391: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
11392: while (psMemRead->lowAddr != 0xffffffff)
11393: {
11394: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
11395: {
11396: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11397: if (psMemRead->memoryCall)
11398: {
11399: cpu.z80IY = psMemRead->memoryCall(dwAddr, psMemRead);
11400: cpu.z80IY |= (UINT32) ((UINT32) psMemRead->memoryCall(dwAddr + 1, psMemRead) << 8);
11401: }
11402: else
11403: {
11404: cpu.z80IY = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
11405: cpu.z80IY |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr + 1)) << 8);
11406: }
11407: psMemRead = NULL;
11408: break;
11409: }
11410: ++psMemRead;
11411: }
11412:
11413: if (psMemRead)
11414: {
11415: cpu.z80IY = cpu.z80Base[dwAddr];
11416: cpu.z80IY |= (UINT32) ((UINT32) cpu.z80Base[dwAddr + 1] << 8);
11417: }
11418:
11419: break;
11420: }
11421: case 0x2b:
11422: {
11423: sdwCyclesRemaining -= 10;
11424: cpu.z80IY--;
11425: cpu.z80IY &= 0xffff;
11426: break;
11427: }
11428: case 0x2c:
11429: {
11430: sdwCyclesRemaining -= 9;
11431: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
11432: cpu.z80F |= bPostIncFlags[cpu.z80YL++];
11433: break;
11434: }
11435: case 0x2d:
11436: {
11437: sdwCyclesRemaining -= 9;
11438: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
11439: cpu.z80F |= bPostDecFlags[cpu.z80YL--];
11440: break;
11441: }
11442: case 0x2e:
11443: {
11444: sdwCyclesRemaining -= 9;
11445: cpu.z80YL = *pbPC++;
11446: break;
11447: }
11448: case 0x2f:
11449: {
11450: InvalidInstruction(2);
11451: break;
11452: }
11453: case 0x30:
11454: {
11455: InvalidInstruction(2);
11456: break;
11457: }
11458: case 0x31:
11459: {
11460: InvalidInstruction(2);
11461: break;
11462: }
11463: case 0x32:
11464: {
11465: InvalidInstruction(2);
11466: break;
11467: }
11468: case 0x33:
11469: {
11470: InvalidInstruction(2);
11471: break;
11472: }
11473: case 0x34:
11474: {
11475: sdwCyclesRemaining -= 23;
11476: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
11477: dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
11478: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
11479: while (psMemRead->lowAddr != 0xffffffff)
11480: {
11481: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
11482: {
11483: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11484: if (psMemRead->memoryCall)
11485: {
11486: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
11487: }
11488: else
11489: {
11490: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
11491: }
11492: psMemRead = NULL;
11493: break;
11494: }
11495: ++psMemRead;
11496: }
11497:
11498: if (psMemRead)
11499: {
11500: bTemp = cpu.z80Base[dwAddr];
11501: }
11502:
11503: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
11504: cpu.z80F |= bPostIncFlags[bTemp++];
11505: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
11506: while (psMemWrite->lowAddr != 0xffffffff)
11507: {
11508: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
11509: {
11510: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11511: if (psMemWrite->memoryCall)
11512: {
11513: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
11514: }
11515: else
11516: {
11517: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
11518: }
11519: psMemWrite = NULL;
11520: break;
11521: }
11522: ++psMemWrite;
11523: }
11524:
11525: if (psMemWrite)
11526: {
11527: cpu.z80Base[dwAddr] = (UINT8) bTemp;
11528: }
11529:
11530: break;
11531: }
11532: case 0x35:
11533: {
11534: sdwCyclesRemaining -= 23;
11535: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
11536: dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
11537: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
11538: while (psMemRead->lowAddr != 0xffffffff)
11539: {
11540: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
11541: {
11542: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11543: if (psMemRead->memoryCall)
11544: {
11545: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
11546: }
11547: else
11548: {
11549: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
11550: }
11551: psMemRead = NULL;
11552: break;
11553: }
11554: ++psMemRead;
11555: }
11556:
11557: if (psMemRead)
11558: {
11559: bTemp = cpu.z80Base[dwAddr];
11560: }
11561:
11562: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
11563: cpu.z80F |= bPostDecFlags[bTemp--];
11564: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
11565: while (psMemWrite->lowAddr != 0xffffffff)
11566: {
11567: if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
11568: {
11569: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11570: if (psMemWrite->memoryCall)
11571: {
11572: psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
11573: }
11574: else
11575: {
11576: *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
11577: }
11578: psMemWrite = NULL;
11579: break;
11580: }
11581: ++psMemWrite;
11582: }
11583:
11584: if (psMemWrite)
11585: {
11586: cpu.z80Base[dwAddr] = (UINT8) bTemp;
11587: }
11588:
11589: break;
11590: }
11591: case 0x36:
11592: {
11593: sdwCyclesRemaining -= 19;
11594: sdwAddr = (INT8) *pbPC++; // Get the offset
11595: sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
11596: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
11597: while (psMemWrite->lowAddr != 0xffffffff)
11598: {
11599: if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
11600: {
11601: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11602: if (psMemWrite->memoryCall)
11603: {
11604: psMemWrite->memoryCall(sdwAddr, *pbPC++, psMemWrite);
11605: }
11606: else
11607: {
11608: *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = *pbPC++;
11609: }
11610: psMemWrite = NULL;
11611: break;
11612: }
11613: ++psMemWrite;
11614: }
11615:
11616: if (psMemWrite)
11617: {
11618: cpu.z80Base[sdwAddr] = (UINT8) *pbPC++;
11619: }
11620:
11621: break;
11622: }
11623: case 0x37:
11624: {
11625: InvalidInstruction(2);
11626: break;
11627: }
11628: case 0x38:
11629: {
11630: InvalidInstruction(2);
11631: break;
11632: }
11633: case 0x39:
11634: {
11635: sdwCyclesRemaining -= 15;
11636: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
11637: dwTemp = cpu.z80IY + cpu.z80sp;
11638: cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IY ^ dwTemp ^ cpu.z80sp) >> 8) & Z80_FLAG_HALF_CARRY);
11639: cpu.z80IY = dwTemp & 0xffff;
11640: break;
11641: }
11642: case 0x3a:
11643: {
11644: InvalidInstruction(2);
11645: break;
11646: }
11647: case 0x3b:
11648: {
11649: InvalidInstruction(2);
11650: break;
11651: }
11652: case 0x3c:
11653: {
11654: InvalidInstruction(2);
11655: break;
11656: }
11657: case 0x3d:
11658: {
11659: InvalidInstruction(2);
11660: break;
11661: }
11662: case 0x3e:
11663: {
11664: InvalidInstruction(2);
11665: break;
11666: }
11667: case 0x3f:
11668: {
11669: InvalidInstruction(2);
11670: break;
11671: }
11672: case 0x40:
11673: {
11674: InvalidInstruction(2);
11675: break;
11676: }
11677: case 0x41:
11678: {
11679: InvalidInstruction(2);
11680: break;
11681: }
11682: case 0x42:
11683: {
11684: InvalidInstruction(2);
11685: break;
11686: }
11687: case 0x43:
11688: {
11689: InvalidInstruction(2);
11690: break;
11691: }
11692: case 0x44:
11693: {
11694: sdwCyclesRemaining -= 9;
11695: cpu.z80B = cpu.z80YH;
11696: break;
11697: }
11698: case 0x45:
11699: {
11700: sdwCyclesRemaining -= 9;
11701: cpu.z80B = cpu.z80YL;
11702: break;
11703: }
11704: case 0x46:
11705: {
11706: sdwCyclesRemaining -= 19;
11707: sdwAddr = (INT8) *pbPC++; // Get the offset
11708: sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
11709: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
11710: while (psMemRead->lowAddr != 0xffffffff)
11711: {
11712: if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
11713: {
11714: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11715: if (psMemRead->memoryCall)
11716: {
11717: cpu.z80B = psMemRead->memoryCall(sdwAddr, psMemRead);
11718: }
11719: else
11720: {
11721: cpu.z80B = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
11722: }
11723: psMemRead = NULL;
11724: break;
11725: }
11726: ++psMemRead;
11727: }
11728:
11729: if (psMemRead)
11730: {
11731: cpu.z80B = cpu.z80Base[sdwAddr];
11732: }
11733:
11734: break;
11735: }
11736: case 0x47:
11737: {
11738: InvalidInstruction(2);
11739: break;
11740: }
11741: case 0x48:
11742: {
11743: InvalidInstruction(2);
11744: break;
11745: }
11746: case 0x49:
11747: {
11748: InvalidInstruction(2);
11749: break;
11750: }
11751: case 0x4a:
11752: {
11753: InvalidInstruction(2);
11754: break;
11755: }
11756: case 0x4b:
11757: {
11758: InvalidInstruction(2);
11759: break;
11760: }
11761: case 0x4c:
11762: {
11763: sdwCyclesRemaining -= 9;
11764: cpu.z80C = cpu.z80YH;
11765: break;
11766: }
11767: case 0x4d:
11768: {
11769: sdwCyclesRemaining -= 9;
11770: cpu.z80C = cpu.z80YL;
11771: break;
11772: }
11773: case 0x4e:
11774: {
11775: sdwCyclesRemaining -= 19;
11776: sdwAddr = (INT8) *pbPC++; // Get the offset
11777: sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
11778: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
11779: while (psMemRead->lowAddr != 0xffffffff)
11780: {
11781: if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
11782: {
11783: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11784: if (psMemRead->memoryCall)
11785: {
11786: cpu.z80C = psMemRead->memoryCall(sdwAddr, psMemRead);
11787: }
11788: else
11789: {
11790: cpu.z80C = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
11791: }
11792: psMemRead = NULL;
11793: break;
11794: }
11795: ++psMemRead;
11796: }
11797:
11798: if (psMemRead)
11799: {
11800: cpu.z80C = cpu.z80Base[sdwAddr];
11801: }
11802:
11803: break;
11804: }
11805: case 0x4f:
11806: {
11807: InvalidInstruction(2);
11808: break;
11809: }
11810: case 0x50:
11811: {
11812: InvalidInstruction(2);
11813: break;
11814: }
11815: case 0x51:
11816: {
11817: InvalidInstruction(2);
11818: break;
11819: }
11820: case 0x52:
11821: {
11822: InvalidInstruction(2);
11823: break;
11824: }
11825: case 0x53:
11826: {
11827: InvalidInstruction(2);
11828: break;
11829: }
11830: case 0x54:
11831: {
11832: sdwCyclesRemaining -= 9;
11833: cpu.z80D = cpu.z80YH;
11834: break;
11835: }
11836: case 0x55:
11837: {
11838: sdwCyclesRemaining -= 9;
11839: cpu.z80D = cpu.z80YL;
11840: break;
11841: }
11842: case 0x56:
11843: {
11844: sdwCyclesRemaining -= 19;
11845: sdwAddr = (INT8) *pbPC++; // Get the offset
11846: sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
11847: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
11848: while (psMemRead->lowAddr != 0xffffffff)
11849: {
11850: if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
11851: {
11852: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11853: if (psMemRead->memoryCall)
11854: {
11855: cpu.z80D = psMemRead->memoryCall(sdwAddr, psMemRead);
11856: }
11857: else
11858: {
11859: cpu.z80D = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
11860: }
11861: psMemRead = NULL;
11862: break;
11863: }
11864: ++psMemRead;
11865: }
11866:
11867: if (psMemRead)
11868: {
11869: cpu.z80D = cpu.z80Base[sdwAddr];
11870: }
11871:
11872: break;
11873: }
11874: case 0x57:
11875: {
11876: InvalidInstruction(2);
11877: break;
11878: }
11879: case 0x58:
11880: {
11881: InvalidInstruction(2);
11882: break;
11883: }
11884: case 0x59:
11885: {
11886: InvalidInstruction(2);
11887: break;
11888: }
11889: case 0x5a:
11890: {
11891: InvalidInstruction(2);
11892: break;
11893: }
11894: case 0x5b:
11895: {
11896: InvalidInstruction(2);
11897: break;
11898: }
11899: case 0x5c:
11900: {
11901: sdwCyclesRemaining -= 9;
11902: cpu.z80E = cpu.z80YH;
11903: break;
11904: }
11905: case 0x5d:
11906: {
11907: sdwCyclesRemaining -= 9;
11908: cpu.z80E = cpu.z80YL;
11909: break;
11910: }
11911: case 0x5e:
11912: {
11913: sdwCyclesRemaining -= 19;
11914: sdwAddr = (INT8) *pbPC++; // Get the offset
11915: sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
11916: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
11917: while (psMemRead->lowAddr != 0xffffffff)
11918: {
11919: if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
11920: {
11921: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11922: if (psMemRead->memoryCall)
11923: {
11924: cpu.z80E = psMemRead->memoryCall(sdwAddr, psMemRead);
11925: }
11926: else
11927: {
11928: cpu.z80E = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
11929: }
11930: psMemRead = NULL;
11931: break;
11932: }
11933: ++psMemRead;
11934: }
11935:
11936: if (psMemRead)
11937: {
11938: cpu.z80E = cpu.z80Base[sdwAddr];
11939: }
11940:
11941: break;
11942: }
11943: case 0x5f:
11944: {
11945: InvalidInstruction(2);
11946: break;
11947: }
11948: case 0x60:
11949: {
11950: sdwCyclesRemaining -= 9;
11951: cpu.z80YH = cpu.z80B;
11952: break;
11953: }
11954: case 0x61:
11955: {
11956: sdwCyclesRemaining -= 9;
11957: cpu.z80YH = cpu.z80C;
11958: break;
11959: }
11960: case 0x62:
11961: {
11962: sdwCyclesRemaining -= 9;
11963: cpu.z80YH = cpu.z80D;
11964: break;
11965: }
11966: case 0x63:
11967: {
11968: sdwCyclesRemaining -= 9;
11969: cpu.z80YH = cpu.z80E;
11970: break;
11971: }
11972: case 0x64:
11973: {
11974: sdwCyclesRemaining -= 9;
11975: break;
11976: }
11977: case 0x65:
11978: {
11979: sdwCyclesRemaining -= 9;
11980: cpu.z80YH = cpu.z80YL;
11981: break;
11982: }
11983: case 0x66:
11984: {
11985: sdwCyclesRemaining -= 19;
11986: sdwAddr = (INT8) *pbPC++; // Get the offset
11987: sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
11988: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
11989: while (psMemRead->lowAddr != 0xffffffff)
11990: {
11991: if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
11992: {
11993: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
11994: if (psMemRead->memoryCall)
11995: {
11996: cpu.z80H = psMemRead->memoryCall(sdwAddr, psMemRead);
11997: }
11998: else
11999: {
12000: cpu.z80H = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
12001: }
12002: psMemRead = NULL;
12003: break;
12004: }
12005: ++psMemRead;
12006: }
12007:
12008: if (psMemRead)
12009: {
12010: cpu.z80H = cpu.z80Base[sdwAddr];
12011: }
12012:
12013: break;
12014: }
12015: case 0x67:
12016: {
12017: sdwCyclesRemaining -= 9;
12018: cpu.z80YH = cpu.z80A;
12019: break;
12020: }
12021: case 0x68:
12022: {
12023: sdwCyclesRemaining -= 9;
12024: cpu.z80YL = cpu.z80B;
12025: break;
12026: }
12027: case 0x69:
12028: {
12029: sdwCyclesRemaining -= 9;
12030: cpu.z80YL = cpu.z80C;
12031: break;
12032: }
12033: case 0x6a:
12034: {
12035: sdwCyclesRemaining -= 9;
12036: cpu.z80YL = cpu.z80D;
12037: break;
12038: }
12039: case 0x6b:
12040: {
12041: sdwCyclesRemaining -= 9;
12042: cpu.z80YL = cpu.z80E;
12043: break;
12044: }
12045: case 0x6c:
12046: {
12047: sdwCyclesRemaining -= 9;
12048: cpu.z80YL = cpu.z80YH;
12049: break;
12050: }
12051: case 0x6d:
12052: {
12053: sdwCyclesRemaining -= 9;
12054: break;
12055: }
12056: case 0x6e:
12057: {
12058: sdwCyclesRemaining -= 19;
12059: sdwAddr = (INT8) *pbPC++; // Get the offset
12060: sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
12061: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
12062: while (psMemRead->lowAddr != 0xffffffff)
12063: {
12064: if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
12065: {
12066: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12067: if (psMemRead->memoryCall)
12068: {
12069: cpu.z80L = psMemRead->memoryCall(sdwAddr, psMemRead);
12070: }
12071: else
12072: {
12073: cpu.z80L = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
12074: }
12075: psMemRead = NULL;
12076: break;
12077: }
12078: ++psMemRead;
12079: }
12080:
12081: if (psMemRead)
12082: {
12083: cpu.z80L = cpu.z80Base[sdwAddr];
12084: }
12085:
12086: break;
12087: }
12088: case 0x6f:
12089: {
12090: sdwCyclesRemaining -= 9;
12091: cpu.z80YL = cpu.z80A;
12092: break;
12093: }
12094: case 0x70:
12095: {
12096: sdwCyclesRemaining -= 19;
12097: sdwAddr = (INT8) *pbPC++; // Get the offset
12098: sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
12099: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
12100: while (psMemWrite->lowAddr != 0xffffffff)
12101: {
12102: if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
12103: {
12104: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12105: if (psMemWrite->memoryCall)
12106: {
12107: psMemWrite->memoryCall(sdwAddr, cpu.z80B, psMemWrite);
12108: }
12109: else
12110: {
12111: *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80B;
12112: }
12113: psMemWrite = NULL;
12114: break;
12115: }
12116: ++psMemWrite;
12117: }
12118:
12119: if (psMemWrite)
12120: {
12121: cpu.z80Base[sdwAddr] = (UINT8) cpu.z80B;
12122: }
12123:
12124: break;
12125: }
12126: case 0x71:
12127: {
12128: sdwCyclesRemaining -= 19;
12129: sdwAddr = (INT8) *pbPC++; // Get the offset
12130: sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
12131: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
12132: while (psMemWrite->lowAddr != 0xffffffff)
12133: {
12134: if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
12135: {
12136: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12137: if (psMemWrite->memoryCall)
12138: {
12139: psMemWrite->memoryCall(sdwAddr, cpu.z80C, psMemWrite);
12140: }
12141: else
12142: {
12143: *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80C;
12144: }
12145: psMemWrite = NULL;
12146: break;
12147: }
12148: ++psMemWrite;
12149: }
12150:
12151: if (psMemWrite)
12152: {
12153: cpu.z80Base[sdwAddr] = (UINT8) cpu.z80C;
12154: }
12155:
12156: break;
12157: }
12158: case 0x72:
12159: {
12160: sdwCyclesRemaining -= 19;
12161: sdwAddr = (INT8) *pbPC++; // Get the offset
12162: sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
12163: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
12164: while (psMemWrite->lowAddr != 0xffffffff)
12165: {
12166: if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
12167: {
12168: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12169: if (psMemWrite->memoryCall)
12170: {
12171: psMemWrite->memoryCall(sdwAddr, cpu.z80D, psMemWrite);
12172: }
12173: else
12174: {
12175: *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80D;
12176: }
12177: psMemWrite = NULL;
12178: break;
12179: }
12180: ++psMemWrite;
12181: }
12182:
12183: if (psMemWrite)
12184: {
12185: cpu.z80Base[sdwAddr] = (UINT8) cpu.z80D;
12186: }
12187:
12188: break;
12189: }
12190: case 0x73:
12191: {
12192: sdwCyclesRemaining -= 19;
12193: sdwAddr = (INT8) *pbPC++; // Get the offset
12194: sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
12195: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
12196: while (psMemWrite->lowAddr != 0xffffffff)
12197: {
12198: if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
12199: {
12200: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12201: if (psMemWrite->memoryCall)
12202: {
12203: psMemWrite->memoryCall(sdwAddr, cpu.z80E, psMemWrite);
12204: }
12205: else
12206: {
12207: *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80E;
12208: }
12209: psMemWrite = NULL;
12210: break;
12211: }
12212: ++psMemWrite;
12213: }
12214:
12215: if (psMemWrite)
12216: {
12217: cpu.z80Base[sdwAddr] = (UINT8) cpu.z80E;
12218: }
12219:
12220: break;
12221: }
12222: case 0x74:
12223: {
12224: sdwCyclesRemaining -= 19;
12225: sdwAddr = (INT8) *pbPC++; // Get the offset
12226: sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
12227: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
12228: while (psMemWrite->lowAddr != 0xffffffff)
12229: {
12230: if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
12231: {
12232: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12233: if (psMemWrite->memoryCall)
12234: {
12235: psMemWrite->memoryCall(sdwAddr, cpu.z80H, psMemWrite);
12236: }
12237: else
12238: {
12239: *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80H;
12240: }
12241: psMemWrite = NULL;
12242: break;
12243: }
12244: ++psMemWrite;
12245: }
12246:
12247: if (psMemWrite)
12248: {
12249: cpu.z80Base[sdwAddr] = (UINT8) cpu.z80H;
12250: }
12251:
12252: break;
12253: }
12254: case 0x75:
12255: {
12256: sdwCyclesRemaining -= 19;
12257: sdwAddr = (INT8) *pbPC++; // Get the offset
12258: sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
12259: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
12260: while (psMemWrite->lowAddr != 0xffffffff)
12261: {
12262: if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
12263: {
12264: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12265: if (psMemWrite->memoryCall)
12266: {
12267: psMemWrite->memoryCall(sdwAddr, cpu.z80L, psMemWrite);
12268: }
12269: else
12270: {
12271: *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80L;
12272: }
12273: psMemWrite = NULL;
12274: break;
12275: }
12276: ++psMemWrite;
12277: }
12278:
12279: if (psMemWrite)
12280: {
12281: cpu.z80Base[sdwAddr] = (UINT8) cpu.z80L;
12282: }
12283:
12284: break;
12285: }
12286: case 0x76:
12287: {
12288: sdwCyclesRemaining -= 19;
12289: InvalidInstruction(2);
12290: break;
12291: }
12292: case 0x77:
12293: {
12294: sdwCyclesRemaining -= 19;
12295: sdwAddr = (INT8) *pbPC++; // Get the offset
12296: sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
12297: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
12298: while (psMemWrite->lowAddr != 0xffffffff)
12299: {
12300: if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
12301: {
12302: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12303: if (psMemWrite->memoryCall)
12304: {
12305: psMemWrite->memoryCall(sdwAddr, cpu.z80A, psMemWrite);
12306: }
12307: else
12308: {
12309: *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80A;
12310: }
12311: psMemWrite = NULL;
12312: break;
12313: }
12314: ++psMemWrite;
12315: }
12316:
12317: if (psMemWrite)
12318: {
12319: cpu.z80Base[sdwAddr] = (UINT8) cpu.z80A;
12320: }
12321:
12322: break;
12323: }
12324: case 0x78:
12325: {
12326: InvalidInstruction(2);
12327: break;
12328: }
12329: case 0x79:
12330: {
12331: InvalidInstruction(2);
12332: break;
12333: }
12334: case 0x7a:
12335: {
12336: InvalidInstruction(2);
12337: break;
12338: }
12339: case 0x7b:
12340: {
12341: InvalidInstruction(2);
12342: break;
12343: }
12344: case 0x7c:
12345: {
12346: sdwCyclesRemaining -= 9;
12347: cpu.z80A = cpu.z80YH;
12348: break;
12349: }
12350: case 0x7d:
12351: {
12352: sdwCyclesRemaining -= 9;
12353: cpu.z80A = cpu.z80YL;
12354: break;
12355: }
12356: case 0x7e:
12357: {
12358: sdwCyclesRemaining -= 19;
12359: sdwAddr = (INT8) *pbPC++; // Get the offset
12360: sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
12361: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
12362: while (psMemRead->lowAddr != 0xffffffff)
12363: {
12364: if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
12365: {
12366: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12367: if (psMemRead->memoryCall)
12368: {
12369: cpu.z80A = psMemRead->memoryCall(sdwAddr, psMemRead);
12370: }
12371: else
12372: {
12373: cpu.z80A = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
12374: }
12375: psMemRead = NULL;
12376: break;
12377: }
12378: ++psMemRead;
12379: }
12380:
12381: if (psMemRead)
12382: {
12383: cpu.z80A = cpu.z80Base[sdwAddr];
12384: }
12385:
12386: break;
12387: }
12388: case 0x7f:
12389: {
12390: InvalidInstruction(2);
12391: break;
12392: }
12393: case 0x80:
12394: {
12395: InvalidInstruction(2);
12396: break;
12397: }
12398: case 0x81:
12399: {
12400: InvalidInstruction(2);
12401: break;
12402: }
12403: case 0x82:
12404: {
12405: InvalidInstruction(2);
12406: break;
12407: }
12408: case 0x83:
12409: {
12410: InvalidInstruction(2);
12411: break;
12412: }
12413: case 0x84:
12414: {
12415: sdwCyclesRemaining -= 9;
12416: bTemp2 = cpu.z80A + cpu.z80YH;
12417: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
12418: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12419: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80YH];
12420: break;
12421: }
12422: case 0x85:
12423: {
12424: sdwCyclesRemaining -= 9;
12425: bTemp2 = cpu.z80A + cpu.z80YL;
12426: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
12427: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12428: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80YL];
12429: break;
12430: }
12431: case 0x86:
12432: {
12433: sdwCyclesRemaining -= 19;
12434: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
12435: dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
12436: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
12437: while (psMemRead->lowAddr != 0xffffffff)
12438: {
12439: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
12440: {
12441: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12442: if (psMemRead->memoryCall)
12443: {
12444: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
12445: }
12446: else
12447: {
12448: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
12449: }
12450: psMemRead = NULL;
12451: break;
12452: }
12453: ++psMemRead;
12454: }
12455:
12456: if (psMemRead)
12457: {
12458: bTemp = cpu.z80Base[dwAddr];
12459: }
12460:
12461: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
12462: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12463: pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp];
12464: cpu.z80A += bTemp;
12465: break;
12466: }
12467: case 0x87:
12468: {
12469: InvalidInstruction(2);
12470: break;
12471: }
12472: case 0x88:
12473: {
12474: InvalidInstruction(2);
12475: break;
12476: }
12477: case 0x89:
12478: {
12479: InvalidInstruction(2);
12480: break;
12481: }
12482: case 0x8a:
12483: {
12484: InvalidInstruction(2);
12485: break;
12486: }
12487: case 0x8b:
12488: {
12489: InvalidInstruction(2);
12490: break;
12491: }
12492: case 0x8c:
12493: {
12494: sdwCyclesRemaining -= 9;
12495: bTemp2 = cpu.z80A + cpu.z80YH + (cpu.z80F & Z80_FLAG_CARRY);
12496: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
12497: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12498: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80YH | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
12499: break;
12500: }
12501: case 0x8d:
12502: {
12503: sdwCyclesRemaining -= 9;
12504: bTemp2 = cpu.z80A + cpu.z80YL + (cpu.z80F & Z80_FLAG_CARRY);
12505: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
12506: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12507: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80YL | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
12508: break;
12509: }
12510: case 0x8e:
12511: {
12512: sdwCyclesRemaining -= 19;
12513: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
12514: dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
12515: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
12516: while (psMemRead->lowAddr != 0xffffffff)
12517: {
12518: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
12519: {
12520: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12521: if (psMemRead->memoryCall)
12522: {
12523: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
12524: }
12525: else
12526: {
12527: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
12528: }
12529: psMemRead = NULL;
12530: break;
12531: }
12532: ++psMemRead;
12533: }
12534:
12535: if (psMemRead)
12536: {
12537: bTemp = cpu.z80Base[dwAddr];
12538: }
12539:
12540: bTemp2 = (cpu.z80F & Z80_FLAG_CARRY);
12541: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
12542: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12543: pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
12544: cpu.z80A += bTemp + bTemp2;
12545: break;
12546: }
12547: case 0x8f:
12548: {
12549: InvalidInstruction(2);
12550: break;
12551: }
12552: case 0x90:
12553: {
12554: InvalidInstruction(2);
12555: break;
12556: }
12557: case 0x91:
12558: {
12559: InvalidInstruction(2);
12560: break;
12561: }
12562: case 0x92:
12563: {
12564: InvalidInstruction(2);
12565: break;
12566: }
12567: case 0x93:
12568: {
12569: InvalidInstruction(2);
12570: break;
12571: }
12572: case 0x94:
12573: {
12574: sdwCyclesRemaining -= 9;
12575: bTemp2 = cpu.z80A - cpu.z80YH;
12576: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
12577: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12578: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80YH];
12579: break;
12580: }
12581: case 0x95:
12582: {
12583: sdwCyclesRemaining -= 9;
12584: bTemp2 = cpu.z80A - cpu.z80YL;
12585: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
12586: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12587: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80YL];
12588: break;
12589: }
12590: case 0x96:
12591: {
12592: sdwCyclesRemaining -= 19;
12593: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
12594: dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
12595: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
12596: while (psMemRead->lowAddr != 0xffffffff)
12597: {
12598: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
12599: {
12600: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12601: if (psMemRead->memoryCall)
12602: {
12603: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
12604: }
12605: else
12606: {
12607: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
12608: }
12609: psMemRead = NULL;
12610: break;
12611: }
12612: ++psMemRead;
12613: }
12614:
12615: if (psMemRead)
12616: {
12617: bTemp = cpu.z80Base[dwAddr];
12618: }
12619:
12620: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
12621: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12622: pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
12623: cpu.z80A -= bTemp;
12624: break;
12625: }
12626: case 0x97:
12627: {
12628: InvalidInstruction(2);
12629: break;
12630: }
12631: case 0x98:
12632: {
12633: InvalidInstruction(2);
12634: break;
12635: }
12636: case 0x99:
12637: {
12638: InvalidInstruction(2);
12639: break;
12640: }
12641: case 0x9a:
12642: {
12643: InvalidInstruction(2);
12644: break;
12645: }
12646: case 0x9b:
12647: {
12648: InvalidInstruction(2);
12649: break;
12650: }
12651: case 0x9c:
12652: {
12653: sdwCyclesRemaining -= 9;
12654: bTemp2 = cpu.z80A - cpu.z80YH - (cpu.z80F & Z80_FLAG_CARRY);
12655: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
12656: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12657: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80YH | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
12658: break;
12659: }
12660: case 0x9d:
12661: {
12662: sdwCyclesRemaining -= 9;
12663: bTemp2 = cpu.z80A - cpu.z80YL - (cpu.z80F & Z80_FLAG_CARRY);
12664: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
12665: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12666: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80YL | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
12667: break;
12668: }
12669: case 0x9e:
12670: {
12671: sdwCyclesRemaining -= 19;
12672: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
12673: dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
12674: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
12675: while (psMemRead->lowAddr != 0xffffffff)
12676: {
12677: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
12678: {
12679: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12680: if (psMemRead->memoryCall)
12681: {
12682: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
12683: }
12684: else
12685: {
12686: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
12687: }
12688: psMemRead = NULL;
12689: break;
12690: }
12691: ++psMemRead;
12692: }
12693:
12694: if (psMemRead)
12695: {
12696: bTemp = cpu.z80Base[dwAddr];
12697: }
12698:
12699: bTemp2 = cpu.z80A;
12700: cpu.z80A = cpu.z80A - bTemp - (cpu.z80F & Z80_FLAG_CARRY);
12701: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
12702: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
12703: pbSubSbcTable[((UINT32) bTemp2 << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
12704: break;
12705: }
12706: case 0x9f:
12707: {
12708: InvalidInstruction(2);
12709: break;
12710: }
12711: case 0xa0:
12712: {
12713: InvalidInstruction(2);
12714: break;
12715: }
12716: case 0xa1:
12717: {
12718: InvalidInstruction(2);
12719: break;
12720: }
12721: case 0xa2:
12722: {
12723: InvalidInstruction(2);
12724: break;
12725: }
12726: case 0xa3:
12727: {
12728: InvalidInstruction(2);
12729: break;
12730: }
12731: case 0xa4:
12732: {
12733: sdwCyclesRemaining -= 9;
12734: cpu.z80A &= cpu.z80YH;
12735: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
12736: cpu.z80F |= bPostANDFlags[cpu.z80A];
12737:
12738: break;
12739: }
12740: case 0xa5:
12741: {
12742: sdwCyclesRemaining -= 9;
12743: cpu.z80A &= cpu.z80YL;
12744: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
12745: cpu.z80F |= bPostANDFlags[cpu.z80A];
12746:
12747: break;
12748: }
12749: case 0xa6:
12750: {
12751: sdwCyclesRemaining -= 19;
12752: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
12753: dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
12754: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
12755: while (psMemRead->lowAddr != 0xffffffff)
12756: {
12757: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
12758: {
12759: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12760: if (psMemRead->memoryCall)
12761: {
12762: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
12763: }
12764: else
12765: {
12766: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
12767: }
12768: psMemRead = NULL;
12769: break;
12770: }
12771: ++psMemRead;
12772: }
12773:
12774: if (psMemRead)
12775: {
12776: bTemp = cpu.z80Base[dwAddr];
12777: }
12778:
12779: cpu.z80A &= bTemp;
12780: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
12781: cpu.z80F |= bPostANDFlags[cpu.z80A];
12782:
12783: break;
12784: }
12785: case 0xa7:
12786: {
12787: InvalidInstruction(2);
12788: break;
12789: }
12790: case 0xa8:
12791: {
12792: InvalidInstruction(2);
12793: break;
12794: }
12795: case 0xa9:
12796: {
12797: InvalidInstruction(2);
12798: break;
12799: }
12800: case 0xaa:
12801: {
12802: InvalidInstruction(2);
12803: break;
12804: }
12805: case 0xab:
12806: {
12807: InvalidInstruction(2);
12808: break;
12809: }
12810: case 0xac:
12811: {
12812: sdwCyclesRemaining -= 9;
12813: cpu.z80A ^= cpu.z80YH;
12814: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
12815: cpu.z80F |= bPostORFlags[cpu.z80A];
12816:
12817: break;
12818: }
12819: case 0xad:
12820: {
12821: sdwCyclesRemaining -= 9;
12822: cpu.z80A ^= cpu.z80YL;
12823: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
12824: cpu.z80F |= bPostORFlags[cpu.z80A];
12825:
12826: break;
12827: }
12828: case 0xae:
12829: {
12830: sdwCyclesRemaining -= 19;
12831: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
12832: dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
12833: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
12834: while (psMemRead->lowAddr != 0xffffffff)
12835: {
12836: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
12837: {
12838: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12839: if (psMemRead->memoryCall)
12840: {
12841: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
12842: }
12843: else
12844: {
12845: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
12846: }
12847: psMemRead = NULL;
12848: break;
12849: }
12850: ++psMemRead;
12851: }
12852:
12853: if (psMemRead)
12854: {
12855: bTemp = cpu.z80Base[dwAddr];
12856: }
12857:
12858: cpu.z80A ^= bTemp;
12859: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
12860: cpu.z80F |= bPostORFlags[cpu.z80A];
12861:
12862: break;
12863: }
12864: case 0xaf:
12865: {
12866: InvalidInstruction(2);
12867: break;
12868: }
12869: case 0xb0:
12870: {
12871: InvalidInstruction(2);
12872: break;
12873: }
12874: case 0xb1:
12875: {
12876: InvalidInstruction(2);
12877: break;
12878: }
12879: case 0xb2:
12880: {
12881: InvalidInstruction(2);
12882: break;
12883: }
12884: case 0xb3:
12885: {
12886: InvalidInstruction(2);
12887: break;
12888: }
12889: case 0xb4:
12890: {
12891: sdwCyclesRemaining -= 9;
12892: cpu.z80A |= cpu.z80YH;
12893: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
12894: cpu.z80F |= bPostORFlags[cpu.z80A];
12895:
12896: break;
12897: }
12898: case 0xb5:
12899: {
12900: sdwCyclesRemaining -= 9;
12901: cpu.z80A |= cpu.z80YL;
12902: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
12903: cpu.z80F |= bPostORFlags[cpu.z80A];
12904:
12905: break;
12906: }
12907: case 0xb6:
12908: {
12909: sdwCyclesRemaining -= 19;
12910: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
12911: dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
12912: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
12913: while (psMemRead->lowAddr != 0xffffffff)
12914: {
12915: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
12916: {
12917: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12918: if (psMemRead->memoryCall)
12919: {
12920: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
12921: }
12922: else
12923: {
12924: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
12925: }
12926: psMemRead = NULL;
12927: break;
12928: }
12929: ++psMemRead;
12930: }
12931:
12932: if (psMemRead)
12933: {
12934: bTemp = cpu.z80Base[dwAddr];
12935: }
12936:
12937: cpu.z80A |= bTemp;
12938: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
12939: cpu.z80F |= bPostORFlags[cpu.z80A];
12940:
12941: break;
12942: }
12943: case 0xb7:
12944: {
12945: InvalidInstruction(2);
12946: break;
12947: }
12948: case 0xb8:
12949: {
12950: InvalidInstruction(2);
12951: break;
12952: }
12953: case 0xb9:
12954: {
12955: InvalidInstruction(2);
12956: break;
12957: }
12958: case 0xba:
12959: {
12960: InvalidInstruction(2);
12961: break;
12962: }
12963: case 0xbb:
12964: {
12965: InvalidInstruction(2);
12966: break;
12967: }
12968: case 0xbc:
12969: {
12970: sdwCyclesRemaining -= 9;
12971: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
12972: cpu.z80F |= bPostORFlags[cpu.z80A];
12973:
12974: break;
12975: }
12976: case 0xbd:
12977: {
12978: sdwCyclesRemaining -= 9;
12979: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
12980: cpu.z80F |= bPostORFlags[cpu.z80A];
12981:
12982: break;
12983: }
12984: case 0xbe:
12985: {
12986: sdwCyclesRemaining -= 19;
12987: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
12988: dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
12989: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
12990: while (psMemRead->lowAddr != 0xffffffff)
12991: {
12992: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
12993: {
12994: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
12995: if (psMemRead->memoryCall)
12996: {
12997: bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
12998: }
12999: else
13000: {
13001: bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
13002: }
13003: psMemRead = NULL;
13004: break;
13005: }
13006: ++psMemRead;
13007: }
13008:
13009: if (psMemRead)
13010: {
13011: bTemp = cpu.z80Base[dwAddr];
13012: }
13013:
13014: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
13015: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
13016: pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
13017: break;
13018: }
13019: case 0xbf:
13020: {
13021: InvalidInstruction(2);
13022: break;
13023: }
13024: case 0xc0:
13025: {
13026: InvalidInstruction(2);
13027: break;
13028: }
13029: case 0xc1:
13030: {
13031: InvalidInstruction(2);
13032: break;
13033: }
13034: case 0xc2:
13035: {
13036: InvalidInstruction(2);
13037: break;
13038: }
13039: case 0xc3:
13040: {
13041: InvalidInstruction(2);
13042: break;
13043: }
13044: case 0xc4:
13045: {
13046: InvalidInstruction(2);
13047: break;
13048: }
13049: case 0xc5:
13050: {
13051: InvalidInstruction(2);
13052: break;
13053: }
13054: case 0xc6:
13055: {
13056: InvalidInstruction(2);
13057: break;
13058: }
13059: case 0xc7:
13060: {
13061: InvalidInstruction(2);
13062: break;
13063: }
13064: case 0xc8:
13065: {
13066: InvalidInstruction(2);
13067: break;
13068: }
13069: case 0xc9:
13070: {
13071: InvalidInstruction(2);
13072: break;
13073: }
13074: case 0xca:
13075: {
13076: InvalidInstruction(2);
13077: break;
13078: }
13079: case 0xcb:
13080: {
13081: DDFDCBHandler(1);
13082: break;
13083: }
13084: case 0xcc:
13085: {
13086: InvalidInstruction(2);
13087: break;
13088: }
13089: case 0xcd:
13090: {
13091: InvalidInstruction(2);
13092: break;
13093: }
13094: case 0xce:
13095: {
13096: InvalidInstruction(2);
13097: break;
13098: }
13099: case 0xcf:
13100: {
13101: InvalidInstruction(2);
13102: break;
13103: }
13104: case 0xd0:
13105: {
13106: InvalidInstruction(2);
13107: break;
13108: }
13109: case 0xd1:
13110: {
13111: InvalidInstruction(2);
13112: break;
13113: }
13114: case 0xd2:
13115: {
13116: InvalidInstruction(2);
13117: break;
13118: }
13119: case 0xd3:
13120: {
13121: InvalidInstruction(2);
13122: break;
13123: }
13124: case 0xd4:
13125: {
13126: InvalidInstruction(2);
13127: break;
13128: }
13129: case 0xd5:
13130: {
13131: InvalidInstruction(2);
13132: break;
13133: }
13134: case 0xd6:
13135: {
13136: InvalidInstruction(2);
13137: break;
13138: }
13139: case 0xd7:
13140: {
13141: InvalidInstruction(2);
13142: break;
13143: }
13144: case 0xd8:
13145: {
13146: InvalidInstruction(2);
13147: break;
13148: }
13149: case 0xd9:
13150: {
13151: InvalidInstruction(2);
13152: break;
13153: }
13154: case 0xda:
13155: {
13156: InvalidInstruction(2);
13157: break;
13158: }
13159: case 0xdb:
13160: {
13161: InvalidInstruction(2);
13162: break;
13163: }
13164: case 0xdc:
13165: {
13166: InvalidInstruction(2);
13167: break;
13168: }
13169: case 0xdd:
13170: {
13171: InvalidInstruction(2);
13172: break;
13173: }
13174: case 0xde:
13175: {
13176: InvalidInstruction(2);
13177: break;
13178: }
13179: case 0xdf:
13180: {
13181: InvalidInstruction(2);
13182: break;
13183: }
13184: case 0xe0:
13185: {
13186: InvalidInstruction(2);
13187: break;
13188: }
13189: case 0xe1:
13190: {
13191: sdwCyclesRemaining -= 14;
13192: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
13193: while (psMemRead->lowAddr != 0xffffffff)
13194: {
13195: if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
13196: {
13197: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13198: if (psMemRead->memoryCall)
13199: {
13200: cpu.z80IY = psMemRead->memoryCall(cpu.z80sp, psMemRead);
13201: cpu.z80IY |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
13202: }
13203: else
13204: {
13205: cpu.z80IY = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
13206: cpu.z80IY |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
13207: }
13208: psMemRead = NULL;
13209: break;
13210: }
13211: ++psMemRead;
13212: }
13213:
13214: if (psMemRead)
13215: {
13216: cpu.z80IY = cpu.z80Base[cpu.z80sp];
13217: cpu.z80IY |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
13218: }
13219:
13220: cpu.z80sp += 2;
13221: pbSP = (cpu.z80Base + cpu.z80sp); /* Normalize the stack pointer */
13222: break;
13223: }
13224: case 0xe2:
13225: {
13226: InvalidInstruction(2);
13227: break;
13228: }
13229: case 0xe3:
13230: {
13231: sdwCyclesRemaining -= 23;
13232: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
13233: while (psMemRead->lowAddr != 0xffffffff)
13234: {
13235: if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
13236: {
13237: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13238: if (psMemRead->memoryCall)
13239: {
13240: dwAddr = psMemRead->memoryCall(cpu.z80sp, psMemRead);
13241: dwAddr |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
13242: }
13243: else
13244: {
13245: dwAddr = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
13246: dwAddr |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
13247: }
13248: psMemRead = NULL;
13249: break;
13250: }
13251: ++psMemRead;
13252: }
13253:
13254: if (psMemRead)
13255: {
13256: dwAddr = cpu.z80Base[cpu.z80sp];
13257: dwAddr |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
13258: }
13259:
13260: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
13261: while (psMemWrite->lowAddr != 0xffffffff)
13262: {
13263: if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
13264: {
13265: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13266: if (psMemWrite->memoryCall)
13267: {
13268: psMemWrite->memoryCall(cpu.z80sp, (cpu.z80IY & 0xff), psMemWrite);
13269: psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80IY >> 8), psMemWrite);
13270: }
13271: else
13272: {
13273: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80IY;
13274: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80IY >> 8;
13275: }
13276: psMemWrite = NULL;
13277: break;
13278: }
13279: ++psMemWrite;
13280: }
13281:
13282: if (psMemWrite)
13283: {
13284: cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80IY;
13285: cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80IY >> 8);
13286: }
13287:
13288: cpu.z80IY = dwAddr;
13289: break;
13290: }
13291: case 0xe4:
13292: {
13293: InvalidInstruction(2);
13294: break;
13295: }
13296: case 0xe5:
13297: {
13298: sdwCyclesRemaining -= 15;
13299: cpu.z80sp -= 2;
13300: pbSP = (cpu.z80Base + cpu.z80sp); /* Normalize the stack pointer */
13301: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
13302: while (psMemWrite->lowAddr != 0xffffffff)
13303: {
13304: if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
13305: {
13306: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13307: if (psMemWrite->memoryCall)
13308: {
13309: psMemWrite->memoryCall(cpu.z80sp, (cpu.z80IY & 0xff), psMemWrite);
13310: psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80IY >> 8), psMemWrite);
13311: }
13312: else
13313: {
13314: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80IY;
13315: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80IY >> 8;
13316: }
13317: psMemWrite = NULL;
13318: break;
13319: }
13320: ++psMemWrite;
13321: }
13322:
13323: if (psMemWrite)
13324: {
13325: cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80IY;
13326: cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80IY >> 8);
13327: }
13328:
13329: break;
13330: }
13331: case 0xe6:
13332: {
13333: InvalidInstruction(2);
13334: break;
13335: }
13336: case 0xe7:
13337: {
13338: InvalidInstruction(2);
13339: break;
13340: }
13341: case 0xe8:
13342: {
13343: InvalidInstruction(2);
13344: break;
13345: }
13346: case 0xe9:
13347: {
13348: sdwCyclesRemaining -= 8;
13349: pbPC = cpu.z80Base + cpu.z80IY;
13350: break;
13351: }
13352: case 0xea:
13353: {
13354: InvalidInstruction(2);
13355: break;
13356: }
13357: case 0xeb:
13358: {
13359: InvalidInstruction(2);
13360: break;
13361: }
13362: case 0xec:
13363: {
13364: InvalidInstruction(2);
13365: break;
13366: }
13367: case 0xed:
13368: {
13369: InvalidInstruction(2);
13370: break;
13371: }
13372: case 0xee:
13373: {
13374: InvalidInstruction(2);
13375: break;
13376: }
13377: case 0xef:
13378: {
13379: InvalidInstruction(2);
13380: break;
13381: }
13382: case 0xf0:
13383: {
13384: InvalidInstruction(2);
13385: break;
13386: }
13387: case 0xf1:
13388: {
13389: InvalidInstruction(2);
13390: break;
13391: }
13392: case 0xf2:
13393: {
13394: InvalidInstruction(2);
13395: break;
13396: }
13397: case 0xf3:
13398: {
13399: InvalidInstruction(2);
13400: break;
13401: }
13402: case 0xf4:
13403: {
13404: InvalidInstruction(2);
13405: break;
13406: }
13407: case 0xf5:
13408: {
13409: InvalidInstruction(2);
13410: break;
13411: }
13412: case 0xf6:
13413: {
13414: InvalidInstruction(2);
13415: break;
13416: }
13417: case 0xf7:
13418: {
13419: InvalidInstruction(2);
13420: break;
13421: }
13422: case 0xf8:
13423: {
13424: InvalidInstruction(2);
13425: break;
13426: }
13427: case 0xf9:
13428: {
13429: sdwCyclesRemaining -= 10;
13430: cpu.z80sp = cpu.z80IY;
13431: break;
13432: }
13433: case 0xfa:
13434: {
13435: InvalidInstruction(2);
13436: break;
13437: }
13438: case 0xfb:
13439: {
13440: InvalidInstruction(2);
13441: break;
13442: }
13443: case 0xfc:
13444: {
13445: InvalidInstruction(2);
13446: break;
13447: }
13448: case 0xfd:
13449: {
13450: InvalidInstruction(2);
13451: break;
13452: }
13453: case 0xfe:
13454: {
13455: InvalidInstruction(2);
13456: break;
13457: }
13458: case 0xff:
13459: {
13460: InvalidInstruction(2);
13461: break;
13462: }
13463: }
13464: }
13465: /* Main execution entry point */
13466:
13467: UINT32 mz80exec(UINT32 dwCycles)
13468: {
13469: UINT8 bOpcode;
13470:
13471: dwReturnCode = 0x80000000; /* Assume it'll work */
13472: sdwCyclesRemaining = dwCycles;
13473: dwOriginalCycles = dwCycles;
13474: if (cpu.z80halted)
13475: {
13476: dwElapsedTicks += dwCycles;
13477: return(0x80000000);
13478: }
13479:
13480: pbPC = cpu.z80Base + cpu.z80pc;
13481:
13482: while (sdwCyclesRemaining > 0)
13483: {
13484: bOpcode = *pbPC++;
13485: switch (bOpcode)
13486: {
13487: case 0x00:
13488: {
13489: sdwCyclesRemaining -= 4;
13490: /* Intentionally not doing anything - NOP! */
13491: break;
13492: }
13493: case 0x01:
13494: {
13495: sdwCyclesRemaining -= 10;
13496: cpu.z80BC = *pbPC++; /* LSB First */
13497: cpu.z80BC |= (((UINT32) *pbPC++ << 8)); /* Now the MSB */
13498: break;
13499: }
13500: case 0x02:
13501: {
13502: sdwCyclesRemaining -= 7;
13503: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
13504: while (psMemWrite->lowAddr != 0xffffffff)
13505: {
13506: if ((cpu.z80BC >= psMemWrite->lowAddr) && (cpu.z80BC <= psMemWrite->highAddr))
13507: {
13508: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13509: if (psMemWrite->memoryCall)
13510: {
13511: psMemWrite->memoryCall(cpu.z80BC, cpu.z80A, psMemWrite);
13512: }
13513: else
13514: {
13515: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80BC - psMemWrite->lowAddr)) = cpu.z80A;
13516: }
13517: psMemWrite = NULL;
13518: break;
13519: }
13520: ++psMemWrite;
13521: }
13522:
13523: if (psMemWrite)
13524: {
13525: cpu.z80Base[cpu.z80BC] = (UINT8) cpu.z80A;
13526: }
13527:
13528: break;
13529: }
13530: case 0x03:
13531: {
13532: sdwCyclesRemaining -= 6;
13533: cpu.z80BC++;
13534: cpu.z80BC &= 0xffff;
13535: break;
13536: }
13537: case 0x04:
13538: {
13539: sdwCyclesRemaining -= 4;
13540: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
13541: cpu.z80F |= bPostIncFlags[cpu.z80B++];
13542: break;
13543: }
13544: case 0x05:
13545: {
13546: sdwCyclesRemaining -= 4;
13547: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
13548: cpu.z80F |= bPostDecFlags[cpu.z80B--];
13549: break;
13550: }
13551: case 0x06:
13552: {
13553: sdwCyclesRemaining -= 7;
13554: cpu.z80B = *pbPC++; /* Get immediate byte into register */
13555: break;
13556: }
13557: case 0x07:
13558: {
13559: sdwCyclesRemaining -= 4;
13560: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
13561: cpu.z80F |= (cpu.z80A >> 7);
13562: cpu.z80A = (cpu.z80A << 1) | (cpu.z80A >> 7);
13563: break;
13564: }
13565: case 0x08:
13566: {
13567: sdwCyclesRemaining -= 4;
13568: dwAddr = (UINT32) cpu.z80AF;
13569: cpu.z80AF = cpu.z80afprime;
13570: cpu.z80afprime = dwAddr;
13571: break;
13572: }
13573: case 0x09:
13574: {
13575: sdwCyclesRemaining -= 11;
13576: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
13577: dwTemp = cpu.z80HL + cpu.z80BC;
13578: cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80HL ^ dwTemp ^ cpu.z80BC) >> 8) & Z80_FLAG_HALF_CARRY);
13579: cpu.z80HL = dwTemp & 0xffff;
13580: break;
13581: }
13582: case 0x0a:
13583: {
13584: sdwCyclesRemaining -= 7;
13585: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
13586: while (psMemRead->lowAddr != 0xffffffff)
13587: {
13588: if ((cpu.z80BC >= psMemRead->lowAddr) && (cpu.z80BC <= psMemRead->highAddr))
13589: {
13590: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13591: if (psMemRead->memoryCall)
13592: {
13593: cpu.z80A = psMemRead->memoryCall(cpu.z80BC, psMemRead);
13594: }
13595: else
13596: {
13597: cpu.z80A = *((UINT8 *) psMemRead->pUserArea + (cpu.z80BC - psMemRead->lowAddr));
13598: }
13599: psMemRead = NULL;
13600: break;
13601: }
13602: ++psMemRead;
13603: }
13604:
13605: if (psMemRead)
13606: {
13607: cpu.z80A = cpu.z80Base[cpu.z80BC];
13608: }
13609:
13610: break;
13611: }
13612: case 0x0b:
13613: {
13614: sdwCyclesRemaining -= 6;
13615: cpu.z80BC--;
13616: cpu.z80BC &= 0xffff;
13617: break;
13618: }
13619: case 0x0c:
13620: {
13621: sdwCyclesRemaining -= 4;
13622: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
13623: cpu.z80F |= bPostIncFlags[cpu.z80C++];
13624: break;
13625: }
13626: case 0x0d:
13627: {
13628: sdwCyclesRemaining -= 4;
13629: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
13630: cpu.z80F |= bPostDecFlags[cpu.z80C--];
13631: break;
13632: }
13633: case 0x0e:
13634: {
13635: sdwCyclesRemaining -= 7;
13636: cpu.z80C = *pbPC++; /* Get immediate byte into register */
13637: break;
13638: }
13639: case 0x0f:
13640: {
13641: sdwCyclesRemaining -= 4;
13642: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
13643: cpu.z80F |= (cpu.z80A & Z80_FLAG_CARRY);
13644: cpu.z80A = (cpu.z80A >> 1) | (cpu.z80A << 7);
13645: break;
13646: }
13647: case 0x10:
13648: {
13649: sdwCyclesRemaining -= 8;
13650: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
13651: if (--cpu.z80B)
13652: {
13653: dwElapsedTicks += 5; /* 5 More for jump taken */
13654: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13655: sdwAddr = (sdwAddr + (INT32) cpu.z80pc) & 0xffff;
13656: pbPC = cpu.z80Base + sdwAddr; /* Normalize the address */
13657: }
13658: break;
13659: }
13660: case 0x11:
13661: {
13662: sdwCyclesRemaining -= 10;
13663: cpu.z80DE = *pbPC++; /* LSB First */
13664: cpu.z80DE |= (((UINT32) *pbPC++ << 8)); /* Now the MSB */
13665: break;
13666: }
13667: case 0x12:
13668: {
13669: sdwCyclesRemaining -= 7;
13670: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
13671: while (psMemWrite->lowAddr != 0xffffffff)
13672: {
13673: if ((cpu.z80DE >= psMemWrite->lowAddr) && (cpu.z80DE <= psMemWrite->highAddr))
13674: {
13675: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13676: if (psMemWrite->memoryCall)
13677: {
13678: psMemWrite->memoryCall(cpu.z80DE, cpu.z80A, psMemWrite);
13679: }
13680: else
13681: {
13682: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80DE - psMemWrite->lowAddr)) = cpu.z80A;
13683: }
13684: psMemWrite = NULL;
13685: break;
13686: }
13687: ++psMemWrite;
13688: }
13689:
13690: if (psMemWrite)
13691: {
13692: cpu.z80Base[cpu.z80DE] = (UINT8) cpu.z80A;
13693: }
13694:
13695: break;
13696: }
13697: case 0x13:
13698: {
13699: sdwCyclesRemaining -= 6;
13700: cpu.z80DE++;
13701: cpu.z80DE &= 0xffff;
13702: break;
13703: }
13704: case 0x14:
13705: {
13706: sdwCyclesRemaining -= 4;
13707: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
13708: cpu.z80F |= bPostIncFlags[cpu.z80D++];
13709: break;
13710: }
13711: case 0x15:
13712: {
13713: sdwCyclesRemaining -= 4;
13714: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
13715: cpu.z80F |= bPostDecFlags[cpu.z80D--];
13716: break;
13717: }
13718: case 0x16:
13719: {
13720: sdwCyclesRemaining -= 7;
13721: cpu.z80D = *pbPC++; /* Get immediate byte into register */
13722: break;
13723: }
13724: case 0x17:
13725: {
13726: sdwCyclesRemaining -= 4;
13727: bTemp = cpu.z80A >> 7;
13728: cpu.z80A = (cpu.z80A << 1) | (cpu.z80F & Z80_FLAG_CARRY);
13729: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY)) | bTemp;
13730: break;
13731: }
13732: case 0x18:
13733: {
13734: sdwCyclesRemaining -= 12;
13735: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
13736: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13737: sdwAddr = (sdwAddr + (INT32) cpu.z80pc) & 0xffff;
13738: {
13739: sdwCyclesRemaining -= 5;
13740: pbPC = cpu.z80Base + sdwAddr; /* Normalize the address */
13741: }
13742: break;
13743: }
13744: case 0x19:
13745: {
13746: sdwCyclesRemaining -= 11;
13747: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
13748: dwTemp = cpu.z80HL + cpu.z80DE;
13749: cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80HL ^ dwTemp ^ cpu.z80DE) >> 8) & Z80_FLAG_HALF_CARRY);
13750: cpu.z80HL = dwTemp & 0xffff;
13751: break;
13752: }
13753: case 0x1a:
13754: {
13755: sdwCyclesRemaining -= 7;
13756: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
13757: while (psMemRead->lowAddr != 0xffffffff)
13758: {
13759: if ((cpu.z80DE >= psMemRead->lowAddr) && (cpu.z80DE <= psMemRead->highAddr))
13760: {
13761: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13762: if (psMemRead->memoryCall)
13763: {
13764: cpu.z80A = psMemRead->memoryCall(cpu.z80DE, psMemRead);
13765: }
13766: else
13767: {
13768: cpu.z80A = *((UINT8 *) psMemRead->pUserArea + (cpu.z80DE - psMemRead->lowAddr));
13769: }
13770: psMemRead = NULL;
13771: break;
13772: }
13773: ++psMemRead;
13774: }
13775:
13776: if (psMemRead)
13777: {
13778: cpu.z80A = cpu.z80Base[cpu.z80DE];
13779: }
13780:
13781: break;
13782: }
13783: case 0x1b:
13784: {
13785: sdwCyclesRemaining -= 6;
13786: cpu.z80DE--;
13787: cpu.z80DE &= 0xffff;
13788: break;
13789: }
13790: case 0x1c:
13791: {
13792: sdwCyclesRemaining -= 4;
13793: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
13794: cpu.z80F |= bPostIncFlags[cpu.z80E++];
13795: break;
13796: }
13797: case 0x1d:
13798: {
13799: sdwCyclesRemaining -= 4;
13800: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
13801: cpu.z80F |= bPostDecFlags[cpu.z80E--];
13802: break;
13803: }
13804: case 0x1e:
13805: {
13806: sdwCyclesRemaining -= 7;
13807: cpu.z80E = *pbPC++; /* Get immediate byte into register */
13808: break;
13809: }
13810: case 0x1f:
13811: {
13812: sdwCyclesRemaining -= 4;
13813: bTemp = (cpu.z80F & Z80_FLAG_CARRY) << 7;
13814: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY)) | (cpu.z80A & Z80_FLAG_CARRY);
13815: cpu.z80A = ((cpu.z80A >> 1) | bTemp);
13816: break;
13817: }
13818: case 0x20:
13819: {
13820: sdwCyclesRemaining -= 7;
13821: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
13822: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13823: sdwAddr = (sdwAddr + (INT32) cpu.z80pc) & 0xffff;
13824: if (!(cpu.z80F & Z80_FLAG_ZERO))
13825: {
13826: sdwCyclesRemaining -= 5;
13827: pbPC = cpu.z80Base + sdwAddr; /* Normalize the address */
13828: }
13829: break;
13830: }
13831: case 0x21:
13832: {
13833: sdwCyclesRemaining -= 10;
13834: cpu.z80HL = *pbPC++; /* LSB First */
13835: cpu.z80HL |= (((UINT32) *pbPC++ << 8)); /* Now the MSB */
13836: break;
13837: }
13838: case 0x22:
13839: {
13840: sdwCyclesRemaining -= 16;
13841: dwTemp = *pbPC++;
13842: dwTemp |= ((UINT32) *pbPC++ << 8);
13843: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
13844: while (psMemWrite->lowAddr != 0xffffffff)
13845: {
13846: if ((dwTemp >= psMemWrite->lowAddr) && (dwTemp <= psMemWrite->highAddr))
13847: {
13848: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13849: if (psMemWrite->memoryCall)
13850: {
13851: psMemWrite->memoryCall(dwTemp, (cpu.z80HL & 0xff), psMemWrite);
13852: psMemWrite->memoryCall(dwTemp + 1, (cpu.z80HL >> 8), psMemWrite);
13853: }
13854: else
13855: {
13856: *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr)) = cpu.z80HL;
13857: *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr) + 1) = cpu.z80HL >> 8;
13858: }
13859: psMemWrite = NULL;
13860: break;
13861: }
13862: ++psMemWrite;
13863: }
13864:
13865: if (psMemWrite)
13866: {
13867: cpu.z80Base[dwTemp] = (UINT8) cpu.z80HL;
13868: cpu.z80Base[dwTemp + 1] = (UINT8) ((UINT32) cpu.z80HL >> 8);
13869: }
13870:
13871: break;
13872: }
13873: case 0x23:
13874: {
13875: sdwCyclesRemaining -= 6;
13876: cpu.z80HL++;
13877: cpu.z80HL &= 0xffff;
13878: break;
13879: }
13880: case 0x24:
13881: {
13882: sdwCyclesRemaining -= 4;
13883: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
13884: cpu.z80F |= bPostIncFlags[cpu.z80H++];
13885: break;
13886: }
13887: case 0x25:
13888: {
13889: sdwCyclesRemaining -= 4;
13890: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
13891: cpu.z80F |= bPostDecFlags[cpu.z80H--];
13892: break;
13893: }
13894: case 0x26:
13895: {
13896: sdwCyclesRemaining -= 7;
13897: cpu.z80H = *pbPC++; /* Get immediate byte into register */
13898: break;
13899: }
13900: case 0x27:
13901: {
13902: sdwCyclesRemaining -= 4;
13903: dwAddr = (((cpu.z80F & Z80_FLAG_CARRY) |
13904: ((cpu.z80F & Z80_FLAG_HALF_CARRY) >> 3) |
13905: ((cpu.z80F & Z80_FLAG_NEGATIVE) << 1)) << 8) | cpu.z80A;
13906: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
13907: cpu.z80F |= (wDAATable[dwAddr] >> 8);
13908: cpu.z80A = wDAATable[dwAddr] & 0xff;
13909: break;
13910: }
13911: case 0x28:
13912: {
13913: sdwCyclesRemaining -= 7;
13914: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
13915: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13916: sdwAddr = (sdwAddr + (INT32) cpu.z80pc) & 0xffff;
13917: if (cpu.z80F & Z80_FLAG_ZERO)
13918: {
13919: sdwCyclesRemaining -= 5;
13920: pbPC = cpu.z80Base + sdwAddr; /* Normalize the address */
13921: }
13922: break;
13923: }
13924: case 0x29:
13925: {
13926: sdwCyclesRemaining -= 11;
13927: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
13928: dwTemp = cpu.z80HL + cpu.z80HL;
13929: cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80HL ^ dwTemp ^ cpu.z80HL) >> 8) & Z80_FLAG_HALF_CARRY);
13930: cpu.z80HL = dwTemp & 0xffff;
13931: break;
13932: }
13933: case 0x2a:
13934: {
13935: sdwCyclesRemaining -= 16;
13936: dwAddr = *pbPC++;
13937: dwAddr |= ((UINT32) *pbPC++ << 8);
13938: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
13939: while (psMemRead->lowAddr != 0xffffffff)
13940: {
13941: if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
13942: {
13943: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
13944: if (psMemRead->memoryCall)
13945: {
13946: cpu.z80HL = psMemRead->memoryCall(dwAddr, psMemRead);
13947: cpu.z80HL |= (UINT32) ((UINT32) psMemRead->memoryCall(dwAddr + 1, psMemRead) << 8);
13948: }
13949: else
13950: {
13951: cpu.z80HL = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
13952: cpu.z80HL |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr + 1)) << 8);
13953: }
13954: psMemRead = NULL;
13955: break;
13956: }
13957: ++psMemRead;
13958: }
13959:
13960: if (psMemRead)
13961: {
13962: cpu.z80HL = cpu.z80Base[dwAddr];
13963: cpu.z80HL |= (UINT32) ((UINT32) cpu.z80Base[dwAddr + 1] << 8);
13964: }
13965:
13966: break;
13967: }
13968: case 0x2b:
13969: {
13970: sdwCyclesRemaining -= 6;
13971: cpu.z80HL--;
13972: cpu.z80HL &= 0xffff;
13973: break;
13974: }
13975: case 0x2c:
13976: {
13977: sdwCyclesRemaining -= 4;
13978: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
13979: cpu.z80F |= bPostIncFlags[cpu.z80L++];
13980: break;
13981: }
13982: case 0x2d:
13983: {
13984: sdwCyclesRemaining -= 4;
13985: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
13986: cpu.z80F |= bPostDecFlags[cpu.z80L--];
13987: break;
13988: }
13989: case 0x2e:
13990: {
13991: sdwCyclesRemaining -= 7;
13992: cpu.z80L = *pbPC++; /* Get immediate byte into register */
13993: break;
13994: }
13995: case 0x2f:
13996: {
13997: sdwCyclesRemaining -= 4;
13998: cpu.z80A ^= 0xff;
13999: cpu.z80F |= (Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
14000: break;
14001: }
14002: case 0x30:
14003: {
14004: sdwCyclesRemaining -= 7;
14005: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
14006: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14007: sdwAddr = (sdwAddr + (INT32) cpu.z80pc) & 0xffff;
14008: if (!(cpu.z80F & Z80_FLAG_CARRY))
14009: {
14010: sdwCyclesRemaining -= 5;
14011: pbPC = cpu.z80Base + sdwAddr; /* Normalize the address */
14012: }
14013: break;
14014: }
14015: case 0x31:
14016: {
14017: sdwCyclesRemaining -= 10;
14018: cpu.z80sp = *pbPC++; /* LSB First */
14019: cpu.z80sp |= (((UINT32) *pbPC++ << 8)); /* Now the MSB */
14020: break;
14021: }
14022: case 0x32:
14023: {
14024: sdwCyclesRemaining -= 13;
14025: dwTemp = *pbPC++;
14026: dwTemp |= ((UINT32) *pbPC++ << 8);
14027: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
14028: while (psMemWrite->lowAddr != 0xffffffff)
14029: {
14030: if ((dwTemp >= psMemWrite->lowAddr) && (dwTemp <= psMemWrite->highAddr))
14031: {
14032: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14033: if (psMemWrite->memoryCall)
14034: {
14035: psMemWrite->memoryCall(dwTemp, cpu.z80A, psMemWrite);
14036: }
14037: else
14038: {
14039: *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr)) = cpu.z80A;
14040: }
14041: psMemWrite = NULL;
14042: break;
14043: }
14044: ++psMemWrite;
14045: }
14046:
14047: if (psMemWrite)
14048: {
14049: cpu.z80Base[dwTemp] = (UINT8) cpu.z80A;
14050: }
14051:
14052: break;
14053: }
14054: case 0x33:
14055: {
14056: sdwCyclesRemaining -= 6;
14057: cpu.z80sp++;
14058: cpu.z80sp &= 0xffff;
14059: break;
14060: }
14061: case 0x34:
14062: {
14063: sdwCyclesRemaining -= 11;
14064: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
14065: while (psMemRead->lowAddr != 0xffffffff)
14066: {
14067: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
14068: {
14069: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14070: if (psMemRead->memoryCall)
14071: {
14072: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
14073: }
14074: else
14075: {
14076: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
14077: }
14078: psMemRead = NULL;
14079: break;
14080: }
14081: ++psMemRead;
14082: }
14083:
14084: if (psMemRead)
14085: {
14086: bTemp = cpu.z80Base[cpu.z80HL];
14087: }
14088:
14089: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
14090: cpu.z80F |= bPostIncFlags[bTemp];
14091: bTemp++;
14092: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
14093: while (psMemWrite->lowAddr != 0xffffffff)
14094: {
14095: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
14096: {
14097: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14098: if (psMemWrite->memoryCall)
14099: {
14100: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
14101: }
14102: else
14103: {
14104: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
14105: }
14106: psMemWrite = NULL;
14107: break;
14108: }
14109: ++psMemWrite;
14110: }
14111:
14112: if (psMemWrite)
14113: {
14114: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
14115: }
14116:
14117: break;
14118: }
14119: case 0x35:
14120: {
14121: sdwCyclesRemaining -= 11;
14122: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
14123: while (psMemRead->lowAddr != 0xffffffff)
14124: {
14125: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
14126: {
14127: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14128: if (psMemRead->memoryCall)
14129: {
14130: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
14131: }
14132: else
14133: {
14134: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
14135: }
14136: psMemRead = NULL;
14137: break;
14138: }
14139: ++psMemRead;
14140: }
14141:
14142: if (psMemRead)
14143: {
14144: bTemp = cpu.z80Base[cpu.z80HL];
14145: }
14146:
14147: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
14148: cpu.z80F |= bPostDecFlags[bTemp];
14149: bTemp--;
14150: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
14151: while (psMemWrite->lowAddr != 0xffffffff)
14152: {
14153: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
14154: {
14155: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14156: if (psMemWrite->memoryCall)
14157: {
14158: psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
14159: }
14160: else
14161: {
14162: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
14163: }
14164: psMemWrite = NULL;
14165: break;
14166: }
14167: ++psMemWrite;
14168: }
14169:
14170: if (psMemWrite)
14171: {
14172: cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
14173: }
14174:
14175: break;
14176: }
14177: case 0x36:
14178: {
14179: sdwCyclesRemaining -= 10;
14180: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
14181: while (psMemWrite->lowAddr != 0xffffffff)
14182: {
14183: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
14184: {
14185: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14186: if (psMemWrite->memoryCall)
14187: {
14188: psMemWrite->memoryCall(cpu.z80HL, *pbPC++, psMemWrite);
14189: }
14190: else
14191: {
14192: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = *pbPC++;
14193: }
14194: psMemWrite = NULL;
14195: break;
14196: }
14197: ++psMemWrite;
14198: }
14199:
14200: if (psMemWrite)
14201: {
14202: cpu.z80Base[cpu.z80HL] = (UINT8) *pbPC++;
14203: }
14204:
14205: break;
14206: }
14207: case 0x37:
14208: {
14209: sdwCyclesRemaining -= 4;
14210: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE);
14211: cpu.z80F |= Z80_FLAG_CARRY;
14212: break;
14213: }
14214: case 0x38:
14215: {
14216: sdwCyclesRemaining -= 7;
14217: sdwAddr = (INT8) *pbPC++; /* Get LSB first */
14218: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14219: sdwAddr = (sdwAddr + (INT32) cpu.z80pc) & 0xffff;
14220: if (cpu.z80F & Z80_FLAG_CARRY)
14221: {
14222: sdwCyclesRemaining -= 5;
14223: pbPC = cpu.z80Base + sdwAddr; /* Normalize the address */
14224: }
14225: break;
14226: }
14227: case 0x39:
14228: {
14229: sdwCyclesRemaining -= 11;
14230: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
14231: dwTemp = cpu.z80HL + cpu.z80sp;
14232: cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80HL ^ dwTemp ^ cpu.z80sp) >> 8) & Z80_FLAG_HALF_CARRY);
14233: cpu.z80HL = dwTemp & 0xffff;
14234: break;
14235: }
14236: case 0x3a:
14237: {
14238: sdwCyclesRemaining -= 13;
14239: dwTemp = *pbPC++;
14240: dwTemp |= (((UINT32) *pbPC++) << 8);
14241: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
14242: while (psMemRead->lowAddr != 0xffffffff)
14243: {
14244: if ((dwTemp >= psMemRead->lowAddr) && (dwTemp <= psMemRead->highAddr))
14245: {
14246: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14247: if (psMemRead->memoryCall)
14248: {
14249: cpu.z80A = psMemRead->memoryCall(dwTemp, psMemRead);
14250: }
14251: else
14252: {
14253: cpu.z80A = *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr));
14254: }
14255: psMemRead = NULL;
14256: break;
14257: }
14258: ++psMemRead;
14259: }
14260:
14261: if (psMemRead)
14262: {
14263: cpu.z80A = cpu.z80Base[dwTemp];
14264: }
14265:
14266: break;
14267: }
14268: case 0x3b:
14269: {
14270: sdwCyclesRemaining -= 6;
14271: cpu.z80sp--;
14272: cpu.z80sp &= 0xffff;
14273: break;
14274: }
14275: case 0x3c:
14276: {
14277: sdwCyclesRemaining -= 4;
14278: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
14279: cpu.z80F |= bPostIncFlags[cpu.z80A++];
14280: break;
14281: }
14282: case 0x3d:
14283: {
14284: sdwCyclesRemaining -= 4;
14285: cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
14286: cpu.z80F |= bPostDecFlags[cpu.z80A--];
14287: break;
14288: }
14289: case 0x3e:
14290: {
14291: sdwCyclesRemaining -= 7;
14292: cpu.z80A = *pbPC++; /* Get immediate byte into register */
14293: break;
14294: }
14295: case 0x3f:
14296: {
14297: sdwCyclesRemaining -= 4;
14298: bTemp = (cpu.z80F & Z80_FLAG_CARRY) << 4;
14299: cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE);
14300: cpu.z80F ^= Z80_FLAG_CARRY;
14301: break;
14302: }
14303: case 0x40:
14304: {
14305: sdwCyclesRemaining -= 4;
14306: break;
14307: }
14308: case 0x41:
14309: {
14310: sdwCyclesRemaining -= 4;
14311: cpu.z80B = cpu.z80C;
14312: break;
14313: }
14314: case 0x42:
14315: {
14316: sdwCyclesRemaining -= 4;
14317: cpu.z80B = cpu.z80D;
14318: break;
14319: }
14320: case 0x43:
14321: {
14322: sdwCyclesRemaining -= 4;
14323: cpu.z80B = cpu.z80E;
14324: break;
14325: }
14326: case 0x44:
14327: {
14328: sdwCyclesRemaining -= 4;
14329: cpu.z80B = cpu.z80H;
14330: break;
14331: }
14332: case 0x45:
14333: {
14334: sdwCyclesRemaining -= 4;
14335: cpu.z80B = cpu.z80L;
14336: break;
14337: }
14338: case 0x46:
14339: {
14340: sdwCyclesRemaining -= 7;
14341: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
14342: while (psMemRead->lowAddr != 0xffffffff)
14343: {
14344: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
14345: {
14346: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14347: if (psMemRead->memoryCall)
14348: {
14349: cpu.z80B = psMemRead->memoryCall(cpu.z80HL, psMemRead);
14350: }
14351: else
14352: {
14353: cpu.z80B = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
14354: }
14355: psMemRead = NULL;
14356: break;
14357: }
14358: ++psMemRead;
14359: }
14360:
14361: if (psMemRead)
14362: {
14363: cpu.z80B = cpu.z80Base[cpu.z80HL];
14364: }
14365:
14366: break;
14367: }
14368: case 0x47:
14369: {
14370: sdwCyclesRemaining -= 4;
14371: cpu.z80B = cpu.z80A;
14372: break;
14373: }
14374: case 0x48:
14375: {
14376: sdwCyclesRemaining -= 4;
14377: cpu.z80C = cpu.z80B;
14378: break;
14379: }
14380: case 0x49:
14381: {
14382: sdwCyclesRemaining -= 4;
14383: break;
14384: }
14385: case 0x4a:
14386: {
14387: sdwCyclesRemaining -= 4;
14388: cpu.z80C = cpu.z80D;
14389: break;
14390: }
14391: case 0x4b:
14392: {
14393: sdwCyclesRemaining -= 4;
14394: cpu.z80C = cpu.z80E;
14395: break;
14396: }
14397: case 0x4c:
14398: {
14399: sdwCyclesRemaining -= 4;
14400: cpu.z80C = cpu.z80H;
14401: break;
14402: }
14403: case 0x4d:
14404: {
14405: sdwCyclesRemaining -= 4;
14406: cpu.z80C = cpu.z80L;
14407: break;
14408: }
14409: case 0x4e:
14410: {
14411: sdwCyclesRemaining -= 7;
14412: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
14413: while (psMemRead->lowAddr != 0xffffffff)
14414: {
14415: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
14416: {
14417: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14418: if (psMemRead->memoryCall)
14419: {
14420: cpu.z80C = psMemRead->memoryCall(cpu.z80HL, psMemRead);
14421: }
14422: else
14423: {
14424: cpu.z80C = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
14425: }
14426: psMemRead = NULL;
14427: break;
14428: }
14429: ++psMemRead;
14430: }
14431:
14432: if (psMemRead)
14433: {
14434: cpu.z80C = cpu.z80Base[cpu.z80HL];
14435: }
14436:
14437: break;
14438: }
14439: case 0x4f:
14440: {
14441: sdwCyclesRemaining -= 4;
14442: cpu.z80C = cpu.z80A;
14443: break;
14444: }
14445: case 0x50:
14446: {
14447: sdwCyclesRemaining -= 4;
14448: cpu.z80D = cpu.z80B;
14449: break;
14450: }
14451: case 0x51:
14452: {
14453: sdwCyclesRemaining -= 4;
14454: cpu.z80D = cpu.z80C;
14455: break;
14456: }
14457: case 0x52:
14458: {
14459: sdwCyclesRemaining -= 4;
14460: break;
14461: }
14462: case 0x53:
14463: {
14464: sdwCyclesRemaining -= 4;
14465: cpu.z80D = cpu.z80E;
14466: break;
14467: }
14468: case 0x54:
14469: {
14470: sdwCyclesRemaining -= 4;
14471: cpu.z80D = cpu.z80H;
14472: break;
14473: }
14474: case 0x55:
14475: {
14476: sdwCyclesRemaining -= 4;
14477: cpu.z80D = cpu.z80L;
14478: break;
14479: }
14480: case 0x56:
14481: {
14482: sdwCyclesRemaining -= 7;
14483: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
14484: while (psMemRead->lowAddr != 0xffffffff)
14485: {
14486: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
14487: {
14488: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14489: if (psMemRead->memoryCall)
14490: {
14491: cpu.z80D = psMemRead->memoryCall(cpu.z80HL, psMemRead);
14492: }
14493: else
14494: {
14495: cpu.z80D = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
14496: }
14497: psMemRead = NULL;
14498: break;
14499: }
14500: ++psMemRead;
14501: }
14502:
14503: if (psMemRead)
14504: {
14505: cpu.z80D = cpu.z80Base[cpu.z80HL];
14506: }
14507:
14508: break;
14509: }
14510: case 0x57:
14511: {
14512: sdwCyclesRemaining -= 4;
14513: cpu.z80D = cpu.z80A;
14514: break;
14515: }
14516: case 0x58:
14517: {
14518: sdwCyclesRemaining -= 4;
14519: cpu.z80E = cpu.z80B;
14520: break;
14521: }
14522: case 0x59:
14523: {
14524: sdwCyclesRemaining -= 4;
14525: cpu.z80E = cpu.z80C;
14526: break;
14527: }
14528: case 0x5a:
14529: {
14530: sdwCyclesRemaining -= 4;
14531: cpu.z80E = cpu.z80D;
14532: break;
14533: }
14534: case 0x5b:
14535: {
14536: sdwCyclesRemaining -= 4;
14537: break;
14538: }
14539: case 0x5c:
14540: {
14541: sdwCyclesRemaining -= 4;
14542: cpu.z80E = cpu.z80H;
14543: break;
14544: }
14545: case 0x5d:
14546: {
14547: sdwCyclesRemaining -= 4;
14548: cpu.z80E = cpu.z80L;
14549: break;
14550: }
14551: case 0x5e:
14552: {
14553: sdwCyclesRemaining -= 7;
14554: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
14555: while (psMemRead->lowAddr != 0xffffffff)
14556: {
14557: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
14558: {
14559: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14560: if (psMemRead->memoryCall)
14561: {
14562: cpu.z80E = psMemRead->memoryCall(cpu.z80HL, psMemRead);
14563: }
14564: else
14565: {
14566: cpu.z80E = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
14567: }
14568: psMemRead = NULL;
14569: break;
14570: }
14571: ++psMemRead;
14572: }
14573:
14574: if (psMemRead)
14575: {
14576: cpu.z80E = cpu.z80Base[cpu.z80HL];
14577: }
14578:
14579: break;
14580: }
14581: case 0x5f:
14582: {
14583: sdwCyclesRemaining -= 4;
14584: cpu.z80E = cpu.z80A;
14585: break;
14586: }
14587: case 0x60:
14588: {
14589: sdwCyclesRemaining -= 4;
14590: cpu.z80H = cpu.z80B;
14591: break;
14592: }
14593: case 0x61:
14594: {
14595: sdwCyclesRemaining -= 4;
14596: cpu.z80H = cpu.z80C;
14597: break;
14598: }
14599: case 0x62:
14600: {
14601: sdwCyclesRemaining -= 4;
14602: cpu.z80H = cpu.z80D;
14603: break;
14604: }
14605: case 0x63:
14606: {
14607: sdwCyclesRemaining -= 4;
14608: cpu.z80H = cpu.z80E;
14609: break;
14610: }
14611: case 0x64:
14612: {
14613: sdwCyclesRemaining -= 4;
14614: break;
14615: }
14616: case 0x65:
14617: {
14618: sdwCyclesRemaining -= 4;
14619: cpu.z80H = cpu.z80L;
14620: break;
14621: }
14622: case 0x66:
14623: {
14624: sdwCyclesRemaining -= 7;
14625: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
14626: while (psMemRead->lowAddr != 0xffffffff)
14627: {
14628: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
14629: {
14630: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14631: if (psMemRead->memoryCall)
14632: {
14633: cpu.z80H = psMemRead->memoryCall(cpu.z80HL, psMemRead);
14634: }
14635: else
14636: {
14637: cpu.z80H = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
14638: }
14639: psMemRead = NULL;
14640: break;
14641: }
14642: ++psMemRead;
14643: }
14644:
14645: if (psMemRead)
14646: {
14647: cpu.z80H = cpu.z80Base[cpu.z80HL];
14648: }
14649:
14650: break;
14651: }
14652: case 0x67:
14653: {
14654: sdwCyclesRemaining -= 4;
14655: cpu.z80H = cpu.z80A;
14656: break;
14657: }
14658: case 0x68:
14659: {
14660: sdwCyclesRemaining -= 4;
14661: cpu.z80L = cpu.z80B;
14662: break;
14663: }
14664: case 0x69:
14665: {
14666: sdwCyclesRemaining -= 4;
14667: cpu.z80L = cpu.z80C;
14668: break;
14669: }
14670: case 0x6a:
14671: {
14672: sdwCyclesRemaining -= 4;
14673: cpu.z80L = cpu.z80D;
14674: break;
14675: }
14676: case 0x6b:
14677: {
14678: sdwCyclesRemaining -= 4;
14679: cpu.z80L = cpu.z80E;
14680: break;
14681: }
14682: case 0x6c:
14683: {
14684: sdwCyclesRemaining -= 4;
14685: cpu.z80L = cpu.z80H;
14686: break;
14687: }
14688: case 0x6d:
14689: {
14690: sdwCyclesRemaining -= 4;
14691: break;
14692: }
14693: case 0x6e:
14694: {
14695: sdwCyclesRemaining -= 7;
14696: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
14697: while (psMemRead->lowAddr != 0xffffffff)
14698: {
14699: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
14700: {
14701: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14702: if (psMemRead->memoryCall)
14703: {
14704: cpu.z80L = psMemRead->memoryCall(cpu.z80HL, psMemRead);
14705: }
14706: else
14707: {
14708: cpu.z80L = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
14709: }
14710: psMemRead = NULL;
14711: break;
14712: }
14713: ++psMemRead;
14714: }
14715:
14716: if (psMemRead)
14717: {
14718: cpu.z80L = cpu.z80Base[cpu.z80HL];
14719: }
14720:
14721: break;
14722: }
14723: case 0x6f:
14724: {
14725: sdwCyclesRemaining -= 4;
14726: cpu.z80L = cpu.z80A;
14727: break;
14728: }
14729: case 0x70:
14730: {
14731: sdwCyclesRemaining -= 7;
14732: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
14733: while (psMemWrite->lowAddr != 0xffffffff)
14734: {
14735: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
14736: {
14737: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14738: if (psMemWrite->memoryCall)
14739: {
14740: psMemWrite->memoryCall(cpu.z80HL, cpu.z80B, psMemWrite);
14741: }
14742: else
14743: {
14744: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80B;
14745: }
14746: psMemWrite = NULL;
14747: break;
14748: }
14749: ++psMemWrite;
14750: }
14751:
14752: if (psMemWrite)
14753: {
14754: cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80B;
14755: }
14756:
14757: break;
14758: }
14759: case 0x71:
14760: {
14761: sdwCyclesRemaining -= 7;
14762: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
14763: while (psMemWrite->lowAddr != 0xffffffff)
14764: {
14765: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
14766: {
14767: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14768: if (psMemWrite->memoryCall)
14769: {
14770: psMemWrite->memoryCall(cpu.z80HL, cpu.z80C, psMemWrite);
14771: }
14772: else
14773: {
14774: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80C;
14775: }
14776: psMemWrite = NULL;
14777: break;
14778: }
14779: ++psMemWrite;
14780: }
14781:
14782: if (psMemWrite)
14783: {
14784: cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80C;
14785: }
14786:
14787: break;
14788: }
14789: case 0x72:
14790: {
14791: sdwCyclesRemaining -= 7;
14792: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
14793: while (psMemWrite->lowAddr != 0xffffffff)
14794: {
14795: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
14796: {
14797: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14798: if (psMemWrite->memoryCall)
14799: {
14800: psMemWrite->memoryCall(cpu.z80HL, cpu.z80D, psMemWrite);
14801: }
14802: else
14803: {
14804: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80D;
14805: }
14806: psMemWrite = NULL;
14807: break;
14808: }
14809: ++psMemWrite;
14810: }
14811:
14812: if (psMemWrite)
14813: {
14814: cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80D;
14815: }
14816:
14817: break;
14818: }
14819: case 0x73:
14820: {
14821: sdwCyclesRemaining -= 7;
14822: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
14823: while (psMemWrite->lowAddr != 0xffffffff)
14824: {
14825: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
14826: {
14827: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14828: if (psMemWrite->memoryCall)
14829: {
14830: psMemWrite->memoryCall(cpu.z80HL, cpu.z80E, psMemWrite);
14831: }
14832: else
14833: {
14834: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80E;
14835: }
14836: psMemWrite = NULL;
14837: break;
14838: }
14839: ++psMemWrite;
14840: }
14841:
14842: if (psMemWrite)
14843: {
14844: cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80E;
14845: }
14846:
14847: break;
14848: }
14849: case 0x74:
14850: {
14851: sdwCyclesRemaining -= 7;
14852: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
14853: while (psMemWrite->lowAddr != 0xffffffff)
14854: {
14855: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
14856: {
14857: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14858: if (psMemWrite->memoryCall)
14859: {
14860: psMemWrite->memoryCall(cpu.z80HL, cpu.z80H, psMemWrite);
14861: }
14862: else
14863: {
14864: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80H;
14865: }
14866: psMemWrite = NULL;
14867: break;
14868: }
14869: ++psMemWrite;
14870: }
14871:
14872: if (psMemWrite)
14873: {
14874: cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80H;
14875: }
14876:
14877: break;
14878: }
14879: case 0x75:
14880: {
14881: sdwCyclesRemaining -= 7;
14882: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
14883: while (psMemWrite->lowAddr != 0xffffffff)
14884: {
14885: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
14886: {
14887: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14888: if (psMemWrite->memoryCall)
14889: {
14890: psMemWrite->memoryCall(cpu.z80HL, cpu.z80L, psMemWrite);
14891: }
14892: else
14893: {
14894: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80L;
14895: }
14896: psMemWrite = NULL;
14897: break;
14898: }
14899: ++psMemWrite;
14900: }
14901:
14902: if (psMemWrite)
14903: {
14904: cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80L;
14905: }
14906:
14907: break;
14908: }
14909: case 0x76:
14910: {
14911: sdwCyclesRemaining -= 4;
14912: cpu.z80halted = 1;
14913: dwElapsedTicks += sdwCyclesRemaining;
14914: sdwCyclesRemaining = 0;
14915: break;
14916: }
14917: case 0x77:
14918: {
14919: sdwCyclesRemaining -= 7;
14920: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
14921: while (psMemWrite->lowAddr != 0xffffffff)
14922: {
14923: if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
14924: {
14925: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14926: if (psMemWrite->memoryCall)
14927: {
14928: psMemWrite->memoryCall(cpu.z80HL, cpu.z80A, psMemWrite);
14929: }
14930: else
14931: {
14932: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80A;
14933: }
14934: psMemWrite = NULL;
14935: break;
14936: }
14937: ++psMemWrite;
14938: }
14939:
14940: if (psMemWrite)
14941: {
14942: cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80A;
14943: }
14944:
14945: break;
14946: }
14947: case 0x78:
14948: {
14949: sdwCyclesRemaining -= 4;
14950: cpu.z80A = cpu.z80B;
14951: break;
14952: }
14953: case 0x79:
14954: {
14955: sdwCyclesRemaining -= 4;
14956: cpu.z80A = cpu.z80C;
14957: break;
14958: }
14959: case 0x7a:
14960: {
14961: sdwCyclesRemaining -= 4;
14962: cpu.z80A = cpu.z80D;
14963: break;
14964: }
14965: case 0x7b:
14966: {
14967: sdwCyclesRemaining -= 4;
14968: cpu.z80A = cpu.z80E;
14969: break;
14970: }
14971: case 0x7c:
14972: {
14973: sdwCyclesRemaining -= 4;
14974: cpu.z80A = cpu.z80H;
14975: break;
14976: }
14977: case 0x7d:
14978: {
14979: sdwCyclesRemaining -= 4;
14980: cpu.z80A = cpu.z80L;
14981: break;
14982: }
14983: case 0x7e:
14984: {
14985: sdwCyclesRemaining -= 7;
14986: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
14987: while (psMemRead->lowAddr != 0xffffffff)
14988: {
14989: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
14990: {
14991: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
14992: if (psMemRead->memoryCall)
14993: {
14994: cpu.z80A = psMemRead->memoryCall(cpu.z80HL, psMemRead);
14995: }
14996: else
14997: {
14998: cpu.z80A = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
14999: }
15000: psMemRead = NULL;
15001: break;
15002: }
15003: ++psMemRead;
15004: }
15005:
15006: if (psMemRead)
15007: {
15008: cpu.z80A = cpu.z80Base[cpu.z80HL];
15009: }
15010:
15011: break;
15012: }
15013: case 0x7f:
15014: {
15015: sdwCyclesRemaining -= 4;
15016: break;
15017: }
15018: case 0x80:
15019: {
15020: sdwCyclesRemaining -= 4;
15021: bTemp2 = cpu.z80A + cpu.z80B;
15022: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15023: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15024: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80B];
15025: cpu.z80A = bTemp2;
15026: break;
15027: }
15028: case 0x81:
15029: {
15030: sdwCyclesRemaining -= 4;
15031: bTemp2 = cpu.z80A + cpu.z80C;
15032: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15033: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15034: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80C];
15035: cpu.z80A = bTemp2;
15036: break;
15037: }
15038: case 0x82:
15039: {
15040: sdwCyclesRemaining -= 4;
15041: bTemp2 = cpu.z80A + cpu.z80D;
15042: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15043: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15044: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80D];
15045: cpu.z80A = bTemp2;
15046: break;
15047: }
15048: case 0x83:
15049: {
15050: sdwCyclesRemaining -= 4;
15051: bTemp2 = cpu.z80A + cpu.z80E;
15052: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15053: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15054: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80E];
15055: cpu.z80A = bTemp2;
15056: break;
15057: }
15058: case 0x84:
15059: {
15060: sdwCyclesRemaining -= 4;
15061: bTemp2 = cpu.z80A + cpu.z80H;
15062: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15063: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15064: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80H];
15065: cpu.z80A = bTemp2;
15066: break;
15067: }
15068: case 0x85:
15069: {
15070: sdwCyclesRemaining -= 4;
15071: bTemp2 = cpu.z80A + cpu.z80L;
15072: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15073: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15074: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80L];
15075: cpu.z80A = bTemp2;
15076: break;
15077: }
15078: case 0x86:
15079: {
15080: sdwCyclesRemaining -= 7;
15081: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
15082: while (psMemRead->lowAddr != 0xffffffff)
15083: {
15084: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
15085: {
15086: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15087: if (psMemRead->memoryCall)
15088: {
15089: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
15090: }
15091: else
15092: {
15093: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
15094: }
15095: psMemRead = NULL;
15096: break;
15097: }
15098: ++psMemRead;
15099: }
15100:
15101: if (psMemRead)
15102: {
15103: bTemp = cpu.z80Base[cpu.z80HL];
15104: }
15105:
15106: bTemp2 = cpu.z80A + bTemp;
15107: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15108: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15109: pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp];
15110: cpu.z80A = bTemp2;
15111: break;
15112: }
15113: case 0x87:
15114: {
15115: sdwCyclesRemaining -= 4;
15116: bTemp2 = cpu.z80A + cpu.z80A;
15117: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15118: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15119: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80A];
15120: cpu.z80A = bTemp2;
15121: break;
15122: }
15123: case 0x88:
15124: {
15125: sdwCyclesRemaining -= 4;
15126: bTemp2 = cpu.z80A + cpu.z80B + (cpu.z80F & Z80_FLAG_CARRY);
15127: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15128: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15129: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80B | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15130: cpu.z80A = bTemp2;
15131: break;
15132: }
15133: case 0x89:
15134: {
15135: sdwCyclesRemaining -= 4;
15136: bTemp2 = cpu.z80A + cpu.z80C + (cpu.z80F & Z80_FLAG_CARRY);
15137: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15138: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15139: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80C | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15140: cpu.z80A = bTemp2;
15141: break;
15142: }
15143: case 0x8a:
15144: {
15145: sdwCyclesRemaining -= 4;
15146: bTemp2 = cpu.z80A + cpu.z80D + (cpu.z80F & Z80_FLAG_CARRY);
15147: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15148: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15149: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80D | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15150: cpu.z80A = bTemp2;
15151: break;
15152: }
15153: case 0x8b:
15154: {
15155: sdwCyclesRemaining -= 4;
15156: bTemp2 = cpu.z80A + cpu.z80E + (cpu.z80F & Z80_FLAG_CARRY);
15157: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15158: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15159: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80E | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15160: cpu.z80A = bTemp2;
15161: break;
15162: }
15163: case 0x8c:
15164: {
15165: sdwCyclesRemaining -= 4;
15166: bTemp2 = cpu.z80A + cpu.z80H + (cpu.z80F & Z80_FLAG_CARRY);
15167: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15168: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15169: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80H | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15170: cpu.z80A = bTemp2;
15171: break;
15172: }
15173: case 0x8d:
15174: {
15175: sdwCyclesRemaining -= 4;
15176: bTemp2 = cpu.z80A + cpu.z80L + (cpu.z80F & Z80_FLAG_CARRY);
15177: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15178: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15179: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80L | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15180: cpu.z80A = bTemp2;
15181: break;
15182: }
15183: case 0x8e:
15184: {
15185: sdwCyclesRemaining -= 7;
15186: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
15187: while (psMemRead->lowAddr != 0xffffffff)
15188: {
15189: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
15190: {
15191: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15192: if (psMemRead->memoryCall)
15193: {
15194: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
15195: }
15196: else
15197: {
15198: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
15199: }
15200: psMemRead = NULL;
15201: break;
15202: }
15203: ++psMemRead;
15204: }
15205:
15206: if (psMemRead)
15207: {
15208: bTemp = cpu.z80Base[cpu.z80HL];
15209: }
15210:
15211: bTemp2 = cpu.z80A + bTemp + (cpu.z80F & Z80_FLAG_CARRY);
15212: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15213: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15214: pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15215: cpu.z80A = bTemp2;
15216: break;
15217: }
15218: case 0x8f:
15219: {
15220: sdwCyclesRemaining -= 4;
15221: bTemp2 = cpu.z80A + cpu.z80A + (cpu.z80F & Z80_FLAG_CARRY);
15222: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15223: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15224: pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80A | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15225: cpu.z80A = bTemp2;
15226: break;
15227: }
15228: case 0x90:
15229: {
15230: sdwCyclesRemaining -= 4;
15231: bTemp2 = cpu.z80A - cpu.z80B;
15232: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15233: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15234: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80B];
15235: cpu.z80A = bTemp2;
15236: break;
15237: }
15238: case 0x91:
15239: {
15240: sdwCyclesRemaining -= 4;
15241: bTemp2 = cpu.z80A - cpu.z80C;
15242: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15243: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15244: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80C];
15245: cpu.z80A = bTemp2;
15246: break;
15247: }
15248: case 0x92:
15249: {
15250: sdwCyclesRemaining -= 4;
15251: bTemp2 = cpu.z80A - cpu.z80D;
15252: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15253: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15254: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80D];
15255: cpu.z80A = bTemp2;
15256: break;
15257: }
15258: case 0x93:
15259: {
15260: sdwCyclesRemaining -= 4;
15261: bTemp2 = cpu.z80A - cpu.z80E;
15262: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15263: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15264: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80E];
15265: cpu.z80A = bTemp2;
15266: break;
15267: }
15268: case 0x94:
15269: {
15270: sdwCyclesRemaining -= 4;
15271: bTemp2 = cpu.z80A - cpu.z80H;
15272: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15273: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15274: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80H];
15275: cpu.z80A = bTemp2;
15276: break;
15277: }
15278: case 0x95:
15279: {
15280: sdwCyclesRemaining -= 4;
15281: bTemp2 = cpu.z80A - cpu.z80L;
15282: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15283: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15284: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80L];
15285: cpu.z80A = bTemp2;
15286: break;
15287: }
15288: case 0x96:
15289: {
15290: sdwCyclesRemaining -= 7;
15291: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
15292: while (psMemRead->lowAddr != 0xffffffff)
15293: {
15294: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
15295: {
15296: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15297: if (psMemRead->memoryCall)
15298: {
15299: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
15300: }
15301: else
15302: {
15303: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
15304: }
15305: psMemRead = NULL;
15306: break;
15307: }
15308: ++psMemRead;
15309: }
15310:
15311: if (psMemRead)
15312: {
15313: bTemp = cpu.z80Base[cpu.z80HL];
15314: }
15315:
15316: bTemp2 = cpu.z80A - bTemp;
15317: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15318: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15319: pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
15320: cpu.z80A = bTemp2;
15321: break;
15322: }
15323: case 0x97:
15324: {
15325: sdwCyclesRemaining -= 4;
15326: bTemp2 = cpu.z80A - cpu.z80A;
15327: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15328: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15329: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80A];
15330: cpu.z80A = bTemp2;
15331: break;
15332: }
15333: case 0x98:
15334: {
15335: sdwCyclesRemaining -= 4;
15336: bTemp2 = cpu.z80A - cpu.z80B - (cpu.z80F & Z80_FLAG_CARRY);
15337: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15338: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15339: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80B | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15340: cpu.z80A = bTemp2;
15341: break;
15342: }
15343: case 0x99:
15344: {
15345: sdwCyclesRemaining -= 4;
15346: bTemp2 = cpu.z80A - cpu.z80C - (cpu.z80F & Z80_FLAG_CARRY);
15347: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15348: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15349: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80C | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15350: cpu.z80A = bTemp2;
15351: break;
15352: }
15353: case 0x9a:
15354: {
15355: sdwCyclesRemaining -= 4;
15356: bTemp2 = cpu.z80A - cpu.z80D - (cpu.z80F & Z80_FLAG_CARRY);
15357: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15358: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15359: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80D | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15360: cpu.z80A = bTemp2;
15361: break;
15362: }
15363: case 0x9b:
15364: {
15365: sdwCyclesRemaining -= 4;
15366: bTemp2 = cpu.z80A - cpu.z80E - (cpu.z80F & Z80_FLAG_CARRY);
15367: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15368: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15369: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80E | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15370: cpu.z80A = bTemp2;
15371: break;
15372: }
15373: case 0x9c:
15374: {
15375: sdwCyclesRemaining -= 4;
15376: bTemp2 = cpu.z80A - cpu.z80H - (cpu.z80F & Z80_FLAG_CARRY);
15377: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15378: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15379: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80H | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15380: cpu.z80A = bTemp2;
15381: break;
15382: }
15383: case 0x9d:
15384: {
15385: sdwCyclesRemaining -= 4;
15386: bTemp2 = cpu.z80A - cpu.z80L - (cpu.z80F & Z80_FLAG_CARRY);
15387: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15388: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15389: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80L | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15390: cpu.z80A = bTemp2;
15391: break;
15392: }
15393: case 0x9e:
15394: {
15395: sdwCyclesRemaining -= 7;
15396: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
15397: while (psMemRead->lowAddr != 0xffffffff)
15398: {
15399: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
15400: {
15401: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15402: if (psMemRead->memoryCall)
15403: {
15404: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
15405: }
15406: else
15407: {
15408: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
15409: }
15410: psMemRead = NULL;
15411: break;
15412: }
15413: ++psMemRead;
15414: }
15415:
15416: if (psMemRead)
15417: {
15418: bTemp = cpu.z80Base[cpu.z80HL];
15419: }
15420:
15421: bTemp2 = cpu.z80A - bTemp - (cpu.z80F & Z80_FLAG_CARRY);
15422: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15423: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15424: pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15425: cpu.z80A = bTemp2;
15426: break;
15427: }
15428: case 0x9f:
15429: {
15430: sdwCyclesRemaining -= 4;
15431: bTemp2 = cpu.z80A - cpu.z80A - (cpu.z80F & Z80_FLAG_CARRY);
15432: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15433: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15434: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80A | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
15435: cpu.z80A = bTemp2;
15436: break;
15437: }
15438: case 0xa0:
15439: {
15440: sdwCyclesRemaining -= 4;
15441: cpu.z80A &= cpu.z80B;
15442: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15443: cpu.z80F |= bPostANDFlags[cpu.z80A];
15444:
15445: break;
15446: }
15447: case 0xa1:
15448: {
15449: sdwCyclesRemaining -= 4;
15450: cpu.z80A &= cpu.z80C;
15451: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15452: cpu.z80F |= bPostANDFlags[cpu.z80A];
15453:
15454: break;
15455: }
15456: case 0xa2:
15457: {
15458: sdwCyclesRemaining -= 4;
15459: cpu.z80A &= cpu.z80D;
15460: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15461: cpu.z80F |= bPostANDFlags[cpu.z80A];
15462:
15463: break;
15464: }
15465: case 0xa3:
15466: {
15467: sdwCyclesRemaining -= 4;
15468: cpu.z80A &= cpu.z80E;
15469: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15470: cpu.z80F |= bPostANDFlags[cpu.z80A];
15471:
15472: break;
15473: }
15474: case 0xa4:
15475: {
15476: sdwCyclesRemaining -= 4;
15477: cpu.z80A &= cpu.z80H;
15478: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15479: cpu.z80F |= bPostANDFlags[cpu.z80A];
15480:
15481: break;
15482: }
15483: case 0xa5:
15484: {
15485: sdwCyclesRemaining -= 4;
15486: cpu.z80A &= cpu.z80L;
15487: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15488: cpu.z80F |= bPostANDFlags[cpu.z80A];
15489:
15490: break;
15491: }
15492: case 0xa6:
15493: {
15494: sdwCyclesRemaining -= 7;
15495: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
15496: while (psMemRead->lowAddr != 0xffffffff)
15497: {
15498: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
15499: {
15500: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15501: if (psMemRead->memoryCall)
15502: {
15503: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
15504: }
15505: else
15506: {
15507: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
15508: }
15509: psMemRead = NULL;
15510: break;
15511: }
15512: ++psMemRead;
15513: }
15514:
15515: if (psMemRead)
15516: {
15517: bTemp = cpu.z80Base[cpu.z80HL];
15518: }
15519:
15520: cpu.z80A &= bTemp;
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 0xa7:
15527: {
15528: sdwCyclesRemaining -= 4;
15529: cpu.z80A &= cpu.z80A;
15530: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15531: cpu.z80F |= bPostANDFlags[cpu.z80A];
15532:
15533: break;
15534: }
15535: case 0xa8:
15536: {
15537: sdwCyclesRemaining -= 4;
15538: cpu.z80A ^= cpu.z80B;
15539: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15540: cpu.z80F |= bPostORFlags[cpu.z80A];
15541:
15542: break;
15543: }
15544: case 0xa9:
15545: {
15546: sdwCyclesRemaining -= 4;
15547: cpu.z80A ^= cpu.z80C;
15548: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15549: cpu.z80F |= bPostORFlags[cpu.z80A];
15550:
15551: break;
15552: }
15553: case 0xaa:
15554: {
15555: sdwCyclesRemaining -= 4;
15556: cpu.z80A ^= cpu.z80D;
15557: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15558: cpu.z80F |= bPostORFlags[cpu.z80A];
15559:
15560: break;
15561: }
15562: case 0xab:
15563: {
15564: sdwCyclesRemaining -= 4;
15565: cpu.z80A ^= cpu.z80E;
15566: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15567: cpu.z80F |= bPostORFlags[cpu.z80A];
15568:
15569: break;
15570: }
15571: case 0xac:
15572: {
15573: sdwCyclesRemaining -= 4;
15574: cpu.z80A ^= cpu.z80H;
15575: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15576: cpu.z80F |= bPostORFlags[cpu.z80A];
15577:
15578: break;
15579: }
15580: case 0xad:
15581: {
15582: sdwCyclesRemaining -= 4;
15583: cpu.z80A ^= cpu.z80L;
15584: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15585: cpu.z80F |= bPostORFlags[cpu.z80A];
15586:
15587: break;
15588: }
15589: case 0xae:
15590: {
15591: sdwCyclesRemaining -= 7;
15592: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
15593: while (psMemRead->lowAddr != 0xffffffff)
15594: {
15595: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
15596: {
15597: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15598: if (psMemRead->memoryCall)
15599: {
15600: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
15601: }
15602: else
15603: {
15604: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
15605: }
15606: psMemRead = NULL;
15607: break;
15608: }
15609: ++psMemRead;
15610: }
15611:
15612: if (psMemRead)
15613: {
15614: bTemp = cpu.z80Base[cpu.z80HL];
15615: }
15616:
15617: cpu.z80A ^= bTemp;
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 0xaf:
15624: {
15625: sdwCyclesRemaining -= 4;
15626: cpu.z80A ^= cpu.z80A;
15627: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15628: cpu.z80F |= bPostORFlags[cpu.z80A];
15629:
15630: break;
15631: }
15632: case 0xb0:
15633: {
15634: sdwCyclesRemaining -= 4;
15635: cpu.z80A |= cpu.z80B;
15636: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15637: cpu.z80F |= bPostORFlags[cpu.z80A];
15638:
15639: break;
15640: }
15641: case 0xb1:
15642: {
15643: sdwCyclesRemaining -= 4;
15644: cpu.z80A |= cpu.z80C;
15645: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15646: cpu.z80F |= bPostORFlags[cpu.z80A];
15647:
15648: break;
15649: }
15650: case 0xb2:
15651: {
15652: sdwCyclesRemaining -= 4;
15653: cpu.z80A |= cpu.z80D;
15654: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15655: cpu.z80F |= bPostORFlags[cpu.z80A];
15656:
15657: break;
15658: }
15659: case 0xb3:
15660: {
15661: sdwCyclesRemaining -= 4;
15662: cpu.z80A |= cpu.z80E;
15663: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15664: cpu.z80F |= bPostORFlags[cpu.z80A];
15665:
15666: break;
15667: }
15668: case 0xb4:
15669: {
15670: sdwCyclesRemaining -= 4;
15671: cpu.z80A |= cpu.z80H;
15672: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15673: cpu.z80F |= bPostORFlags[cpu.z80A];
15674:
15675: break;
15676: }
15677: case 0xb5:
15678: {
15679: sdwCyclesRemaining -= 4;
15680: cpu.z80A |= cpu.z80L;
15681: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15682: cpu.z80F |= bPostORFlags[cpu.z80A];
15683:
15684: break;
15685: }
15686: case 0xb6:
15687: {
15688: sdwCyclesRemaining -= 7;
15689: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
15690: while (psMemRead->lowAddr != 0xffffffff)
15691: {
15692: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
15693: {
15694: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15695: if (psMemRead->memoryCall)
15696: {
15697: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
15698: }
15699: else
15700: {
15701: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
15702: }
15703: psMemRead = NULL;
15704: break;
15705: }
15706: ++psMemRead;
15707: }
15708:
15709: if (psMemRead)
15710: {
15711: bTemp = cpu.z80Base[cpu.z80HL];
15712: }
15713:
15714: cpu.z80A |= bTemp;
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 0xb7:
15721: {
15722: sdwCyclesRemaining -= 4;
15723: cpu.z80A |= cpu.z80A;
15724: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
15725: cpu.z80F |= bPostORFlags[cpu.z80A];
15726:
15727: break;
15728: }
15729: case 0xb8:
15730: {
15731: sdwCyclesRemaining -= 4;
15732: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15733: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15734: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80B];
15735: break;
15736: }
15737: case 0xb9:
15738: {
15739: sdwCyclesRemaining -= 4;
15740: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15741: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15742: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80C];
15743: break;
15744: }
15745: case 0xba:
15746: {
15747: sdwCyclesRemaining -= 4;
15748: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15749: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15750: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80D];
15751: break;
15752: }
15753: case 0xbb:
15754: {
15755: sdwCyclesRemaining -= 4;
15756: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15757: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15758: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80E];
15759: break;
15760: }
15761: case 0xbc:
15762: {
15763: sdwCyclesRemaining -= 4;
15764: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15765: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15766: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80H];
15767: break;
15768: }
15769: case 0xbd:
15770: {
15771: sdwCyclesRemaining -= 4;
15772: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15773: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15774: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80L];
15775: break;
15776: }
15777: case 0xbe:
15778: {
15779: sdwCyclesRemaining -= 7;
15780: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
15781: while (psMemRead->lowAddr != 0xffffffff)
15782: {
15783: if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
15784: {
15785: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15786: if (psMemRead->memoryCall)
15787: {
15788: bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
15789: }
15790: else
15791: {
15792: bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
15793: }
15794: psMemRead = NULL;
15795: break;
15796: }
15797: ++psMemRead;
15798: }
15799:
15800: if (psMemRead)
15801: {
15802: bTemp = cpu.z80Base[cpu.z80HL];
15803: }
15804:
15805: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15806: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15807: pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
15808: break;
15809: }
15810: case 0xbf:
15811: {
15812: sdwCyclesRemaining -= 4;
15813: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15814: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15815: pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80A];
15816: break;
15817: }
15818: case 0xc0:
15819: {
15820: sdwCyclesRemaining -= 5;
15821: if (!(cpu.z80F & Z80_FLAG_ZERO))
15822: {
15823: dwElapsedTicks += 6;
15824: pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
15825: dwAddr = *pbSP++; /* Pop LSB */
15826: dwAddr |= ((UINT32) *pbSP << 8); /* Pop MSB */
15827: cpu.z80sp += 2; /* Pop the word off */
15828: pbPC = (cpu.z80Base + dwAddr); /* Point PC to our return address */
15829: }
15830: break;
15831: }
15832: case 0xc1:
15833: {
15834: sdwCyclesRemaining -= 10;
15835: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
15836: while (psMemRead->lowAddr != 0xffffffff)
15837: {
15838: if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
15839: {
15840: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15841: if (psMemRead->memoryCall)
15842: {
15843: cpu.z80BC = psMemRead->memoryCall(cpu.z80sp, psMemRead);
15844: cpu.z80BC |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
15845: }
15846: else
15847: {
15848: cpu.z80BC = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
15849: cpu.z80BC |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
15850: }
15851: psMemRead = NULL;
15852: break;
15853: }
15854: ++psMemRead;
15855: }
15856:
15857: if (psMemRead)
15858: {
15859: cpu.z80BC = cpu.z80Base[cpu.z80sp];
15860: cpu.z80BC |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
15861: }
15862:
15863: cpu.z80sp += 2;
15864: pbSP = (cpu.z80Base + cpu.z80sp); /* Normalize the stack pointer */
15865: break;
15866: }
15867: case 0xc2:
15868: {
15869: sdwCyclesRemaining -= 10;
15870: dwAddr = *pbPC++; /* Get LSB first */
15871: dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
15872: if (!(cpu.z80F & Z80_FLAG_ZERO))
15873: {
15874: pbPC = cpu.z80Base + dwAddr; /* Normalize the address */
15875: }
15876: break;
15877: }
15878: case 0xc3:
15879: {
15880: sdwCyclesRemaining -= 10;
15881: dwAddr = *pbPC++; /* Get LSB first */
15882: dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
15883: pbPC = cpu.z80Base + dwAddr; /* Normalize the address */
15884: break;
15885: }
15886: case 0xc4:
15887: {
15888: sdwCyclesRemaining -= 10;
15889: dwAddr = *pbPC++; /* Get LSB first */
15890: dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
15891: if (!(cpu.z80F & Z80_FLAG_ZERO))
15892: {
15893: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15894: pbSP = (cpu.z80Base + cpu.z80sp - 1); /* Normalize the stack pointer */
15895: *pbSP-- = cpu.z80pc >> 8; /* MSB */
15896: *pbSP = (UINT8) cpu.z80pc; /* LSB */
15897: cpu.z80sp -= 2; /* Back our stack up */
15898: pbPC = cpu.z80Base + dwAddr; /* Normalize the address */
15899: }
15900: break;
15901: }
15902: case 0xc5:
15903: {
15904: sdwCyclesRemaining -= 11;
15905: cpu.z80sp -= 2;
15906: pbSP = (cpu.z80Base + cpu.z80sp); /* Normalize the stack pointer */
15907: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
15908: while (psMemWrite->lowAddr != 0xffffffff)
15909: {
15910: if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
15911: {
15912: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15913: if (psMemWrite->memoryCall)
15914: {
15915: psMemWrite->memoryCall(cpu.z80sp, (cpu.z80BC & 0xff), psMemWrite);
15916: psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80BC >> 8), psMemWrite);
15917: }
15918: else
15919: {
15920: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80BC;
15921: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80BC >> 8;
15922: }
15923: psMemWrite = NULL;
15924: break;
15925: }
15926: ++psMemWrite;
15927: }
15928:
15929: if (psMemWrite)
15930: {
15931: cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80BC;
15932: cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80BC >> 8);
15933: }
15934:
15935: break;
15936: }
15937: case 0xc6:
15938: {
15939: sdwCyclesRemaining -= 7;
15940: bTemp = *pbPC++;
15941: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
15942: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
15943: pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp];
15944: cpu.z80A += bTemp;
15945: break;
15946: }
15947: case 0xc7:
15948: {
15949: sdwCyclesRemaining -= 11;
15950: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
15951: pbSP = (cpu.z80Base + cpu.z80sp - 1); /* Normalize the stack pointer */
15952: *pbSP-- = cpu.z80pc >> 8; /* LSB */
15953: *pbSP = (UINT8) cpu.z80pc; /* MSB */
15954: cpu.z80sp -= 2; /* Back our stack up */
15955: pbPC = cpu.z80Base + 0x00; /* Normalize the address */
15956: break;
15957: }
15958: case 0xc8:
15959: {
15960: sdwCyclesRemaining -= 5;
15961: if (cpu.z80F & Z80_FLAG_ZERO)
15962: {
15963: dwElapsedTicks += 6;
15964: pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
15965: dwAddr = *pbSP++; /* Pop LSB */
15966: dwAddr |= ((UINT32) *pbSP << 8); /* Pop MSB */
15967: cpu.z80sp += 2; /* Pop the word off */
15968: pbPC = (cpu.z80Base + dwAddr); /* Point PC to our return address */
15969: }
15970: break;
15971: }
15972: case 0xc9:
15973: {
15974: sdwCyclesRemaining -= 10;
15975: pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
15976: dwAddr = *pbSP++; /* Pop LSB */
15977: dwAddr |= ((UINT32) *pbSP << 8); /* Pop MSB */
15978: cpu.z80sp += 2; /* Pop the word off */
15979: pbPC = (cpu.z80Base + dwAddr); /* Point PC to our return address */
15980: break;
15981: }
15982: case 0xca:
15983: {
15984: sdwCyclesRemaining -= 10;
15985: dwAddr = *pbPC++; /* Get LSB first */
15986: dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
15987: if (cpu.z80F & Z80_FLAG_ZERO)
15988: {
15989: pbPC = cpu.z80Base + dwAddr; /* Normalize the address */
15990: }
15991: break;
15992: }
15993: case 0xcb:
15994: {
15995: CBHandler();
15996: break;
15997: }
15998: case 0xcc:
15999: {
16000: sdwCyclesRemaining -= 10;
16001: dwAddr = *pbPC++; /* Get LSB first */
16002: dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16003: if (cpu.z80F & Z80_FLAG_ZERO)
16004: {
16005: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16006: pbSP = (cpu.z80Base + cpu.z80sp - 1); /* Normalize the stack pointer */
16007: *pbSP-- = cpu.z80pc >> 8; /* MSB */
16008: *pbSP = (UINT8) cpu.z80pc; /* LSB */
16009: cpu.z80sp -= 2; /* Back our stack up */
16010: pbPC = cpu.z80Base + dwAddr; /* Normalize the address */
16011: }
16012: break;
16013: }
16014: case 0xcd:
16015: {
16016: sdwCyclesRemaining -= 17;
16017: dwAddr = *pbPC++; /* Get LSB first */
16018: dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16019: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16020: pbSP = (cpu.z80Base + cpu.z80sp - 1); /* Normalize the stack pointer */
16021: *pbSP-- = cpu.z80pc >> 8; /* LSB */
16022: *pbSP = (UINT8) cpu.z80pc; /* MSB */
16023: cpu.z80sp -= 2; /* Back our stack up */
16024: pbPC = cpu.z80Base + dwAddr; /* Normalize the address */
16025: break;
16026: }
16027: case 0xce:
16028: {
16029: sdwCyclesRemaining -= 7;
16030: bTemp = *pbPC++ + (cpu.z80F & Z80_FLAG_CARRY);
16031: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
16032: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
16033: pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
16034: cpu.z80A += bTemp;
16035: break;
16036: }
16037: case 0xcf:
16038: {
16039: sdwCyclesRemaining -= 11;
16040: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16041: pbSP = (cpu.z80Base + cpu.z80sp - 1); /* Normalize the stack pointer */
16042: *pbSP-- = cpu.z80pc >> 8; /* LSB */
16043: *pbSP = (UINT8) cpu.z80pc; /* MSB */
16044: cpu.z80sp -= 2; /* Back our stack up */
16045: pbPC = cpu.z80Base + 0x08; /* Normalize the address */
16046: break;
16047: }
16048: case 0xd0:
16049: {
16050: sdwCyclesRemaining -= 5;
16051: if (!(cpu.z80F & Z80_FLAG_CARRY))
16052: {
16053: dwElapsedTicks += 6;
16054: pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
16055: dwAddr = *pbSP++; /* Pop LSB */
16056: dwAddr |= ((UINT32) *pbSP << 8); /* Pop MSB */
16057: cpu.z80sp += 2; /* Pop the word off */
16058: pbPC = (cpu.z80Base + dwAddr); /* Point PC to our return address */
16059: }
16060: break;
16061: }
16062: case 0xd1:
16063: {
16064: sdwCyclesRemaining -= 10;
16065: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
16066: while (psMemRead->lowAddr != 0xffffffff)
16067: {
16068: if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
16069: {
16070: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16071: if (psMemRead->memoryCall)
16072: {
16073: cpu.z80DE = psMemRead->memoryCall(cpu.z80sp, psMemRead);
16074: cpu.z80DE |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
16075: }
16076: else
16077: {
16078: cpu.z80DE = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
16079: cpu.z80DE |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
16080: }
16081: psMemRead = NULL;
16082: break;
16083: }
16084: ++psMemRead;
16085: }
16086:
16087: if (psMemRead)
16088: {
16089: cpu.z80DE = cpu.z80Base[cpu.z80sp];
16090: cpu.z80DE |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
16091: }
16092:
16093: cpu.z80sp += 2;
16094: pbSP = (cpu.z80Base + cpu.z80sp); /* Normalize the stack pointer */
16095: break;
16096: }
16097: case 0xd2:
16098: {
16099: sdwCyclesRemaining -= 10;
16100: dwAddr = *pbPC++; /* Get LSB first */
16101: dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16102: if (!(cpu.z80F & Z80_FLAG_CARRY))
16103: {
16104: pbPC = cpu.z80Base + dwAddr; /* Normalize the address */
16105: }
16106: break;
16107: }
16108: case 0xd3:
16109: {
16110: sdwCyclesRemaining -= 11;
16111: dwTemp = *pbPC++;
16112: psIoWrite = cpu.z80IoWrite; /* Beginning of our handler */
16113: while (psIoWrite->lowIoAddr != 0xffff)
16114: {
16115: if ((dwTemp >= psIoWrite->lowIoAddr) && (dwTemp <= psIoWrite->highIoAddr))
16116: {
16117: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16118: psIoWrite->IOCall(dwTemp, cpu.z80A, psIoWrite);
16119: psIoWrite = NULL;
16120: break;
16121: }
16122: ++psIoWrite;
16123: }
16124:
16125: break;
16126: }
16127: case 0xd4:
16128: {
16129: sdwCyclesRemaining -= 10;
16130: dwAddr = *pbPC++; /* Get LSB first */
16131: dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16132: if (!(cpu.z80F & Z80_FLAG_CARRY))
16133: {
16134: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16135: pbSP = (cpu.z80Base + cpu.z80sp - 1); /* Normalize the stack pointer */
16136: *pbSP-- = cpu.z80pc >> 8; /* MSB */
16137: *pbSP = (UINT8) cpu.z80pc; /* LSB */
16138: cpu.z80sp -= 2; /* Back our stack up */
16139: pbPC = cpu.z80Base + dwAddr; /* Normalize the address */
16140: }
16141: break;
16142: }
16143: case 0xd5:
16144: {
16145: sdwCyclesRemaining -= 11;
16146: cpu.z80sp -= 2;
16147: pbSP = (cpu.z80Base + cpu.z80sp); /* Normalize the stack pointer */
16148: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
16149: while (psMemWrite->lowAddr != 0xffffffff)
16150: {
16151: if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
16152: {
16153: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16154: if (psMemWrite->memoryCall)
16155: {
16156: psMemWrite->memoryCall(cpu.z80sp, (cpu.z80DE & 0xff), psMemWrite);
16157: psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80DE >> 8), psMemWrite);
16158: }
16159: else
16160: {
16161: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80DE;
16162: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80DE >> 8;
16163: }
16164: psMemWrite = NULL;
16165: break;
16166: }
16167: ++psMemWrite;
16168: }
16169:
16170: if (psMemWrite)
16171: {
16172: cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80DE;
16173: cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80DE >> 8);
16174: }
16175:
16176: break;
16177: }
16178: case 0xd6:
16179: {
16180: sdwCyclesRemaining -= 7;
16181: bTemp = *pbPC++;
16182: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
16183: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
16184: pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
16185: cpu.z80A -= bTemp;
16186: break;
16187: }
16188: case 0xd7:
16189: {
16190: sdwCyclesRemaining -= 11;
16191: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16192: pbSP = (cpu.z80Base + cpu.z80sp - 1); /* Normalize the stack pointer */
16193: *pbSP-- = cpu.z80pc >> 8; /* LSB */
16194: *pbSP = (UINT8) cpu.z80pc; /* MSB */
16195: cpu.z80sp -= 2; /* Back our stack up */
16196: pbPC = cpu.z80Base + 0x10; /* Normalize the address */
16197: break;
16198: }
16199: case 0xd8:
16200: {
16201: sdwCyclesRemaining -= 5;
16202: if (cpu.z80F & Z80_FLAG_CARRY)
16203: {
16204: dwElapsedTicks += 6;
16205: pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
16206: dwAddr = *pbSP++; /* Pop LSB */
16207: dwAddr |= ((UINT32) *pbSP << 8); /* Pop MSB */
16208: cpu.z80sp += 2; /* Pop the word off */
16209: pbPC = (cpu.z80Base + dwAddr); /* Point PC to our return address */
16210: }
16211: break;
16212: }
16213: case 0xd9:
16214: {
16215: sdwCyclesRemaining -= 4;
16216: dwTemp = cpu.z80DE;
16217: cpu.z80DE = cpu.z80deprime;
16218: cpu.z80deprime = dwTemp;
16219: dwTemp = cpu.z80BC;
16220: cpu.z80BC = cpu.z80bcprime;
16221: cpu.z80bcprime = dwTemp;
16222: dwTemp = cpu.z80HL;
16223: cpu.z80HL = cpu.z80hlprime;
16224: cpu.z80hlprime = dwTemp;
16225: break;
16226: }
16227: case 0xda:
16228: {
16229: sdwCyclesRemaining -= 10;
16230: dwAddr = *pbPC++; /* Get LSB first */
16231: dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16232: if (cpu.z80F & Z80_FLAG_CARRY)
16233: {
16234: pbPC = cpu.z80Base + dwAddr; /* Normalize the address */
16235: }
16236: break;
16237: }
16238: case 0xdb:
16239: {
16240: sdwCyclesRemaining -= 11;
16241: dwTemp = *pbPC++;
16242: psIoRead = cpu.z80IoRead; /* Beginning of our handler */
16243: while (psIoRead->lowIoAddr != 0xffff)
16244: {
16245: if ((dwTemp >= psIoRead->lowIoAddr) && (dwTemp <= psIoRead->highIoAddr))
16246: {
16247: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16248: cpu.z80A = psIoRead->IOCall(dwTemp, psIoRead);
16249: psIoRead = NULL;
16250: break;
16251: }
16252: ++psIoRead;
16253: }
16254:
16255: if (psIoRead)
16256: {
16257: cpu.z80A = 0xff; /* Unclaimed I/O read */
16258: }
16259:
16260: break;
16261: }
16262: case 0xdc:
16263: {
16264: sdwCyclesRemaining -= 10;
16265: dwAddr = *pbPC++; /* Get LSB first */
16266: dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16267: if (cpu.z80F & Z80_FLAG_CARRY)
16268: {
16269: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16270: pbSP = (cpu.z80Base + cpu.z80sp - 1); /* Normalize the stack pointer */
16271: *pbSP-- = cpu.z80pc >> 8; /* MSB */
16272: *pbSP = (UINT8) cpu.z80pc; /* LSB */
16273: cpu.z80sp -= 2; /* Back our stack up */
16274: pbPC = cpu.z80Base + dwAddr; /* Normalize the address */
16275: }
16276: break;
16277: }
16278: case 0xdd:
16279: {
16280: DDHandler();
16281: break;
16282: }
16283: case 0xde:
16284: {
16285: sdwCyclesRemaining -= 7;
16286: bTemp = *pbPC++ + (cpu.z80F & Z80_FLAG_CARRY);
16287: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
16288: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
16289: pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
16290: cpu.z80A = cpu.z80A - bTemp;
16291: break;
16292: }
16293: case 0xdf:
16294: {
16295: sdwCyclesRemaining -= 11;
16296: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16297: pbSP = (cpu.z80Base + cpu.z80sp - 1); /* Normalize the stack pointer */
16298: *pbSP-- = cpu.z80pc >> 8; /* LSB */
16299: *pbSP = (UINT8) cpu.z80pc; /* MSB */
16300: cpu.z80sp -= 2; /* Back our stack up */
16301: pbPC = cpu.z80Base + 0x18; /* Normalize the address */
16302: break;
16303: }
16304: case 0xe0:
16305: {
16306: sdwCyclesRemaining -= 5;
16307: if (!(cpu.z80F & Z80_FLAG_OVERFLOW_PARITY))
16308: {
16309: dwElapsedTicks += 6;
16310: pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
16311: dwAddr = *pbSP++; /* Pop LSB */
16312: dwAddr |= ((UINT32) *pbSP << 8); /* Pop MSB */
16313: cpu.z80sp += 2; /* Pop the word off */
16314: pbPC = (cpu.z80Base + dwAddr); /* Point PC to our return address */
16315: }
16316: break;
16317: }
16318: case 0xe1:
16319: {
16320: sdwCyclesRemaining -= 10;
16321: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
16322: while (psMemRead->lowAddr != 0xffffffff)
16323: {
16324: if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
16325: {
16326: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16327: if (psMemRead->memoryCall)
16328: {
16329: cpu.z80HL = psMemRead->memoryCall(cpu.z80sp, psMemRead);
16330: cpu.z80HL |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
16331: }
16332: else
16333: {
16334: cpu.z80HL = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
16335: cpu.z80HL |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
16336: }
16337: psMemRead = NULL;
16338: break;
16339: }
16340: ++psMemRead;
16341: }
16342:
16343: if (psMemRead)
16344: {
16345: cpu.z80HL = cpu.z80Base[cpu.z80sp];
16346: cpu.z80HL |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
16347: }
16348:
16349: cpu.z80sp += 2;
16350: pbSP = (cpu.z80Base + cpu.z80sp); /* Normalize the stack pointer */
16351: break;
16352: }
16353: case 0xe2:
16354: {
16355: sdwCyclesRemaining -= 10;
16356: dwAddr = *pbPC++; /* Get LSB first */
16357: dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16358: if (!(cpu.z80F & Z80_FLAG_OVERFLOW_PARITY))
16359: {
16360: pbPC = cpu.z80Base + dwAddr; /* Normalize the address */
16361: }
16362: break;
16363: }
16364: case 0xe3:
16365: {
16366: sdwCyclesRemaining -= 19;
16367: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
16368: while (psMemRead->lowAddr != 0xffffffff)
16369: {
16370: if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
16371: {
16372: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16373: if (psMemRead->memoryCall)
16374: {
16375: dwAddr = psMemRead->memoryCall(cpu.z80sp, psMemRead);
16376: dwAddr |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
16377: }
16378: else
16379: {
16380: dwAddr = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
16381: dwAddr |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
16382: }
16383: psMemRead = NULL;
16384: break;
16385: }
16386: ++psMemRead;
16387: }
16388:
16389: if (psMemRead)
16390: {
16391: dwAddr = cpu.z80Base[cpu.z80sp];
16392: dwAddr |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
16393: }
16394:
16395: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
16396: while (psMemWrite->lowAddr != 0xffffffff)
16397: {
16398: if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
16399: {
16400: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16401: if (psMemWrite->memoryCall)
16402: {
16403: psMemWrite->memoryCall(cpu.z80sp, (cpu.z80HL & 0xff), psMemWrite);
16404: psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80HL >> 8), psMemWrite);
16405: }
16406: else
16407: {
16408: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80HL;
16409: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80HL >> 8;
16410: }
16411: psMemWrite = NULL;
16412: break;
16413: }
16414: ++psMemWrite;
16415: }
16416:
16417: if (psMemWrite)
16418: {
16419: cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80HL;
16420: cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80HL >> 8);
16421: }
16422:
16423: cpu.z80HL = dwAddr;
16424: break;
16425: }
16426: case 0xe4:
16427: {
16428: sdwCyclesRemaining -= 10;
16429: dwAddr = *pbPC++; /* Get LSB first */
16430: dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16431: if (!(cpu.z80F & Z80_FLAG_OVERFLOW_PARITY))
16432: {
16433: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16434: pbSP = (cpu.z80Base + cpu.z80sp - 1); /* Normalize the stack pointer */
16435: *pbSP-- = cpu.z80pc >> 8; /* MSB */
16436: *pbSP = (UINT8) cpu.z80pc; /* LSB */
16437: cpu.z80sp -= 2; /* Back our stack up */
16438: pbPC = cpu.z80Base + dwAddr; /* Normalize the address */
16439: }
16440: break;
16441: }
16442: case 0xe5:
16443: {
16444: sdwCyclesRemaining -= 11;
16445: cpu.z80sp -= 2;
16446: pbSP = (cpu.z80Base + cpu.z80sp); /* Normalize the stack pointer */
16447: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
16448: while (psMemWrite->lowAddr != 0xffffffff)
16449: {
16450: if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
16451: {
16452: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16453: if (psMemWrite->memoryCall)
16454: {
16455: psMemWrite->memoryCall(cpu.z80sp, (cpu.z80HL & 0xff), psMemWrite);
16456: psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80HL >> 8), psMemWrite);
16457: }
16458: else
16459: {
16460: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80HL;
16461: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80HL >> 8;
16462: }
16463: psMemWrite = NULL;
16464: break;
16465: }
16466: ++psMemWrite;
16467: }
16468:
16469: if (psMemWrite)
16470: {
16471: cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80HL;
16472: cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80HL >> 8);
16473: }
16474:
16475: break;
16476: }
16477: case 0xe6:
16478: {
16479: sdwCyclesRemaining -= 7;
16480: cpu.z80A &= *pbPC++;
16481: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
16482: cpu.z80F |= bPostANDFlags[cpu.z80A];
16483:
16484: break;
16485: }
16486: case 0xe7:
16487: {
16488: sdwCyclesRemaining -= 11;
16489: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16490: pbSP = (cpu.z80Base + cpu.z80sp - 1); /* Normalize the stack pointer */
16491: *pbSP-- = cpu.z80pc >> 8; /* LSB */
16492: *pbSP = (UINT8) cpu.z80pc; /* MSB */
16493: cpu.z80sp -= 2; /* Back our stack up */
16494: pbPC = cpu.z80Base + 0x20; /* Normalize the address */
16495: break;
16496: }
16497: case 0xe8:
16498: {
16499: sdwCyclesRemaining -= 5;
16500: if (cpu.z80F & Z80_FLAG_OVERFLOW_PARITY)
16501: {
16502: dwElapsedTicks += 6;
16503: pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
16504: dwAddr = *pbSP++; /* Pop LSB */
16505: dwAddr |= ((UINT32) *pbSP << 8); /* Pop MSB */
16506: cpu.z80sp += 2; /* Pop the word off */
16507: pbPC = (cpu.z80Base + dwAddr); /* Point PC to our return address */
16508: }
16509: break;
16510: }
16511: case 0xe9:
16512: {
16513: sdwCyclesRemaining -= 4;
16514: pbPC = cpu.z80Base + cpu.z80HL;
16515: break;
16516: }
16517: case 0xea:
16518: {
16519: sdwCyclesRemaining -= 10;
16520: dwAddr = *pbPC++; /* Get LSB first */
16521: dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16522: if (cpu.z80F & Z80_FLAG_OVERFLOW_PARITY)
16523: {
16524: pbPC = cpu.z80Base + dwAddr; /* Normalize the address */
16525: }
16526: break;
16527: }
16528: case 0xeb:
16529: {
16530: sdwCyclesRemaining -= 4;
16531: dwAddr = cpu.z80DE;
16532: cpu.z80DE = cpu.z80HL;
16533: cpu.z80HL = dwAddr;
16534: break;
16535: }
16536: case 0xec:
16537: {
16538: sdwCyclesRemaining -= 10;
16539: dwAddr = *pbPC++; /* Get LSB first */
16540: dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16541: if (cpu.z80F & Z80_FLAG_OVERFLOW_PARITY)
16542: {
16543: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16544: pbSP = (cpu.z80Base + cpu.z80sp - 1); /* Normalize the stack pointer */
16545: *pbSP-- = cpu.z80pc >> 8; /* MSB */
16546: *pbSP = (UINT8) cpu.z80pc; /* LSB */
16547: cpu.z80sp -= 2; /* Back our stack up */
16548: pbPC = cpu.z80Base + dwAddr; /* Normalize the address */
16549: }
16550: break;
16551: }
16552: case 0xed:
16553: {
16554: EDHandler();
16555: break;
16556: }
16557: case 0xee:
16558: {
16559: sdwCyclesRemaining -= 7;
16560: cpu.z80A ^= *pbPC++;
16561: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
16562: cpu.z80F |= bPostORFlags[cpu.z80A];
16563:
16564: break;
16565: }
16566: case 0xef:
16567: {
16568: sdwCyclesRemaining -= 11;
16569: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16570: pbSP = (cpu.z80Base + cpu.z80sp - 1); /* Normalize the stack pointer */
16571: *pbSP-- = cpu.z80pc >> 8; /* LSB */
16572: *pbSP = (UINT8) cpu.z80pc; /* MSB */
16573: cpu.z80sp -= 2; /* Back our stack up */
16574: pbPC = cpu.z80Base + 0x28; /* Normalize the address */
16575: break;
16576: }
16577: case 0xf0:
16578: {
16579: sdwCyclesRemaining -= 5;
16580: if (!(cpu.z80F & Z80_FLAG_SIGN))
16581: {
16582: dwElapsedTicks += 6;
16583: pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
16584: dwAddr = *pbSP++; /* Pop LSB */
16585: dwAddr |= ((UINT32) *pbSP << 8); /* Pop MSB */
16586: cpu.z80sp += 2; /* Pop the word off */
16587: pbPC = (cpu.z80Base + dwAddr); /* Point PC to our return address */
16588: }
16589: break;
16590: }
16591: case 0xf1:
16592: {
16593: sdwCyclesRemaining -= 10;
16594: psMemRead = cpu.z80MemRead; /* Beginning of our handler */
16595: while (psMemRead->lowAddr != 0xffffffff)
16596: {
16597: if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
16598: {
16599: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16600: if (psMemRead->memoryCall)
16601: {
16602: cpu.z80AF = psMemRead->memoryCall(cpu.z80sp, psMemRead);
16603: cpu.z80AF |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
16604: }
16605: else
16606: {
16607: cpu.z80AF = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
16608: cpu.z80AF |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
16609: }
16610: psMemRead = NULL;
16611: break;
16612: }
16613: ++psMemRead;
16614: }
16615:
16616: if (psMemRead)
16617: {
16618: cpu.z80AF = cpu.z80Base[cpu.z80sp];
16619: cpu.z80AF |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
16620: }
16621:
16622: cpu.z80sp += 2;
16623: pbSP = (cpu.z80Base + cpu.z80sp); /* Normalize the stack pointer */
16624: break;
16625: }
16626: case 0xf2:
16627: {
16628: sdwCyclesRemaining -= 10;
16629: dwAddr = *pbPC++; /* Get LSB first */
16630: dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16631: if (!(cpu.z80F & Z80_FLAG_SIGN))
16632: {
16633: pbPC = cpu.z80Base + dwAddr; /* Normalize the address */
16634: }
16635: break;
16636: }
16637: case 0xf3:
16638: {
16639: sdwCyclesRemaining -= 4;
16640: cpu.z80iff &= (~IFF1);
16641: break;
16642: }
16643: case 0xf4:
16644: {
16645: sdwCyclesRemaining -= 10;
16646: dwAddr = *pbPC++; /* Get LSB first */
16647: dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16648: if (!(cpu.z80F & Z80_FLAG_SIGN))
16649: {
16650: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16651: pbSP = (cpu.z80Base + cpu.z80sp - 1); /* Normalize the stack pointer */
16652: *pbSP-- = cpu.z80pc >> 8; /* MSB */
16653: *pbSP = (UINT8) cpu.z80pc; /* LSB */
16654: cpu.z80sp -= 2; /* Back our stack up */
16655: pbPC = cpu.z80Base + dwAddr; /* Normalize the address */
16656: }
16657: break;
16658: }
16659: case 0xf5:
16660: {
16661: sdwCyclesRemaining -= 11;
16662: cpu.z80sp -= 2;
16663: pbSP = (cpu.z80Base + cpu.z80sp); /* Normalize the stack pointer */
16664: psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */
16665: while (psMemWrite->lowAddr != 0xffffffff)
16666: {
16667: if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
16668: {
16669: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16670: if (psMemWrite->memoryCall)
16671: {
16672: psMemWrite->memoryCall(cpu.z80sp, (cpu.z80AF & 0xff), psMemWrite);
16673: psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80AF >> 8), psMemWrite);
16674: }
16675: else
16676: {
16677: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80AF;
16678: *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80AF >> 8;
16679: }
16680: psMemWrite = NULL;
16681: break;
16682: }
16683: ++psMemWrite;
16684: }
16685:
16686: if (psMemWrite)
16687: {
16688: cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80AF;
16689: cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80AF >> 8);
16690: }
16691:
16692: break;
16693: }
16694: case 0xf6:
16695: {
16696: sdwCyclesRemaining -= 7;
16697: cpu.z80A |= *pbPC++;
16698: cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
16699: cpu.z80F |= bPostORFlags[cpu.z80A];
16700:
16701: break;
16702: }
16703: case 0xf7:
16704: {
16705: sdwCyclesRemaining -= 11;
16706: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16707: pbSP = (cpu.z80Base + cpu.z80sp - 1); /* Normalize the stack pointer */
16708: *pbSP-- = cpu.z80pc >> 8; /* LSB */
16709: *pbSP = (UINT8) cpu.z80pc; /* MSB */
16710: cpu.z80sp -= 2; /* Back our stack up */
16711: pbPC = cpu.z80Base + 0x30; /* Normalize the address */
16712: break;
16713: }
16714: case 0xf8:
16715: {
16716: sdwCyclesRemaining -= 5;
16717: if (cpu.z80F & Z80_FLAG_SIGN)
16718: {
16719: dwElapsedTicks += 6;
16720: pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
16721: dwAddr = *pbSP++; /* Pop LSB */
16722: dwAddr |= ((UINT32) *pbSP << 8); /* Pop MSB */
16723: cpu.z80sp += 2; /* Pop the word off */
16724: pbPC = (cpu.z80Base + dwAddr); /* Point PC to our return address */
16725: }
16726: break;
16727: }
16728: case 0xf9:
16729: {
16730: sdwCyclesRemaining -= 6;
16731: cpu.z80sp = cpu.z80HL;
16732: break;
16733: }
16734: case 0xfa:
16735: {
16736: sdwCyclesRemaining -= 10;
16737: dwAddr = *pbPC++; /* Get LSB first */
16738: dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16739: if (cpu.z80F & Z80_FLAG_SIGN)
16740: {
16741: pbPC = cpu.z80Base + dwAddr; /* Normalize the address */
16742: }
16743: break;
16744: }
16745: case 0xfb:
16746: {
16747: sdwCyclesRemaining -= 4;
16748: cpu.z80iff |= IFF1;
16749: break;
16750: }
16751: case 0xfc:
16752: {
16753: sdwCyclesRemaining -= 10;
16754: dwAddr = *pbPC++; /* Get LSB first */
16755: dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
16756: if (cpu.z80F & Z80_FLAG_SIGN)
16757: {
16758: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16759: pbSP = (cpu.z80Base + cpu.z80sp - 1); /* Normalize the stack pointer */
16760: *pbSP-- = cpu.z80pc >> 8; /* MSB */
16761: *pbSP = (UINT8) cpu.z80pc; /* LSB */
16762: cpu.z80sp -= 2; /* Back our stack up */
16763: pbPC = cpu.z80Base + dwAddr; /* Normalize the address */
16764: }
16765: break;
16766: }
16767: case 0xfd:
16768: {
16769: FDHandler();
16770: break;
16771: }
16772: case 0xfe:
16773: {
16774: sdwCyclesRemaining -= 7;
16775: cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY |
16776: Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
16777: pbSubSbcTable[((UINT32) cpu.z80A << 8) | *pbPC++];
16778: break;
16779: }
16780: case 0xff:
16781: {
16782: sdwCyclesRemaining -= 11;
16783: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16784: pbSP = (cpu.z80Base + cpu.z80sp - 1); /* Normalize the stack pointer */
16785: *pbSP-- = cpu.z80pc >> 8; /* LSB */
16786: *pbSP = (UINT8) cpu.z80pc; /* MSB */
16787: cpu.z80sp -= 2; /* Back our stack up */
16788: pbPC = cpu.z80Base + 0x38; /* Normalize the address */
16789: break;
16790: }
16791: }
16792: }
16793:
16794: dwElapsedTicks += (dwOriginalCycles - sdwCyclesRemaining);
16795:
16796: cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
16797: return(dwReturnCode); /* Indicate success */
16798: }
16799:
16800: /* Get mz80's context */
16801:
16802: void mz80GetContext(void *pData)
16803: {
16804: memcpy(pData, &cpu, sizeof(CONTEXTMZ80));
16805: }
16806:
16807: /* Set mz80's context */
16808:
16809: void mz80SetContext(void *pData)
16810: {
16811: memcpy(&cpu, pData, sizeof(CONTEXTMZ80));
16812: }
16813:
16814: /* Get mz80's context size */
16815:
16816: UINT32 mz80GetContextSize(void)
16817: {
16818: return(sizeof(CONTEXTMZ80));
16819: }
16820:
16821: /* This will return the elapsed ticks */
16822:
16823: UINT32 mz80GetElapsedTicks(UINT32 dwClear)
16824: {
16825: UINT32 dwTemp = dwElapsedTicks;
16826:
16827: if (dwClear)
16828: {
16829: dwElapsedTicks = 0;
16830: }
16831:
16832: return(dwTemp);
16833: }
16834:
16835: /* Releases mz80 from its current timeslice */
16836:
16837: void mz80ReleaseTimeslice(void)
16838: {
16839: dwOriginalCycles -= sdwCyclesRemaining;
16840: sdwCyclesRemaining = 0;
16841: }
16842:
16843: /* This routine is mz80's reset handler */
16844:
16845: void mz80reset(void)
16846: {
16847: cpu.z80halted = 0;
16848: cpu.z80AF = 0;
16849: cpu.z80F = Z80_FLAG_ZERO;
16850: cpu.z80BC = 0;
16851: cpu.z80DE = 0;
16852: cpu.z80HL = 0;
16853: cpu.z80afprime = 0;
16854: cpu.z80bcprime = 0;
16855: cpu.z80deprime = 0;
16856: cpu.z80hlprime = 0;
16857: cpu.z80i = 0;
16858: cpu.z80r = 0;
16859: cpu.z80IX = 0xffff; /* Yes, this is intentional */
16860: cpu.z80IY = 0xffff; /* Yes, this is intentional */
16861: cpu.z80pc = 0;
16862: cpu.z80sp = 0;
16863: cpu.z80interruptMode = 0;
16864: cpu.z80intAddr = 0x38;
16865: cpu.z80nmiAddr = 0x66;
16866: }
16867:
16868: /* Interrupt handler */
16869:
16870: UINT32 mz80int(UINT32 dwLowAddr)
16871: {
16872: cpu.z80halted = 0;
16873: if (0 == (cpu.z80iff & IFF1))
16874: return(0xffffffff);
16875: cpu.z80iff &= ~(IFF1 | IFF2);
16876: pbSP = (cpu.z80Base + cpu.z80sp - 1); /* Normalize the stack pointer */
16877: *pbSP-- = cpu.z80pc >> 8; /* LSB */
16878: *pbSP = (UINT8) cpu.z80pc; /* MSB */
16879: cpu.z80sp -= 2; /* Back our stack up */
16880: if (2 == cpu.z80interruptMode)
16881: {
16882: cpu.z80pc = ((UINT16) cpu.z80i << 8) | (dwLowAddr & 0xff);
16883: cpu.z80pc = ((UINT16) cpu.z80Base[cpu.z80pc + 1] << 8) | (cpu.z80Base[cpu.z80pc]);
16884: }
16885: else
16886: {
16887: cpu.z80pc = cpu.z80intAddr;
16888: }
16889: pbPC = cpu.z80Base + cpu.z80pc; /* Normalize the address */
16890: return(0);
16891: }
16892:
16893: /* NMI Handler */
16894:
16895: UINT32 mz80nmi(void)
16896: {
16897: cpu.z80halted = 0;
16898: pbSP = (cpu.z80Base + cpu.z80sp - 1); /* Normalize the stack pointer */
16899: *pbSP-- = cpu.z80pc >> 8; /* LSB */
16900: *pbSP = (UINT8) cpu.z80pc; /* MSB */
16901: cpu.z80sp -= 2; /* Back our stack up */
16902: cpu.z80pc = cpu.z80nmiAddr; /* Our NMI */
16903: return(0);
16904: }
16905:
16906: /* Initialize MZ80 for action */
16907:
16908: void mz80init(void)
16909: {
16910: UINT32 dwLoop;
16911: UINT8 *pbTempPtr;
16912: UINT8 *pbTempPtr2;
16913: UINT8 bNewAdd;
16914: UINT8 bNewSub;
16915: UINT8 bFlag;
16916: UINT8 bLow;
16917: UINT8 bHigh;
16918: UINT8 bCarry;
16919:
16920: if (NULL == pbAddAdcTable)
16921: {
16922: pbAddAdcTable = malloc(256*256*2);
16923:
16924: if (NULL == pbAddAdcTable)
16925: {
16926: return;
16927: }
16928:
16929: pbTempPtr = pbAddAdcTable;
16930:
16931: pbSubSbcTable = malloc(256*256*2);
16932:
16933: if (NULL == pbSubSbcTable)
16934: {
16935: return;
16936: }
16937:
16938: pbTempPtr2 = pbSubSbcTable;
16939:
16940: for (dwLoop = 0; dwLoop < (256*256*2); dwLoop++)
16941: {
16942: bLow = dwLoop & 0xff;
16943: bHigh = (dwLoop >> 8) & 0xff;
16944: bCarry = (dwLoop >> 16);
16945:
16946: bFlag = 0;
16947: bNewAdd = bHigh + bLow + bCarry;
16948:
16949: if (0 == bNewAdd)
16950: {
16951: bFlag |= Z80_FLAG_ZERO;
16952: }
16953: else
16954: {
16955: bFlag = bNewAdd & 0x80; /* Sign flag */
16956: }
16957:
16958: if (((UINT32) bLow + (UINT32) bHigh + (UINT32) bCarry) >= 0x100)
16959: {
16960: bFlag |= Z80_FLAG_CARRY;
16961: }
16962:
16963: if ( ((bLow ^ bHigh ^ 0x80) & (bLow ^ (bNewAdd & 0x80))) & 0x80)
16964: {
16965: bFlag |= Z80_FLAG_OVERFLOW_PARITY;
16966: }
16967:
16968: if (((bLow & 0x0f) + (bHigh & 0x0f) + bCarry) >= 0x10)
16969: {
16970: bFlag |= Z80_FLAG_HALF_CARRY;
16971: }
16972:
16973: *pbTempPtr++ = bFlag; /* Store our new flag */
16974:
16975: // Now do subtract - Zero
16976:
16977: bFlag = Z80_FLAG_NEGATIVE;
16978: bNewSub = bHigh - bLow - bCarry;
16979:
16980: if (0 == bNewSub)
16981: {
16982: bFlag |= Z80_FLAG_ZERO;
16983: }
16984: else
16985: {
16986: bFlag |= bNewSub & 0x80; /* Sign flag */
16987: }
16988:
16989: if ( ((INT32) bHigh - (INT32) bLow - (INT32) bCarry) < 0)
16990: {
16991: bFlag |= Z80_FLAG_CARRY;
16992: }
16993:
16994: if ( ((INT32) (bHigh & 0xf) - (INT32) (bLow & 0x0f) - (INT32) bCarry) < 0)
16995: {
16996: bFlag |= Z80_FLAG_HALF_CARRY;
16997: }
16998:
16999: if ( ((bLow ^ bHigh) & (bHigh ^ bNewSub) & 0x80) )
17000: {
17001: bFlag |= Z80_FLAG_OVERFLOW_PARITY;
17002: }
17003:
17004: *pbTempPtr2++ = bFlag; /* Store our sub flag */
17005:
17006: }
17007: }
17008: }
17009: /* Shut down MZ80 */
17010:
17011: void mz80shutdown(void)
17012: {
17013: }
17014:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.