Commit | Line | Data |
---|---|---|
196ba1fc PH |
1 | /* altairz80_cpu_opt.c: MITS Altair CPU (8080 and Z80)\r |
2 | \r | |
3 | Copyright (c) 2002-2008, Peter Schorn\r | |
4 | \r | |
5 | Permission is hereby granted, free of charge, to any person obtaining a\r | |
6 | copy of this software and associated documentation files (the "Software"),\r | |
7 | to deal in the Software without restriction, including without limitation\r | |
8 | the rights to use, copy, modify, merge, publish, distribute, sublicense,\r | |
9 | and/or sell copies of the Software, and to permit persons to whom the\r | |
10 | Software is furnished to do so, subject to the following conditions:\r | |
11 | \r | |
12 | The above copyright notice and this permission notice shall be included in\r | |
13 | all copies or substantial portions of the Software.\r | |
14 | \r | |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r | |
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r | |
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r | |
18 | PETER SCHORN BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r | |
19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r | |
20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r | |
21 | \r | |
22 | Except as contained in this notice, the name of Peter Schorn shall not\r | |
23 | be used in advertising or otherwise to promote the sale, use or other dealings\r | |
24 | in this Software without prior written authorization from Peter Schorn.\r | |
25 | \r | |
26 | Based on work by Charles E Owen (c) 1997\r | |
27 | Code for Z80 CPU from Frank D. Cringle ((c) 1995 under GNU license)\r | |
28 | */\r | |
29 | \r | |
30 | #include "altairz80_defs.h"\r | |
31 | \r | |
32 | #define FLAG_C 1\r | |
33 | #define FLAG_N 2\r | |
34 | #define FLAG_P 4\r | |
35 | #define FLAG_H 16\r | |
36 | #define FLAG_Z 64\r | |
37 | #define FLAG_S 128\r | |
38 | \r | |
39 | #define SETFLAG(f,c) AF = (c) ? AF | FLAG_ ## f : AF & ~FLAG_ ## f\r | |
40 | #define TSTFLAG(f) ((AF & FLAG_ ## f) != 0)\r | |
41 | \r | |
42 | #define LOW_DIGIT(x) ((x) & 0xf)\r | |
43 | #define HIGH_DIGIT(x) (((x) >> 4) & 0xf)\r | |
44 | #define LOW_REGISTER(x) ((x) & 0xff)\r | |
45 | #define HIGH_REGISTER(x) (((x) >> 8) & 0xff)\r | |
46 | \r | |
47 | #define SET_LOW_REGISTER(x, v) x = (((x) & 0xff00) | ((v) & 0xff))\r | |
48 | #define SET_HIGH_REGISTER(x, v) x = (((x) & 0xff) | (((v) & 0xff) << 8))\r | |
49 | \r | |
50 | #define PARITY(x) parityTable[(x) & 0xff]\r | |
51 | /* SET_PV and SET_PV2 are used to provide correct PARITY flag semantics for the 8080 in cases\r | |
52 | where the Z80 uses the overflow flag\r | |
53 | */\r | |
54 | #define SET_PVS(s) ((chiptype == CHIP_TYPE_Z80) ? (((cbits >> 6) ^ (cbits >> 5)) & 4) : (PARITY(s)))\r | |
55 | #define SET_PV (SET_PVS(sum))\r | |
56 | #define SET_PV2(x) ((chiptype == CHIP_TYPE_Z80) ? (((temp == (x)) << 2)) : (PARITY(temp)))\r | |
57 | \r | |
58 | /* CHECK_CPU_8080 must be invoked whenever a Z80 only instruction is executed\r | |
59 | In case a Z80 instruction is executed on an 8080 the following two cases exist:\r | |
60 | 1) Trapping is enabled: execution stops\r | |
61 | 2) Trapping is not enabled: decoding continues with the next byte\r | |
62 | */\r | |
63 | #define CHECK_CPU_8080 \\r | |
64 | if (chiptype == CHIP_TYPE_8080) { \\r | |
65 | if (cpu_unit.flags & UNIT_CPU_OPSTOP) { \\r | |
66 | reason = STOP_OPCODE; \\r | |
67 | goto end_decode; \\r | |
68 | } \\r | |
69 | else continue; \\r | |
70 | }\r | |
71 | \r | |
72 | /* CHECK_CPU_Z80 must be invoked whenever a non Z80 instruction is executed */\r | |
73 | #define CHECK_CPU_Z80 \\r | |
74 | if (cpu_unit.flags & UNIT_CPU_OPSTOP) { \\r | |
75 | reason = STOP_OPCODE; \\r | |
76 | goto end_decode; \\r | |
77 | }\r | |
78 | \r | |
79 | #define POP(x) { \\r | |
80 | register uint32 y = RAM_PP(SP); \\r | |
81 | x = y + (RAM_PP(SP) << 8); \\r | |
82 | }\r | |
83 | \r | |
84 | #define JPC(cond) { \\r | |
85 | if (cond) { \\r | |
86 | PC = GET_WORD(PC); \\r | |
87 | } \\r | |
88 | else { \\r | |
89 | PC += 2; \\r | |
90 | } \\r | |
91 | }\r | |
92 | \r | |
93 | #define CALLC(cond) { \\r | |
94 | if (cond) { \\r | |
95 | register uint32 adrr = GET_WORD(PC); \\r | |
96 | PUSH(PC + 2); \\r | |
97 | PC = adrr; \\r | |
98 | } \\r | |
99 | else { \\r | |
100 | PC += 2; \\r | |
101 | } \\r | |
102 | }\r | |
103 | \r | |
104 | /* function prototypes */\r | |
105 | t_stat sim_instr_nommu(void);\r | |
106 | \r | |
107 | extern void out(const uint32 Port, const uint32 Value);\r | |
108 | extern uint32 in(const uint32 Port);\r | |
109 | extern UNIT cpu_unit;\r | |
110 | extern uint32 PCX; /* external view of PC */\r | |
111 | extern int32 AF_S; /* AF register */\r | |
112 | extern int32 BC_S; /* BC register */\r | |
113 | extern int32 DE_S; /* DE register */\r | |
114 | extern int32 HL_S; /* HL register */\r | |
115 | extern int32 IX_S; /* IX register */\r | |
116 | extern int32 IY_S; /* IY register */\r | |
117 | extern int32 PC_S; /* program counter */\r | |
118 | extern int32 SP_S; /* SP register */\r | |
119 | extern int32 AF1_S; /* alternate AF register */\r | |
120 | extern int32 BC1_S; /* alternate BC register */\r | |
121 | extern int32 DE1_S; /* alternate DE register */\r | |
122 | extern int32 HL1_S; /* alternate HL register */\r | |
123 | extern int32 IFF_S; /* Interrupt Flip Flop */\r | |
124 | extern int32 IR_S; /* Interrupt (upper) / Refresh (lower) register */\r | |
125 | extern int32 chiptype;\r | |
126 | \r | |
127 | /* the following tables precompute some common subexpressions\r | |
128 | parityTable[i] 0..255 (number of 1's in i is odd) ? 0 : 4\r | |
129 | incTable[i] 0..256! (i & 0xa8) | (((i & 0xff) == 0) << 6) | (((i & 0xf) == 0) << 4)\r | |
130 | decTable[i] 0..255 (i & 0xa8) | (((i & 0xff) == 0) << 6) | (((i & 0xf) == 0xf) << 4) | 2\r | |
131 | cbitsTable[i] 0..511 (i & 0x10) | ((i >> 8) & 1)\r | |
132 | cbitsDup8Table[i] 0..511 (i & 0x10) | ((i >> 8) & 1) | ((i & 0xff) << 8) | (i & 0xa8) |\r | |
133 | (((i & 0xff) == 0) << 6)\r | |
134 | cbitsDup16Table[i] 0..511 (i & 0x10) | ((i >> 8) & 1) | (i & 0x28)\r | |
135 | cbits2Table[i] 0..511 (i & 0x10) | ((i >> 8) & 1) | 2\r | |
136 | rrcaTable[i] 0..255 ((i & 1) << 15) | ((i >> 1) << 8) | ((i >> 1) & 0x28) | (i & 1)\r | |
137 | rraTable[i] 0..255 ((i >> 1) << 8) | ((i >> 1) & 0x28) | (i & 1)\r | |
138 | addTable[i] 0..511 ((i & 0xff) << 8) | (i & 0xa8) | (((i & 0xff) == 0) << 6)\r | |
139 | subTable[i] 0..255 ((i & 0xff) << 8) | (i & 0xa8) | (((i & 0xff) == 0) << 6) | 2\r | |
140 | andTable[i] 0..255 (i << 8) | (i & 0xa8) | ((i == 0) << 6) | 0x10 | parityTable[i]\r | |
141 | xororTable[i] 0..255 (i << 8) | (i & 0xa8) | ((i == 0) << 6) | parityTable[i]\r | |
142 | rotateShiftTable[i] 0..255 (i & 0xa8) | (((i & 0xff) == 0) << 6) | parityTable[i & 0xff]\r | |
143 | incZ80Table[i] 0..256! (i & 0xa8) | (((i & 0xff) == 0) << 6) |\r | |
144 | (((i & 0xf) == 0) << 4) | ((i == 0x80) << 2)\r | |
145 | decZ80Table[i] 0..255 (i & 0xa8) | (((i & 0xff) == 0) << 6) |\r | |
146 | (((i & 0xf) == 0xf) << 4) | ((i == 0x7f) << 2) | 2\r | |
147 | cbitsZ80Table[i] 0..511 (i & 0x10) | (((i >> 6) ^ (i >> 5)) & 4) | ((i >> 8) & 1)\r | |
148 | cbitsZ80DupTable[i] 0..511 (i & 0x10) | (((i >> 6) ^ (i >> 5)) & 4) |\r | |
149 | ((i >> 8) & 1) | (i & 0xa8)\r | |
150 | cbits2Z80Table[i] 0..511 (i & 0x10) | (((i >> 6) ^ (i >> 5)) & 4) | ((i >> 8) & 1) | 2\r | |
151 | cbits2Z80DupTable[i] 0..511 (i & 0x10) | (((i >> 6) ^ (i >> 5)) & 4) | ((i >> 8) & 1) | 2 |\r | |
152 | (i & 0xa8)\r | |
153 | negTable[i] 0..255 (((i & 0x0f) != 0) << 4) | ((i == 0x80) << 2) | 2 | (i != 0)\r | |
154 | rrdrldTable[i] 0..255 (i << 8) | (i & 0xa8) | (((i & 0xff) == 0) << 6) | parityTable[i]\r | |
155 | cpTable[i] 0..255 (i & 0x80) | (((i & 0xff) == 0) << 6)\r | |
156 | */\r | |
157 | \r | |
158 | /* parityTable[i] = (number of 1's in i is odd) ? 0 : 4, i = 0..255 */\r | |
159 | static const uint8 parityTable[256] = {\r | |
160 | 4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,\r | |
161 | 0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,\r | |
162 | 0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,\r | |
163 | 4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,\r | |
164 | 0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,\r | |
165 | 4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,\r | |
166 | 4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,\r | |
167 | 0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,\r | |
168 | 0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,\r | |
169 | 4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,\r | |
170 | 4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,\r | |
171 | 0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,\r | |
172 | 4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,\r | |
173 | 0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,\r | |
174 | 0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,\r | |
175 | 4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,\r | |
176 | };\r | |
177 | \r | |
178 | /* incTable[i] = (i & 0xa8) | (((i & 0xff) == 0) << 6) | (((i & 0xf) == 0) << 4), i = 0..256 */\r | |
179 | static const uint8 incTable[257] = {\r | |
180 | 80, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8,\r | |
181 | 16, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8,\r | |
182 | 48, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 40, 40, 40,\r | |
183 | 48, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 40, 40, 40,\r | |
184 | 16, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8,\r | |
185 | 16, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8,\r | |
186 | 48, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 40, 40, 40,\r | |
187 | 48, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 40, 40, 40,\r | |
188 | 144,128,128,128,128,128,128,128,136,136,136,136,136,136,136,136,\r | |
189 | 144,128,128,128,128,128,128,128,136,136,136,136,136,136,136,136,\r | |
190 | 176,160,160,160,160,160,160,160,168,168,168,168,168,168,168,168,\r | |
191 | 176,160,160,160,160,160,160,160,168,168,168,168,168,168,168,168,\r | |
192 | 144,128,128,128,128,128,128,128,136,136,136,136,136,136,136,136,\r | |
193 | 144,128,128,128,128,128,128,128,136,136,136,136,136,136,136,136,\r | |
194 | 176,160,160,160,160,160,160,160,168,168,168,168,168,168,168,168,\r | |
195 | 176,160,160,160,160,160,160,160,168,168,168,168,168,168,168,168, 80\r | |
196 | };\r | |
197 | \r | |
198 | /* decTable[i] = (i & 0xa8) | (((i & 0xff) == 0) << 6) | (((i & 0xf) == 0xf) << 4) | 2, i = 0..255 */\r | |
199 | static const uint8 decTable[256] = {\r | |
200 | 66, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 26,\r | |
201 | 2, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 26,\r | |
202 | 34, 34, 34, 34, 34, 34, 34, 34, 42, 42, 42, 42, 42, 42, 42, 58,\r | |
203 | 34, 34, 34, 34, 34, 34, 34, 34, 42, 42, 42, 42, 42, 42, 42, 58,\r | |
204 | 2, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 26,\r | |
205 | 2, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 26,\r | |
206 | 34, 34, 34, 34, 34, 34, 34, 34, 42, 42, 42, 42, 42, 42, 42, 58,\r | |
207 | 34, 34, 34, 34, 34, 34, 34, 34, 42, 42, 42, 42, 42, 42, 42, 58,\r | |
208 | 130,130,130,130,130,130,130,130,138,138,138,138,138,138,138,154,\r | |
209 | 130,130,130,130,130,130,130,130,138,138,138,138,138,138,138,154,\r | |
210 | 162,162,162,162,162,162,162,162,170,170,170,170,170,170,170,186,\r | |
211 | 162,162,162,162,162,162,162,162,170,170,170,170,170,170,170,186,\r | |
212 | 130,130,130,130,130,130,130,130,138,138,138,138,138,138,138,154,\r | |
213 | 130,130,130,130,130,130,130,130,138,138,138,138,138,138,138,154,\r | |
214 | 162,162,162,162,162,162,162,162,170,170,170,170,170,170,170,186,\r | |
215 | 162,162,162,162,162,162,162,162,170,170,170,170,170,170,170,186,\r | |
216 | };\r | |
217 | \r | |
218 | /* cbitsTable[i] = (i & 0x10) | ((i >> 8) & 1), i = 0..511 */\r | |
219 | static const uint8 cbitsTable[512] = {\r | |
220 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r | |
221 | 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\r | |
222 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r | |
223 | 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\r | |
224 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r | |
225 | 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\r | |
226 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r | |
227 | 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\r | |
228 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r | |
229 | 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\r | |
230 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r | |
231 | 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\r | |
232 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r | |
233 | 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\r | |
234 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r | |
235 | 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\r | |
236 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r | |
237 | 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\r | |
238 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r | |
239 | 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\r | |
240 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r | |
241 | 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\r | |
242 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r | |
243 | 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\r | |
244 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r | |
245 | 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\r | |
246 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r | |
247 | 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\r | |
248 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r | |
249 | 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\r | |
250 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r | |
251 | 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\r | |
252 | };\r | |
253 | \r | |
254 | /* cbitsDup8Table[i] = (i & 0x10) | ((i >> 8) & 1) | ((i & 0xff) << 8) | (i & 0xa8) |\r | |
255 | (((i & 0xff) == 0) << 6), i = 0..511 */\r | |
256 | static const uint16 cbitsDup8Table[512] = {\r | |
257 | 0x0040,0x0100,0x0200,0x0300,0x0400,0x0500,0x0600,0x0700,\r | |
258 | 0x0808,0x0908,0x0a08,0x0b08,0x0c08,0x0d08,0x0e08,0x0f08,\r | |
259 | 0x1010,0x1110,0x1210,0x1310,0x1410,0x1510,0x1610,0x1710,\r | |
260 | 0x1818,0x1918,0x1a18,0x1b18,0x1c18,0x1d18,0x1e18,0x1f18,\r | |
261 | 0x2020,0x2120,0x2220,0x2320,0x2420,0x2520,0x2620,0x2720,\r | |
262 | 0x2828,0x2928,0x2a28,0x2b28,0x2c28,0x2d28,0x2e28,0x2f28,\r | |
263 | 0x3030,0x3130,0x3230,0x3330,0x3430,0x3530,0x3630,0x3730,\r | |
264 | 0x3838,0x3938,0x3a38,0x3b38,0x3c38,0x3d38,0x3e38,0x3f38,\r | |
265 | 0x4000,0x4100,0x4200,0x4300,0x4400,0x4500,0x4600,0x4700,\r | |
266 | 0x4808,0x4908,0x4a08,0x4b08,0x4c08,0x4d08,0x4e08,0x4f08,\r | |
267 | 0x5010,0x5110,0x5210,0x5310,0x5410,0x5510,0x5610,0x5710,\r | |
268 | 0x5818,0x5918,0x5a18,0x5b18,0x5c18,0x5d18,0x5e18,0x5f18,\r | |
269 | 0x6020,0x6120,0x6220,0x6320,0x6420,0x6520,0x6620,0x6720,\r | |
270 | 0x6828,0x6928,0x6a28,0x6b28,0x6c28,0x6d28,0x6e28,0x6f28,\r | |
271 | 0x7030,0x7130,0x7230,0x7330,0x7430,0x7530,0x7630,0x7730,\r | |
272 | 0x7838,0x7938,0x7a38,0x7b38,0x7c38,0x7d38,0x7e38,0x7f38,\r | |
273 | 0x8080,0x8180,0x8280,0x8380,0x8480,0x8580,0x8680,0x8780,\r | |
274 | 0x8888,0x8988,0x8a88,0x8b88,0x8c88,0x8d88,0x8e88,0x8f88,\r | |
275 | 0x9090,0x9190,0x9290,0x9390,0x9490,0x9590,0x9690,0x9790,\r | |
276 | 0x9898,0x9998,0x9a98,0x9b98,0x9c98,0x9d98,0x9e98,0x9f98,\r | |
277 | 0xa0a0,0xa1a0,0xa2a0,0xa3a0,0xa4a0,0xa5a0,0xa6a0,0xa7a0,\r | |
278 | 0xa8a8,0xa9a8,0xaaa8,0xaba8,0xaca8,0xada8,0xaea8,0xafa8,\r | |
279 | 0xb0b0,0xb1b0,0xb2b0,0xb3b0,0xb4b0,0xb5b0,0xb6b0,0xb7b0,\r | |
280 | 0xb8b8,0xb9b8,0xbab8,0xbbb8,0xbcb8,0xbdb8,0xbeb8,0xbfb8,\r | |
281 | 0xc080,0xc180,0xc280,0xc380,0xc480,0xc580,0xc680,0xc780,\r | |
282 | 0xc888,0xc988,0xca88,0xcb88,0xcc88,0xcd88,0xce88,0xcf88,\r | |
283 | 0xd090,0xd190,0xd290,0xd390,0xd490,0xd590,0xd690,0xd790,\r | |
284 | 0xd898,0xd998,0xda98,0xdb98,0xdc98,0xdd98,0xde98,0xdf98,\r | |
285 | 0xe0a0,0xe1a0,0xe2a0,0xe3a0,0xe4a0,0xe5a0,0xe6a0,0xe7a0,\r | |
286 | 0xe8a8,0xe9a8,0xeaa8,0xeba8,0xeca8,0xeda8,0xeea8,0xefa8,\r | |
287 | 0xf0b0,0xf1b0,0xf2b0,0xf3b0,0xf4b0,0xf5b0,0xf6b0,0xf7b0,\r | |
288 | 0xf8b8,0xf9b8,0xfab8,0xfbb8,0xfcb8,0xfdb8,0xfeb8,0xffb8,\r | |
289 | 0x0041,0x0101,0x0201,0x0301,0x0401,0x0501,0x0601,0x0701,\r | |
290 | 0x0809,0x0909,0x0a09,0x0b09,0x0c09,0x0d09,0x0e09,0x0f09,\r | |
291 | 0x1011,0x1111,0x1211,0x1311,0x1411,0x1511,0x1611,0x1711,\r | |
292 | 0x1819,0x1919,0x1a19,0x1b19,0x1c19,0x1d19,0x1e19,0x1f19,\r | |
293 | 0x2021,0x2121,0x2221,0x2321,0x2421,0x2521,0x2621,0x2721,\r | |
294 | 0x2829,0x2929,0x2a29,0x2b29,0x2c29,0x2d29,0x2e29,0x2f29,\r | |
295 | 0x3031,0x3131,0x3231,0x3331,0x3431,0x3531,0x3631,0x3731,\r | |
296 | 0x3839,0x3939,0x3a39,0x3b39,0x3c39,0x3d39,0x3e39,0x3f39,\r | |
297 | 0x4001,0x4101,0x4201,0x4301,0x4401,0x4501,0x4601,0x4701,\r | |
298 | 0x4809,0x4909,0x4a09,0x4b09,0x4c09,0x4d09,0x4e09,0x4f09,\r | |
299 | 0x5011,0x5111,0x5211,0x5311,0x5411,0x5511,0x5611,0x5711,\r | |
300 | 0x5819,0x5919,0x5a19,0x5b19,0x5c19,0x5d19,0x5e19,0x5f19,\r | |
301 | 0x6021,0x6121,0x6221,0x6321,0x6421,0x6521,0x6621,0x6721,\r | |
302 | 0x6829,0x6929,0x6a29,0x6b29,0x6c29,0x6d29,0x6e29,0x6f29,\r | |
303 | 0x7031,0x7131,0x7231,0x7331,0x7431,0x7531,0x7631,0x7731,\r | |
304 | 0x7839,0x7939,0x7a39,0x7b39,0x7c39,0x7d39,0x7e39,0x7f39,\r | |
305 | 0x8081,0x8181,0x8281,0x8381,0x8481,0x8581,0x8681,0x8781,\r | |
306 | 0x8889,0x8989,0x8a89,0x8b89,0x8c89,0x8d89,0x8e89,0x8f89,\r | |
307 | 0x9091,0x9191,0x9291,0x9391,0x9491,0x9591,0x9691,0x9791,\r | |
308 | 0x9899,0x9999,0x9a99,0x9b99,0x9c99,0x9d99,0x9e99,0x9f99,\r | |
309 | 0xa0a1,0xa1a1,0xa2a1,0xa3a1,0xa4a1,0xa5a1,0xa6a1,0xa7a1,\r | |
310 | 0xa8a9,0xa9a9,0xaaa9,0xaba9,0xaca9,0xada9,0xaea9,0xafa9,\r | |
311 | 0xb0b1,0xb1b1,0xb2b1,0xb3b1,0xb4b1,0xb5b1,0xb6b1,0xb7b1,\r | |
312 | 0xb8b9,0xb9b9,0xbab9,0xbbb9,0xbcb9,0xbdb9,0xbeb9,0xbfb9,\r | |
313 | 0xc081,0xc181,0xc281,0xc381,0xc481,0xc581,0xc681,0xc781,\r | |
314 | 0xc889,0xc989,0xca89,0xcb89,0xcc89,0xcd89,0xce89,0xcf89,\r | |
315 | 0xd091,0xd191,0xd291,0xd391,0xd491,0xd591,0xd691,0xd791,\r | |
316 | 0xd899,0xd999,0xda99,0xdb99,0xdc99,0xdd99,0xde99,0xdf99,\r | |
317 | 0xe0a1,0xe1a1,0xe2a1,0xe3a1,0xe4a1,0xe5a1,0xe6a1,0xe7a1,\r | |
318 | 0xe8a9,0xe9a9,0xeaa9,0xeba9,0xeca9,0xeda9,0xeea9,0xefa9,\r | |
319 | 0xf0b1,0xf1b1,0xf2b1,0xf3b1,0xf4b1,0xf5b1,0xf6b1,0xf7b1,\r | |
320 | 0xf8b9,0xf9b9,0xfab9,0xfbb9,0xfcb9,0xfdb9,0xfeb9,0xffb9,\r | |
321 | };\r | |
322 | \r | |
323 | /* cbitsDup16Table[i] = (i & 0x10) | ((i >> 8) & 1) | (i & 0x28), i = 0..511 */\r | |
324 | static const uint8 cbitsDup16Table[512] = {\r | |
325 | 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8,\r | |
326 | 16,16,16,16,16,16,16,16,24,24,24,24,24,24,24,24,\r | |
327 | 32,32,32,32,32,32,32,32,40,40,40,40,40,40,40,40,\r | |
328 | 48,48,48,48,48,48,48,48,56,56,56,56,56,56,56,56,\r | |
329 | 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8,\r | |
330 | 16,16,16,16,16,16,16,16,24,24,24,24,24,24,24,24,\r | |
331 | 32,32,32,32,32,32,32,32,40,40,40,40,40,40,40,40,\r | |
332 | 48,48,48,48,48,48,48,48,56,56,56,56,56,56,56,56,\r | |
333 | 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8,\r | |
334 | 16,16,16,16,16,16,16,16,24,24,24,24,24,24,24,24,\r | |
335 | 32,32,32,32,32,32,32,32,40,40,40,40,40,40,40,40,\r | |
336 | 48,48,48,48,48,48,48,48,56,56,56,56,56,56,56,56,\r | |
337 | 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8,\r | |
338 | 16,16,16,16,16,16,16,16,24,24,24,24,24,24,24,24,\r | |
339 | 32,32,32,32,32,32,32,32,40,40,40,40,40,40,40,40,\r | |
340 | 48,48,48,48,48,48,48,48,56,56,56,56,56,56,56,56,\r | |
341 | 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9,\r | |
342 | 17,17,17,17,17,17,17,17,25,25,25,25,25,25,25,25,\r | |
343 | 33,33,33,33,33,33,33,33,41,41,41,41,41,41,41,41,\r | |
344 | 49,49,49,49,49,49,49,49,57,57,57,57,57,57,57,57,\r | |
345 | 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9,\r | |
346 | 17,17,17,17,17,17,17,17,25,25,25,25,25,25,25,25,\r | |
347 | 33,33,33,33,33,33,33,33,41,41,41,41,41,41,41,41,\r | |
348 | 49,49,49,49,49,49,49,49,57,57,57,57,57,57,57,57,\r | |
349 | 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9,\r | |
350 | 17,17,17,17,17,17,17,17,25,25,25,25,25,25,25,25,\r | |
351 | 33,33,33,33,33,33,33,33,41,41,41,41,41,41,41,41,\r | |
352 | 49,49,49,49,49,49,49,49,57,57,57,57,57,57,57,57,\r | |
353 | 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9,\r | |
354 | 17,17,17,17,17,17,17,17,25,25,25,25,25,25,25,25,\r | |
355 | 33,33,33,33,33,33,33,33,41,41,41,41,41,41,41,41,\r | |
356 | 49,49,49,49,49,49,49,49,57,57,57,57,57,57,57,57,\r | |
357 | };\r | |
358 | \r | |
359 | /* cbits2Table[i] = (i & 0x10) | ((i >> 8) & 1) | 2, i = 0..511 */\r | |
360 | static const uint8 cbits2Table[512] = {\r | |
361 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r | |
362 | 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,\r | |
363 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r | |
364 | 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,\r | |
365 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r | |
366 | 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,\r | |
367 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r | |
368 | 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,\r | |
369 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r | |
370 | 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,\r | |
371 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r | |
372 | 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,\r | |
373 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r | |
374 | 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,\r | |
375 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r | |
376 | 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,\r | |
377 | 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\r | |
378 | 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
379 | 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\r | |
380 | 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
381 | 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\r | |
382 | 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
383 | 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\r | |
384 | 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
385 | 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\r | |
386 | 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
387 | 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\r | |
388 | 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
389 | 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\r | |
390 | 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
391 | 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\r | |
392 | 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
393 | };\r | |
394 | \r | |
395 | /* rrcaTable[i] = ((i & 1) << 15) | ((i >> 1) << 8) | ((i >> 1) & 0x28) | (i & 1), i = 0..255 */\r | |
396 | static const uint16 rrcaTable[256] = {\r | |
397 | 0x0000,0x8001,0x0100,0x8101,0x0200,0x8201,0x0300,0x8301,\r | |
398 | 0x0400,0x8401,0x0500,0x8501,0x0600,0x8601,0x0700,0x8701,\r | |
399 | 0x0808,0x8809,0x0908,0x8909,0x0a08,0x8a09,0x0b08,0x8b09,\r | |
400 | 0x0c08,0x8c09,0x0d08,0x8d09,0x0e08,0x8e09,0x0f08,0x8f09,\r | |
401 | 0x1000,0x9001,0x1100,0x9101,0x1200,0x9201,0x1300,0x9301,\r | |
402 | 0x1400,0x9401,0x1500,0x9501,0x1600,0x9601,0x1700,0x9701,\r | |
403 | 0x1808,0x9809,0x1908,0x9909,0x1a08,0x9a09,0x1b08,0x9b09,\r | |
404 | 0x1c08,0x9c09,0x1d08,0x9d09,0x1e08,0x9e09,0x1f08,0x9f09,\r | |
405 | 0x2020,0xa021,0x2120,0xa121,0x2220,0xa221,0x2320,0xa321,\r | |
406 | 0x2420,0xa421,0x2520,0xa521,0x2620,0xa621,0x2720,0xa721,\r | |
407 | 0x2828,0xa829,0x2928,0xa929,0x2a28,0xaa29,0x2b28,0xab29,\r | |
408 | 0x2c28,0xac29,0x2d28,0xad29,0x2e28,0xae29,0x2f28,0xaf29,\r | |
409 | 0x3020,0xb021,0x3120,0xb121,0x3220,0xb221,0x3320,0xb321,\r | |
410 | 0x3420,0xb421,0x3520,0xb521,0x3620,0xb621,0x3720,0xb721,\r | |
411 | 0x3828,0xb829,0x3928,0xb929,0x3a28,0xba29,0x3b28,0xbb29,\r | |
412 | 0x3c28,0xbc29,0x3d28,0xbd29,0x3e28,0xbe29,0x3f28,0xbf29,\r | |
413 | 0x4000,0xc001,0x4100,0xc101,0x4200,0xc201,0x4300,0xc301,\r | |
414 | 0x4400,0xc401,0x4500,0xc501,0x4600,0xc601,0x4700,0xc701,\r | |
415 | 0x4808,0xc809,0x4908,0xc909,0x4a08,0xca09,0x4b08,0xcb09,\r | |
416 | 0x4c08,0xcc09,0x4d08,0xcd09,0x4e08,0xce09,0x4f08,0xcf09,\r | |
417 | 0x5000,0xd001,0x5100,0xd101,0x5200,0xd201,0x5300,0xd301,\r | |
418 | 0x5400,0xd401,0x5500,0xd501,0x5600,0xd601,0x5700,0xd701,\r | |
419 | 0x5808,0xd809,0x5908,0xd909,0x5a08,0xda09,0x5b08,0xdb09,\r | |
420 | 0x5c08,0xdc09,0x5d08,0xdd09,0x5e08,0xde09,0x5f08,0xdf09,\r | |
421 | 0x6020,0xe021,0x6120,0xe121,0x6220,0xe221,0x6320,0xe321,\r | |
422 | 0x6420,0xe421,0x6520,0xe521,0x6620,0xe621,0x6720,0xe721,\r | |
423 | 0x6828,0xe829,0x6928,0xe929,0x6a28,0xea29,0x6b28,0xeb29,\r | |
424 | 0x6c28,0xec29,0x6d28,0xed29,0x6e28,0xee29,0x6f28,0xef29,\r | |
425 | 0x7020,0xf021,0x7120,0xf121,0x7220,0xf221,0x7320,0xf321,\r | |
426 | 0x7420,0xf421,0x7520,0xf521,0x7620,0xf621,0x7720,0xf721,\r | |
427 | 0x7828,0xf829,0x7928,0xf929,0x7a28,0xfa29,0x7b28,0xfb29,\r | |
428 | 0x7c28,0xfc29,0x7d28,0xfd29,0x7e28,0xfe29,0x7f28,0xff29,\r | |
429 | };\r | |
430 | \r | |
431 | /* rraTable[i] = ((i >> 1) << 8) | ((i >> 1) & 0x28) | (i & 1), i = 0..255 */\r | |
432 | static const uint16 rraTable[256] = {\r | |
433 | 0x0000,0x0001,0x0100,0x0101,0x0200,0x0201,0x0300,0x0301,\r | |
434 | 0x0400,0x0401,0x0500,0x0501,0x0600,0x0601,0x0700,0x0701,\r | |
435 | 0x0808,0x0809,0x0908,0x0909,0x0a08,0x0a09,0x0b08,0x0b09,\r | |
436 | 0x0c08,0x0c09,0x0d08,0x0d09,0x0e08,0x0e09,0x0f08,0x0f09,\r | |
437 | 0x1000,0x1001,0x1100,0x1101,0x1200,0x1201,0x1300,0x1301,\r | |
438 | 0x1400,0x1401,0x1500,0x1501,0x1600,0x1601,0x1700,0x1701,\r | |
439 | 0x1808,0x1809,0x1908,0x1909,0x1a08,0x1a09,0x1b08,0x1b09,\r | |
440 | 0x1c08,0x1c09,0x1d08,0x1d09,0x1e08,0x1e09,0x1f08,0x1f09,\r | |
441 | 0x2020,0x2021,0x2120,0x2121,0x2220,0x2221,0x2320,0x2321,\r | |
442 | 0x2420,0x2421,0x2520,0x2521,0x2620,0x2621,0x2720,0x2721,\r | |
443 | 0x2828,0x2829,0x2928,0x2929,0x2a28,0x2a29,0x2b28,0x2b29,\r | |
444 | 0x2c28,0x2c29,0x2d28,0x2d29,0x2e28,0x2e29,0x2f28,0x2f29,\r | |
445 | 0x3020,0x3021,0x3120,0x3121,0x3220,0x3221,0x3320,0x3321,\r | |
446 | 0x3420,0x3421,0x3520,0x3521,0x3620,0x3621,0x3720,0x3721,\r | |
447 | 0x3828,0x3829,0x3928,0x3929,0x3a28,0x3a29,0x3b28,0x3b29,\r | |
448 | 0x3c28,0x3c29,0x3d28,0x3d29,0x3e28,0x3e29,0x3f28,0x3f29,\r | |
449 | 0x4000,0x4001,0x4100,0x4101,0x4200,0x4201,0x4300,0x4301,\r | |
450 | 0x4400,0x4401,0x4500,0x4501,0x4600,0x4601,0x4700,0x4701,\r | |
451 | 0x4808,0x4809,0x4908,0x4909,0x4a08,0x4a09,0x4b08,0x4b09,\r | |
452 | 0x4c08,0x4c09,0x4d08,0x4d09,0x4e08,0x4e09,0x4f08,0x4f09,\r | |
453 | 0x5000,0x5001,0x5100,0x5101,0x5200,0x5201,0x5300,0x5301,\r | |
454 | 0x5400,0x5401,0x5500,0x5501,0x5600,0x5601,0x5700,0x5701,\r | |
455 | 0x5808,0x5809,0x5908,0x5909,0x5a08,0x5a09,0x5b08,0x5b09,\r | |
456 | 0x5c08,0x5c09,0x5d08,0x5d09,0x5e08,0x5e09,0x5f08,0x5f09,\r | |
457 | 0x6020,0x6021,0x6120,0x6121,0x6220,0x6221,0x6320,0x6321,\r | |
458 | 0x6420,0x6421,0x6520,0x6521,0x6620,0x6621,0x6720,0x6721,\r | |
459 | 0x6828,0x6829,0x6928,0x6929,0x6a28,0x6a29,0x6b28,0x6b29,\r | |
460 | 0x6c28,0x6c29,0x6d28,0x6d29,0x6e28,0x6e29,0x6f28,0x6f29,\r | |
461 | 0x7020,0x7021,0x7120,0x7121,0x7220,0x7221,0x7320,0x7321,\r | |
462 | 0x7420,0x7421,0x7520,0x7521,0x7620,0x7621,0x7720,0x7721,\r | |
463 | 0x7828,0x7829,0x7928,0x7929,0x7a28,0x7a29,0x7b28,0x7b29,\r | |
464 | 0x7c28,0x7c29,0x7d28,0x7d29,0x7e28,0x7e29,0x7f28,0x7f29,\r | |
465 | };\r | |
466 | \r | |
467 | /* addTable[i] = ((i & 0xff) << 8) | (i & 0xa8) | (((i & 0xff) == 0) << 6), i = 0..511 */\r | |
468 | static const uint16 addTable[512] = {\r | |
469 | 0x0040,0x0100,0x0200,0x0300,0x0400,0x0500,0x0600,0x0700,\r | |
470 | 0x0808,0x0908,0x0a08,0x0b08,0x0c08,0x0d08,0x0e08,0x0f08,\r | |
471 | 0x1000,0x1100,0x1200,0x1300,0x1400,0x1500,0x1600,0x1700,\r | |
472 | 0x1808,0x1908,0x1a08,0x1b08,0x1c08,0x1d08,0x1e08,0x1f08,\r | |
473 | 0x2020,0x2120,0x2220,0x2320,0x2420,0x2520,0x2620,0x2720,\r | |
474 | 0x2828,0x2928,0x2a28,0x2b28,0x2c28,0x2d28,0x2e28,0x2f28,\r | |
475 | 0x3020,0x3120,0x3220,0x3320,0x3420,0x3520,0x3620,0x3720,\r | |
476 | 0x3828,0x3928,0x3a28,0x3b28,0x3c28,0x3d28,0x3e28,0x3f28,\r | |
477 | 0x4000,0x4100,0x4200,0x4300,0x4400,0x4500,0x4600,0x4700,\r | |
478 | 0x4808,0x4908,0x4a08,0x4b08,0x4c08,0x4d08,0x4e08,0x4f08,\r | |
479 | 0x5000,0x5100,0x5200,0x5300,0x5400,0x5500,0x5600,0x5700,\r | |
480 | 0x5808,0x5908,0x5a08,0x5b08,0x5c08,0x5d08,0x5e08,0x5f08,\r | |
481 | 0x6020,0x6120,0x6220,0x6320,0x6420,0x6520,0x6620,0x6720,\r | |
482 | 0x6828,0x6928,0x6a28,0x6b28,0x6c28,0x6d28,0x6e28,0x6f28,\r | |
483 | 0x7020,0x7120,0x7220,0x7320,0x7420,0x7520,0x7620,0x7720,\r | |
484 | 0x7828,0x7928,0x7a28,0x7b28,0x7c28,0x7d28,0x7e28,0x7f28,\r | |
485 | 0x8080,0x8180,0x8280,0x8380,0x8480,0x8580,0x8680,0x8780,\r | |
486 | 0x8888,0x8988,0x8a88,0x8b88,0x8c88,0x8d88,0x8e88,0x8f88,\r | |
487 | 0x9080,0x9180,0x9280,0x9380,0x9480,0x9580,0x9680,0x9780,\r | |
488 | 0x9888,0x9988,0x9a88,0x9b88,0x9c88,0x9d88,0x9e88,0x9f88,\r | |
489 | 0xa0a0,0xa1a0,0xa2a0,0xa3a0,0xa4a0,0xa5a0,0xa6a0,0xa7a0,\r | |
490 | 0xa8a8,0xa9a8,0xaaa8,0xaba8,0xaca8,0xada8,0xaea8,0xafa8,\r | |
491 | 0xb0a0,0xb1a0,0xb2a0,0xb3a0,0xb4a0,0xb5a0,0xb6a0,0xb7a0,\r | |
492 | 0xb8a8,0xb9a8,0xbaa8,0xbba8,0xbca8,0xbda8,0xbea8,0xbfa8,\r | |
493 | 0xc080,0xc180,0xc280,0xc380,0xc480,0xc580,0xc680,0xc780,\r | |
494 | 0xc888,0xc988,0xca88,0xcb88,0xcc88,0xcd88,0xce88,0xcf88,\r | |
495 | 0xd080,0xd180,0xd280,0xd380,0xd480,0xd580,0xd680,0xd780,\r | |
496 | 0xd888,0xd988,0xda88,0xdb88,0xdc88,0xdd88,0xde88,0xdf88,\r | |
497 | 0xe0a0,0xe1a0,0xe2a0,0xe3a0,0xe4a0,0xe5a0,0xe6a0,0xe7a0,\r | |
498 | 0xe8a8,0xe9a8,0xeaa8,0xeba8,0xeca8,0xeda8,0xeea8,0xefa8,\r | |
499 | 0xf0a0,0xf1a0,0xf2a0,0xf3a0,0xf4a0,0xf5a0,0xf6a0,0xf7a0,\r | |
500 | 0xf8a8,0xf9a8,0xfaa8,0xfba8,0xfca8,0xfda8,0xfea8,0xffa8,\r | |
501 | 0x0040,0x0100,0x0200,0x0300,0x0400,0x0500,0x0600,0x0700,\r | |
502 | 0x0808,0x0908,0x0a08,0x0b08,0x0c08,0x0d08,0x0e08,0x0f08,\r | |
503 | 0x1000,0x1100,0x1200,0x1300,0x1400,0x1500,0x1600,0x1700,\r | |
504 | 0x1808,0x1908,0x1a08,0x1b08,0x1c08,0x1d08,0x1e08,0x1f08,\r | |
505 | 0x2020,0x2120,0x2220,0x2320,0x2420,0x2520,0x2620,0x2720,\r | |
506 | 0x2828,0x2928,0x2a28,0x2b28,0x2c28,0x2d28,0x2e28,0x2f28,\r | |
507 | 0x3020,0x3120,0x3220,0x3320,0x3420,0x3520,0x3620,0x3720,\r | |
508 | 0x3828,0x3928,0x3a28,0x3b28,0x3c28,0x3d28,0x3e28,0x3f28,\r | |
509 | 0x4000,0x4100,0x4200,0x4300,0x4400,0x4500,0x4600,0x4700,\r | |
510 | 0x4808,0x4908,0x4a08,0x4b08,0x4c08,0x4d08,0x4e08,0x4f08,\r | |
511 | 0x5000,0x5100,0x5200,0x5300,0x5400,0x5500,0x5600,0x5700,\r | |
512 | 0x5808,0x5908,0x5a08,0x5b08,0x5c08,0x5d08,0x5e08,0x5f08,\r | |
513 | 0x6020,0x6120,0x6220,0x6320,0x6420,0x6520,0x6620,0x6720,\r | |
514 | 0x6828,0x6928,0x6a28,0x6b28,0x6c28,0x6d28,0x6e28,0x6f28,\r | |
515 | 0x7020,0x7120,0x7220,0x7320,0x7420,0x7520,0x7620,0x7720,\r | |
516 | 0x7828,0x7928,0x7a28,0x7b28,0x7c28,0x7d28,0x7e28,0x7f28,\r | |
517 | 0x8080,0x8180,0x8280,0x8380,0x8480,0x8580,0x8680,0x8780,\r | |
518 | 0x8888,0x8988,0x8a88,0x8b88,0x8c88,0x8d88,0x8e88,0x8f88,\r | |
519 | 0x9080,0x9180,0x9280,0x9380,0x9480,0x9580,0x9680,0x9780,\r | |
520 | 0x9888,0x9988,0x9a88,0x9b88,0x9c88,0x9d88,0x9e88,0x9f88,\r | |
521 | 0xa0a0,0xa1a0,0xa2a0,0xa3a0,0xa4a0,0xa5a0,0xa6a0,0xa7a0,\r | |
522 | 0xa8a8,0xa9a8,0xaaa8,0xaba8,0xaca8,0xada8,0xaea8,0xafa8,\r | |
523 | 0xb0a0,0xb1a0,0xb2a0,0xb3a0,0xb4a0,0xb5a0,0xb6a0,0xb7a0,\r | |
524 | 0xb8a8,0xb9a8,0xbaa8,0xbba8,0xbca8,0xbda8,0xbea8,0xbfa8,\r | |
525 | 0xc080,0xc180,0xc280,0xc380,0xc480,0xc580,0xc680,0xc780,\r | |
526 | 0xc888,0xc988,0xca88,0xcb88,0xcc88,0xcd88,0xce88,0xcf88,\r | |
527 | 0xd080,0xd180,0xd280,0xd380,0xd480,0xd580,0xd680,0xd780,\r | |
528 | 0xd888,0xd988,0xda88,0xdb88,0xdc88,0xdd88,0xde88,0xdf88,\r | |
529 | 0xe0a0,0xe1a0,0xe2a0,0xe3a0,0xe4a0,0xe5a0,0xe6a0,0xe7a0,\r | |
530 | 0xe8a8,0xe9a8,0xeaa8,0xeba8,0xeca8,0xeda8,0xeea8,0xefa8,\r | |
531 | 0xf0a0,0xf1a0,0xf2a0,0xf3a0,0xf4a0,0xf5a0,0xf6a0,0xf7a0,\r | |
532 | 0xf8a8,0xf9a8,0xfaa8,0xfba8,0xfca8,0xfda8,0xfea8,0xffa8,\r | |
533 | };\r | |
534 | \r | |
535 | /* subTable[i] = ((i & 0xff) << 8) | (i & 0xa8) | (((i & 0xff) == 0) << 6) | 2, i = 0..255 */\r | |
536 | static const uint16 subTable[256] = {\r | |
537 | 0x0042,0x0102,0x0202,0x0302,0x0402,0x0502,0x0602,0x0702,\r | |
538 | 0x080a,0x090a,0x0a0a,0x0b0a,0x0c0a,0x0d0a,0x0e0a,0x0f0a,\r | |
539 | 0x1002,0x1102,0x1202,0x1302,0x1402,0x1502,0x1602,0x1702,\r | |
540 | 0x180a,0x190a,0x1a0a,0x1b0a,0x1c0a,0x1d0a,0x1e0a,0x1f0a,\r | |
541 | 0x2022,0x2122,0x2222,0x2322,0x2422,0x2522,0x2622,0x2722,\r | |
542 | 0x282a,0x292a,0x2a2a,0x2b2a,0x2c2a,0x2d2a,0x2e2a,0x2f2a,\r | |
543 | 0x3022,0x3122,0x3222,0x3322,0x3422,0x3522,0x3622,0x3722,\r | |
544 | 0x382a,0x392a,0x3a2a,0x3b2a,0x3c2a,0x3d2a,0x3e2a,0x3f2a,\r | |
545 | 0x4002,0x4102,0x4202,0x4302,0x4402,0x4502,0x4602,0x4702,\r | |
546 | 0x480a,0x490a,0x4a0a,0x4b0a,0x4c0a,0x4d0a,0x4e0a,0x4f0a,\r | |
547 | 0x5002,0x5102,0x5202,0x5302,0x5402,0x5502,0x5602,0x5702,\r | |
548 | 0x580a,0x590a,0x5a0a,0x5b0a,0x5c0a,0x5d0a,0x5e0a,0x5f0a,\r | |
549 | 0x6022,0x6122,0x6222,0x6322,0x6422,0x6522,0x6622,0x6722,\r | |
550 | 0x682a,0x692a,0x6a2a,0x6b2a,0x6c2a,0x6d2a,0x6e2a,0x6f2a,\r | |
551 | 0x7022,0x7122,0x7222,0x7322,0x7422,0x7522,0x7622,0x7722,\r | |
552 | 0x782a,0x792a,0x7a2a,0x7b2a,0x7c2a,0x7d2a,0x7e2a,0x7f2a,\r | |
553 | 0x8082,0x8182,0x8282,0x8382,0x8482,0x8582,0x8682,0x8782,\r | |
554 | 0x888a,0x898a,0x8a8a,0x8b8a,0x8c8a,0x8d8a,0x8e8a,0x8f8a,\r | |
555 | 0x9082,0x9182,0x9282,0x9382,0x9482,0x9582,0x9682,0x9782,\r | |
556 | 0x988a,0x998a,0x9a8a,0x9b8a,0x9c8a,0x9d8a,0x9e8a,0x9f8a,\r | |
557 | 0xa0a2,0xa1a2,0xa2a2,0xa3a2,0xa4a2,0xa5a2,0xa6a2,0xa7a2,\r | |
558 | 0xa8aa,0xa9aa,0xaaaa,0xabaa,0xacaa,0xadaa,0xaeaa,0xafaa,\r | |
559 | 0xb0a2,0xb1a2,0xb2a2,0xb3a2,0xb4a2,0xb5a2,0xb6a2,0xb7a2,\r | |
560 | 0xb8aa,0xb9aa,0xbaaa,0xbbaa,0xbcaa,0xbdaa,0xbeaa,0xbfaa,\r | |
561 | 0xc082,0xc182,0xc282,0xc382,0xc482,0xc582,0xc682,0xc782,\r | |
562 | 0xc88a,0xc98a,0xca8a,0xcb8a,0xcc8a,0xcd8a,0xce8a,0xcf8a,\r | |
563 | 0xd082,0xd182,0xd282,0xd382,0xd482,0xd582,0xd682,0xd782,\r | |
564 | 0xd88a,0xd98a,0xda8a,0xdb8a,0xdc8a,0xdd8a,0xde8a,0xdf8a,\r | |
565 | 0xe0a2,0xe1a2,0xe2a2,0xe3a2,0xe4a2,0xe5a2,0xe6a2,0xe7a2,\r | |
566 | 0xe8aa,0xe9aa,0xeaaa,0xebaa,0xecaa,0xedaa,0xeeaa,0xefaa,\r | |
567 | 0xf0a2,0xf1a2,0xf2a2,0xf3a2,0xf4a2,0xf5a2,0xf6a2,0xf7a2,\r | |
568 | 0xf8aa,0xf9aa,0xfaaa,0xfbaa,0xfcaa,0xfdaa,0xfeaa,0xffaa,\r | |
569 | };\r | |
570 | \r | |
571 | /* andTable[i] = (i << 8) | (i & 0xa8) | ((i == 0) << 6) | 0x10 | parityTable[i], i = 0..255 */\r | |
572 | static const uint16 andTable[256] = {\r | |
573 | 0x0054,0x0110,0x0210,0x0314,0x0410,0x0514,0x0614,0x0710,\r | |
574 | 0x0818,0x091c,0x0a1c,0x0b18,0x0c1c,0x0d18,0x0e18,0x0f1c,\r | |
575 | 0x1010,0x1114,0x1214,0x1310,0x1414,0x1510,0x1610,0x1714,\r | |
576 | 0x181c,0x1918,0x1a18,0x1b1c,0x1c18,0x1d1c,0x1e1c,0x1f18,\r | |
577 | 0x2030,0x2134,0x2234,0x2330,0x2434,0x2530,0x2630,0x2734,\r | |
578 | 0x283c,0x2938,0x2a38,0x2b3c,0x2c38,0x2d3c,0x2e3c,0x2f38,\r | |
579 | 0x3034,0x3130,0x3230,0x3334,0x3430,0x3534,0x3634,0x3730,\r | |
580 | 0x3838,0x393c,0x3a3c,0x3b38,0x3c3c,0x3d38,0x3e38,0x3f3c,\r | |
581 | 0x4010,0x4114,0x4214,0x4310,0x4414,0x4510,0x4610,0x4714,\r | |
582 | 0x481c,0x4918,0x4a18,0x4b1c,0x4c18,0x4d1c,0x4e1c,0x4f18,\r | |
583 | 0x5014,0x5110,0x5210,0x5314,0x5410,0x5514,0x5614,0x5710,\r | |
584 | 0x5818,0x591c,0x5a1c,0x5b18,0x5c1c,0x5d18,0x5e18,0x5f1c,\r | |
585 | 0x6034,0x6130,0x6230,0x6334,0x6430,0x6534,0x6634,0x6730,\r | |
586 | 0x6838,0x693c,0x6a3c,0x6b38,0x6c3c,0x6d38,0x6e38,0x6f3c,\r | |
587 | 0x7030,0x7134,0x7234,0x7330,0x7434,0x7530,0x7630,0x7734,\r | |
588 | 0x783c,0x7938,0x7a38,0x7b3c,0x7c38,0x7d3c,0x7e3c,0x7f38,\r | |
589 | 0x8090,0x8194,0x8294,0x8390,0x8494,0x8590,0x8690,0x8794,\r | |
590 | 0x889c,0x8998,0x8a98,0x8b9c,0x8c98,0x8d9c,0x8e9c,0x8f98,\r | |
591 | 0x9094,0x9190,0x9290,0x9394,0x9490,0x9594,0x9694,0x9790,\r | |
592 | 0x9898,0x999c,0x9a9c,0x9b98,0x9c9c,0x9d98,0x9e98,0x9f9c,\r | |
593 | 0xa0b4,0xa1b0,0xa2b0,0xa3b4,0xa4b0,0xa5b4,0xa6b4,0xa7b0,\r | |
594 | 0xa8b8,0xa9bc,0xaabc,0xabb8,0xacbc,0xadb8,0xaeb8,0xafbc,\r | |
595 | 0xb0b0,0xb1b4,0xb2b4,0xb3b0,0xb4b4,0xb5b0,0xb6b0,0xb7b4,\r | |
596 | 0xb8bc,0xb9b8,0xbab8,0xbbbc,0xbcb8,0xbdbc,0xbebc,0xbfb8,\r | |
597 | 0xc094,0xc190,0xc290,0xc394,0xc490,0xc594,0xc694,0xc790,\r | |
598 | 0xc898,0xc99c,0xca9c,0xcb98,0xcc9c,0xcd98,0xce98,0xcf9c,\r | |
599 | 0xd090,0xd194,0xd294,0xd390,0xd494,0xd590,0xd690,0xd794,\r | |
600 | 0xd89c,0xd998,0xda98,0xdb9c,0xdc98,0xdd9c,0xde9c,0xdf98,\r | |
601 | 0xe0b0,0xe1b4,0xe2b4,0xe3b0,0xe4b4,0xe5b0,0xe6b0,0xe7b4,\r | |
602 | 0xe8bc,0xe9b8,0xeab8,0xebbc,0xecb8,0xedbc,0xeebc,0xefb8,\r | |
603 | 0xf0b4,0xf1b0,0xf2b0,0xf3b4,0xf4b0,0xf5b4,0xf6b4,0xf7b0,\r | |
604 | 0xf8b8,0xf9bc,0xfabc,0xfbb8,0xfcbc,0xfdb8,0xfeb8,0xffbc,\r | |
605 | };\r | |
606 | \r | |
607 | /* xororTable[i] = (i << 8) | (i & 0xa8) | ((i == 0) << 6) | parityTable[i], i = 0..255 */\r | |
608 | static const uint16 xororTable[256] = {\r | |
609 | 0x0044,0x0100,0x0200,0x0304,0x0400,0x0504,0x0604,0x0700,\r | |
610 | 0x0808,0x090c,0x0a0c,0x0b08,0x0c0c,0x0d08,0x0e08,0x0f0c,\r | |
611 | 0x1000,0x1104,0x1204,0x1300,0x1404,0x1500,0x1600,0x1704,\r | |
612 | 0x180c,0x1908,0x1a08,0x1b0c,0x1c08,0x1d0c,0x1e0c,0x1f08,\r | |
613 | 0x2020,0x2124,0x2224,0x2320,0x2424,0x2520,0x2620,0x2724,\r | |
614 | 0x282c,0x2928,0x2a28,0x2b2c,0x2c28,0x2d2c,0x2e2c,0x2f28,\r | |
615 | 0x3024,0x3120,0x3220,0x3324,0x3420,0x3524,0x3624,0x3720,\r | |
616 | 0x3828,0x392c,0x3a2c,0x3b28,0x3c2c,0x3d28,0x3e28,0x3f2c,\r | |
617 | 0x4000,0x4104,0x4204,0x4300,0x4404,0x4500,0x4600,0x4704,\r | |
618 | 0x480c,0x4908,0x4a08,0x4b0c,0x4c08,0x4d0c,0x4e0c,0x4f08,\r | |
619 | 0x5004,0x5100,0x5200,0x5304,0x5400,0x5504,0x5604,0x5700,\r | |
620 | 0x5808,0x590c,0x5a0c,0x5b08,0x5c0c,0x5d08,0x5e08,0x5f0c,\r | |
621 | 0x6024,0x6120,0x6220,0x6324,0x6420,0x6524,0x6624,0x6720,\r | |
622 | 0x6828,0x692c,0x6a2c,0x6b28,0x6c2c,0x6d28,0x6e28,0x6f2c,\r | |
623 | 0x7020,0x7124,0x7224,0x7320,0x7424,0x7520,0x7620,0x7724,\r | |
624 | 0x782c,0x7928,0x7a28,0x7b2c,0x7c28,0x7d2c,0x7e2c,0x7f28,\r | |
625 | 0x8080,0x8184,0x8284,0x8380,0x8484,0x8580,0x8680,0x8784,\r | |
626 | 0x888c,0x8988,0x8a88,0x8b8c,0x8c88,0x8d8c,0x8e8c,0x8f88,\r | |
627 | 0x9084,0x9180,0x9280,0x9384,0x9480,0x9584,0x9684,0x9780,\r | |
628 | 0x9888,0x998c,0x9a8c,0x9b88,0x9c8c,0x9d88,0x9e88,0x9f8c,\r | |
629 | 0xa0a4,0xa1a0,0xa2a0,0xa3a4,0xa4a0,0xa5a4,0xa6a4,0xa7a0,\r | |
630 | 0xa8a8,0xa9ac,0xaaac,0xaba8,0xacac,0xada8,0xaea8,0xafac,\r | |
631 | 0xb0a0,0xb1a4,0xb2a4,0xb3a0,0xb4a4,0xb5a0,0xb6a0,0xb7a4,\r | |
632 | 0xb8ac,0xb9a8,0xbaa8,0xbbac,0xbca8,0xbdac,0xbeac,0xbfa8,\r | |
633 | 0xc084,0xc180,0xc280,0xc384,0xc480,0xc584,0xc684,0xc780,\r | |
634 | 0xc888,0xc98c,0xca8c,0xcb88,0xcc8c,0xcd88,0xce88,0xcf8c,\r | |
635 | 0xd080,0xd184,0xd284,0xd380,0xd484,0xd580,0xd680,0xd784,\r | |
636 | 0xd88c,0xd988,0xda88,0xdb8c,0xdc88,0xdd8c,0xde8c,0xdf88,\r | |
637 | 0xe0a0,0xe1a4,0xe2a4,0xe3a0,0xe4a4,0xe5a0,0xe6a0,0xe7a4,\r | |
638 | 0xe8ac,0xe9a8,0xeaa8,0xebac,0xeca8,0xedac,0xeeac,0xefa8,\r | |
639 | 0xf0a4,0xf1a0,0xf2a0,0xf3a4,0xf4a0,0xf5a4,0xf6a4,0xf7a0,\r | |
640 | 0xf8a8,0xf9ac,0xfaac,0xfba8,0xfcac,0xfda8,0xfea8,0xffac,\r | |
641 | };\r | |
642 | \r | |
643 | /* rotateShiftTable[i] = (i & 0xa8) | (((i & 0xff) == 0) << 6) | parityTable[i & 0xff], i = 0..255 */\r | |
644 | static const uint8 rotateShiftTable[256] = {\r | |
645 | 68, 0, 0, 4, 0, 4, 4, 0, 8, 12, 12, 8, 12, 8, 8, 12,\r | |
646 | 0, 4, 4, 0, 4, 0, 0, 4, 12, 8, 8, 12, 8, 12, 12, 8,\r | |
647 | 32, 36, 36, 32, 36, 32, 32, 36, 44, 40, 40, 44, 40, 44, 44, 40,\r | |
648 | 36, 32, 32, 36, 32, 36, 36, 32, 40, 44, 44, 40, 44, 40, 40, 44,\r | |
649 | 0, 4, 4, 0, 4, 0, 0, 4, 12, 8, 8, 12, 8, 12, 12, 8,\r | |
650 | 4, 0, 0, 4, 0, 4, 4, 0, 8, 12, 12, 8, 12, 8, 8, 12,\r | |
651 | 36, 32, 32, 36, 32, 36, 36, 32, 40, 44, 44, 40, 44, 40, 40, 44,\r | |
652 | 32, 36, 36, 32, 36, 32, 32, 36, 44, 40, 40, 44, 40, 44, 44, 40,\r | |
653 | 128,132,132,128,132,128,128,132,140,136,136,140,136,140,140,136,\r | |
654 | 132,128,128,132,128,132,132,128,136,140,140,136,140,136,136,140,\r | |
655 | 164,160,160,164,160,164,164,160,168,172,172,168,172,168,168,172,\r | |
656 | 160,164,164,160,164,160,160,164,172,168,168,172,168,172,172,168,\r | |
657 | 132,128,128,132,128,132,132,128,136,140,140,136,140,136,136,140,\r | |
658 | 128,132,132,128,132,128,128,132,140,136,136,140,136,140,140,136,\r | |
659 | 160,164,164,160,164,160,160,164,172,168,168,172,168,172,172,168,\r | |
660 | 164,160,160,164,160,164,164,160,168,172,172,168,172,168,168,172,\r | |
661 | };\r | |
662 | \r | |
663 | /* incZ80Table[i] = (i & 0xa8) | (((i & 0xff) == 0) << 6) |\r | |
664 | (((i & 0xf) == 0) << 4) | ((i == 0x80) << 2), i = 0..256 */\r | |
665 | static const uint8 incZ80Table[257] = {\r | |
666 | 80, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8,\r | |
667 | 16, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8,\r | |
668 | 48, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 40, 40, 40,\r | |
669 | 48, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 40, 40, 40,\r | |
670 | 16, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8,\r | |
671 | 16, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8,\r | |
672 | 48, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 40, 40, 40,\r | |
673 | 48, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 40, 40, 40,\r | |
674 | 148,128,128,128,128,128,128,128,136,136,136,136,136,136,136,136,\r | |
675 | 144,128,128,128,128,128,128,128,136,136,136,136,136,136,136,136,\r | |
676 | 176,160,160,160,160,160,160,160,168,168,168,168,168,168,168,168,\r | |
677 | 176,160,160,160,160,160,160,160,168,168,168,168,168,168,168,168,\r | |
678 | 144,128,128,128,128,128,128,128,136,136,136,136,136,136,136,136,\r | |
679 | 144,128,128,128,128,128,128,128,136,136,136,136,136,136,136,136,\r | |
680 | 176,160,160,160,160,160,160,160,168,168,168,168,168,168,168,168,\r | |
681 | 176,160,160,160,160,160,160,160,168,168,168,168,168,168,168,168, 80,\r | |
682 | };\r | |
683 | \r | |
684 | /* decZ80Table[i] = (i & 0xa8) | (((i & 0xff) == 0) << 6) |\r | |
685 | (((i & 0xf) == 0xf) << 4) | ((i == 0x7f) << 2) | 2, i = 0..255 */\r | |
686 | static const uint8 decZ80Table[256] = {\r | |
687 | 66, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 26,\r | |
688 | 2, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 26,\r | |
689 | 34, 34, 34, 34, 34, 34, 34, 34, 42, 42, 42, 42, 42, 42, 42, 58,\r | |
690 | 34, 34, 34, 34, 34, 34, 34, 34, 42, 42, 42, 42, 42, 42, 42, 58,\r | |
691 | 2, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 26,\r | |
692 | 2, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 26,\r | |
693 | 34, 34, 34, 34, 34, 34, 34, 34, 42, 42, 42, 42, 42, 42, 42, 58,\r | |
694 | 34, 34, 34, 34, 34, 34, 34, 34, 42, 42, 42, 42, 42, 42, 42, 62,\r | |
695 | 130,130,130,130,130,130,130,130,138,138,138,138,138,138,138,154,\r | |
696 | 130,130,130,130,130,130,130,130,138,138,138,138,138,138,138,154,\r | |
697 | 162,162,162,162,162,162,162,162,170,170,170,170,170,170,170,186,\r | |
698 | 162,162,162,162,162,162,162,162,170,170,170,170,170,170,170,186,\r | |
699 | 130,130,130,130,130,130,130,130,138,138,138,138,138,138,138,154,\r | |
700 | 130,130,130,130,130,130,130,130,138,138,138,138,138,138,138,154,\r | |
701 | 162,162,162,162,162,162,162,162,170,170,170,170,170,170,170,186,\r | |
702 | 162,162,162,162,162,162,162,162,170,170,170,170,170,170,170,186,\r | |
703 | };\r | |
704 | \r | |
705 | /* cbitsZ80Table[i] = (i & 0x10) | (((i >> 6) ^ (i >> 5)) & 4) | ((i >> 8) & 1), i = 0..511 */\r | |
706 | static const uint8 cbitsZ80Table[512] = {\r | |
707 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r | |
708 | 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\r | |
709 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r | |
710 | 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\r | |
711 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r | |
712 | 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\r | |
713 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r | |
714 | 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\r | |
715 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\r | |
716 | 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,\r | |
717 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\r | |
718 | 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,\r | |
719 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\r | |
720 | 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,\r | |
721 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\r | |
722 | 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,\r | |
723 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r | |
724 | 21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,\r | |
725 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r | |
726 | 21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,\r | |
727 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r | |
728 | 21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,\r | |
729 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r | |
730 | 21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,\r | |
731 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r | |
732 | 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\r | |
733 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r | |
734 | 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\r | |
735 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r | |
736 | 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\r | |
737 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r | |
738 | 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\r | |
739 | };\r | |
740 | \r | |
741 | /* cbitsZ80DupTable[i] = (i & 0x10) | (((i >> 6) ^ (i >> 5)) & 4) |\r | |
742 | ((i >> 8) & 1) | (i & 0xa8), i = 0..511 */\r | |
743 | static const uint8 cbitsZ80DupTable[512] = {\r | |
744 | 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8,\r | |
745 | 16, 16, 16, 16, 16, 16, 16, 16, 24, 24, 24, 24, 24, 24, 24, 24,\r | |
746 | 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 40, 40, 40,\r | |
747 | 48, 48, 48, 48, 48, 48, 48, 48, 56, 56, 56, 56, 56, 56, 56, 56,\r | |
748 | 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8,\r | |
749 | 16, 16, 16, 16, 16, 16, 16, 16, 24, 24, 24, 24, 24, 24, 24, 24,\r | |
750 | 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 40, 40, 40,\r | |
751 | 48, 48, 48, 48, 48, 48, 48, 48, 56, 56, 56, 56, 56, 56, 56, 56,\r | |
752 | 132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,140,\r | |
753 | 148,148,148,148,148,148,148,148,156,156,156,156,156,156,156,156,\r | |
754 | 164,164,164,164,164,164,164,164,172,172,172,172,172,172,172,172,\r | |
755 | 180,180,180,180,180,180,180,180,188,188,188,188,188,188,188,188,\r | |
756 | 132,132,132,132,132,132,132,132,140,140,140,140,140,140,140,140,\r | |
757 | 148,148,148,148,148,148,148,148,156,156,156,156,156,156,156,156,\r | |
758 | 164,164,164,164,164,164,164,164,172,172,172,172,172,172,172,172,\r | |
759 | 180,180,180,180,180,180,180,180,188,188,188,188,188,188,188,188,\r | |
760 | 5, 5, 5, 5, 5, 5, 5, 5, 13, 13, 13, 13, 13, 13, 13, 13,\r | |
761 | 21, 21, 21, 21, 21, 21, 21, 21, 29, 29, 29, 29, 29, 29, 29, 29,\r | |
762 | 37, 37, 37, 37, 37, 37, 37, 37, 45, 45, 45, 45, 45, 45, 45, 45,\r | |
763 | 53, 53, 53, 53, 53, 53, 53, 53, 61, 61, 61, 61, 61, 61, 61, 61,\r | |
764 | 5, 5, 5, 5, 5, 5, 5, 5, 13, 13, 13, 13, 13, 13, 13, 13,\r | |
765 | 21, 21, 21, 21, 21, 21, 21, 21, 29, 29, 29, 29, 29, 29, 29, 29,\r | |
766 | 37, 37, 37, 37, 37, 37, 37, 37, 45, 45, 45, 45, 45, 45, 45, 45,\r | |
767 | 53, 53, 53, 53, 53, 53, 53, 53, 61, 61, 61, 61, 61, 61, 61, 61,\r | |
768 | 129,129,129,129,129,129,129,129,137,137,137,137,137,137,137,137,\r | |
769 | 145,145,145,145,145,145,145,145,153,153,153,153,153,153,153,153,\r | |
770 | 161,161,161,161,161,161,161,161,169,169,169,169,169,169,169,169,\r | |
771 | 177,177,177,177,177,177,177,177,185,185,185,185,185,185,185,185,\r | |
772 | 129,129,129,129,129,129,129,129,137,137,137,137,137,137,137,137,\r | |
773 | 145,145,145,145,145,145,145,145,153,153,153,153,153,153,153,153,\r | |
774 | 161,161,161,161,161,161,161,161,169,169,169,169,169,169,169,169,\r | |
775 | 177,177,177,177,177,177,177,177,185,185,185,185,185,185,185,185,\r | |
776 | };\r | |
777 | \r | |
778 | /* cbits2Z80Table[i] = (i & 0x10) | (((i >> 6) ^ (i >> 5)) & 4) | ((i >> 8) & 1) | 2, i = 0..511 */\r | |
779 | static const uint8 cbits2Z80Table[512] = {\r | |
780 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r | |
781 | 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,\r | |
782 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r | |
783 | 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,\r | |
784 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r | |
785 | 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,\r | |
786 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r | |
787 | 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,\r | |
788 | 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\r | |
789 | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,\r | |
790 | 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\r | |
791 | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,\r | |
792 | 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\r | |
793 | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,\r | |
794 | 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\r | |
795 | 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,\r | |
796 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\r | |
797 | 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,\r | |
798 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\r | |
799 | 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,\r | |
800 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\r | |
801 | 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,\r | |
802 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\r | |
803 | 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,\r | |
804 | 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\r | |
805 | 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
806 | 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\r | |
807 | 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
808 | 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\r | |
809 | 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
810 | 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\r | |
811 | 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
812 | };\r | |
813 | \r | |
814 | /* cbits2Z80DupTable[i] = (i & 0x10) | (((i >> 6) ^ (i >> 5)) & 4) | ((i >> 8) & 1) | 2 |\r | |
815 | (i & 0xa8), i = 0..511 */\r | |
816 | static const uint8 cbits2Z80DupTable[512] = {\r | |
817 | 2, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 10,\r | |
818 | 18, 18, 18, 18, 18, 18, 18, 18, 26, 26, 26, 26, 26, 26, 26, 26,\r | |
819 | 34, 34, 34, 34, 34, 34, 34, 34, 42, 42, 42, 42, 42, 42, 42, 42,\r | |
820 | 50, 50, 50, 50, 50, 50, 50, 50, 58, 58, 58, 58, 58, 58, 58, 58,\r | |
821 | 2, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 10,\r | |
822 | 18, 18, 18, 18, 18, 18, 18, 18, 26, 26, 26, 26, 26, 26, 26, 26,\r | |
823 | 34, 34, 34, 34, 34, 34, 34, 34, 42, 42, 42, 42, 42, 42, 42, 42,\r | |
824 | 50, 50, 50, 50, 50, 50, 50, 50, 58, 58, 58, 58, 58, 58, 58, 58,\r | |
825 | 134,134,134,134,134,134,134,134,142,142,142,142,142,142,142,142,\r | |
826 | 150,150,150,150,150,150,150,150,158,158,158,158,158,158,158,158,\r | |
827 | 166,166,166,166,166,166,166,166,174,174,174,174,174,174,174,174,\r | |
828 | 182,182,182,182,182,182,182,182,190,190,190,190,190,190,190,190,\r | |
829 | 134,134,134,134,134,134,134,134,142,142,142,142,142,142,142,142,\r | |
830 | 150,150,150,150,150,150,150,150,158,158,158,158,158,158,158,158,\r | |
831 | 166,166,166,166,166,166,166,166,174,174,174,174,174,174,174,174,\r | |
832 | 182,182,182,182,182,182,182,182,190,190,190,190,190,190,190,190,\r | |
833 | 7, 7, 7, 7, 7, 7, 7, 7, 15, 15, 15, 15, 15, 15, 15, 15,\r | |
834 | 23, 23, 23, 23, 23, 23, 23, 23, 31, 31, 31, 31, 31, 31, 31, 31,\r | |
835 | 39, 39, 39, 39, 39, 39, 39, 39, 47, 47, 47, 47, 47, 47, 47, 47,\r | |
836 | 55, 55, 55, 55, 55, 55, 55, 55, 63, 63, 63, 63, 63, 63, 63, 63,\r | |
837 | 7, 7, 7, 7, 7, 7, 7, 7, 15, 15, 15, 15, 15, 15, 15, 15,\r | |
838 | 23, 23, 23, 23, 23, 23, 23, 23, 31, 31, 31, 31, 31, 31, 31, 31,\r | |
839 | 39, 39, 39, 39, 39, 39, 39, 39, 47, 47, 47, 47, 47, 47, 47, 47,\r | |
840 | 55, 55, 55, 55, 55, 55, 55, 55, 63, 63, 63, 63, 63, 63, 63, 63,\r | |
841 | 131,131,131,131,131,131,131,131,139,139,139,139,139,139,139,139,\r | |
842 | 147,147,147,147,147,147,147,147,155,155,155,155,155,155,155,155,\r | |
843 | 163,163,163,163,163,163,163,163,171,171,171,171,171,171,171,171,\r | |
844 | 179,179,179,179,179,179,179,179,187,187,187,187,187,187,187,187,\r | |
845 | 131,131,131,131,131,131,131,131,139,139,139,139,139,139,139,139,\r | |
846 | 147,147,147,147,147,147,147,147,155,155,155,155,155,155,155,155,\r | |
847 | 163,163,163,163,163,163,163,163,171,171,171,171,171,171,171,171,\r | |
848 | 179,179,179,179,179,179,179,179,187,187,187,187,187,187,187,187,\r | |
849 | };\r | |
850 | \r | |
851 | /* negTable[i] = (((i & 0x0f) != 0) << 4) | ((i == 0x80) << 2) | 2 | (i != 0), i = 0..255 */\r | |
852 | static const uint8 negTable[256] = {\r | |
853 | 2,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
854 | 3,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
855 | 3,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
856 | 3,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
857 | 3,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
858 | 3,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
859 | 3,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
860 | 3,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
861 | 7,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
862 | 3,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
863 | 3,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
864 | 3,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
865 | 3,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
866 | 3,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
867 | 3,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
868 | 3,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,\r | |
869 | };\r | |
870 | \r | |
871 | /* rrdrldTable[i] = (i << 8) | (i & 0xa8) | (((i & 0xff) == 0) << 6) | parityTable[i], i = 0..255 */\r | |
872 | static const uint16 rrdrldTable[256] = {\r | |
873 | 0x0044,0x0100,0x0200,0x0304,0x0400,0x0504,0x0604,0x0700,\r | |
874 | 0x0808,0x090c,0x0a0c,0x0b08,0x0c0c,0x0d08,0x0e08,0x0f0c,\r | |
875 | 0x1000,0x1104,0x1204,0x1300,0x1404,0x1500,0x1600,0x1704,\r | |
876 | 0x180c,0x1908,0x1a08,0x1b0c,0x1c08,0x1d0c,0x1e0c,0x1f08,\r | |
877 | 0x2020,0x2124,0x2224,0x2320,0x2424,0x2520,0x2620,0x2724,\r | |
878 | 0x282c,0x2928,0x2a28,0x2b2c,0x2c28,0x2d2c,0x2e2c,0x2f28,\r | |
879 | 0x3024,0x3120,0x3220,0x3324,0x3420,0x3524,0x3624,0x3720,\r | |
880 | 0x3828,0x392c,0x3a2c,0x3b28,0x3c2c,0x3d28,0x3e28,0x3f2c,\r | |
881 | 0x4000,0x4104,0x4204,0x4300,0x4404,0x4500,0x4600,0x4704,\r | |
882 | 0x480c,0x4908,0x4a08,0x4b0c,0x4c08,0x4d0c,0x4e0c,0x4f08,\r | |
883 | 0x5004,0x5100,0x5200,0x5304,0x5400,0x5504,0x5604,0x5700,\r | |
884 | 0x5808,0x590c,0x5a0c,0x5b08,0x5c0c,0x5d08,0x5e08,0x5f0c,\r | |
885 | 0x6024,0x6120,0x6220,0x6324,0x6420,0x6524,0x6624,0x6720,\r | |
886 | 0x6828,0x692c,0x6a2c,0x6b28,0x6c2c,0x6d28,0x6e28,0x6f2c,\r | |
887 | 0x7020,0x7124,0x7224,0x7320,0x7424,0x7520,0x7620,0x7724,\r | |
888 | 0x782c,0x7928,0x7a28,0x7b2c,0x7c28,0x7d2c,0x7e2c,0x7f28,\r | |
889 | 0x8080,0x8184,0x8284,0x8380,0x8484,0x8580,0x8680,0x8784,\r | |
890 | 0x888c,0x8988,0x8a88,0x8b8c,0x8c88,0x8d8c,0x8e8c,0x8f88,\r | |
891 | 0x9084,0x9180,0x9280,0x9384,0x9480,0x9584,0x9684,0x9780,\r | |
892 | 0x9888,0x998c,0x9a8c,0x9b88,0x9c8c,0x9d88,0x9e88,0x9f8c,\r | |
893 | 0xa0a4,0xa1a0,0xa2a0,0xa3a4,0xa4a0,0xa5a4,0xa6a4,0xa7a0,\r | |
894 | 0xa8a8,0xa9ac,0xaaac,0xaba8,0xacac,0xada8,0xaea8,0xafac,\r | |
895 | 0xb0a0,0xb1a4,0xb2a4,0xb3a0,0xb4a4,0xb5a0,0xb6a0,0xb7a4,\r | |
896 | 0xb8ac,0xb9a8,0xbaa8,0xbbac,0xbca8,0xbdac,0xbeac,0xbfa8,\r | |
897 | 0xc084,0xc180,0xc280,0xc384,0xc480,0xc584,0xc684,0xc780,\r | |
898 | 0xc888,0xc98c,0xca8c,0xcb88,0xcc8c,0xcd88,0xce88,0xcf8c,\r | |
899 | 0xd080,0xd184,0xd284,0xd380,0xd484,0xd580,0xd680,0xd784,\r | |
900 | 0xd88c,0xd988,0xda88,0xdb8c,0xdc88,0xdd8c,0xde8c,0xdf88,\r | |
901 | 0xe0a0,0xe1a4,0xe2a4,0xe3a0,0xe4a4,0xe5a0,0xe6a0,0xe7a4,\r | |
902 | 0xe8ac,0xe9a8,0xeaa8,0xebac,0xeca8,0xedac,0xeeac,0xefa8,\r | |
903 | 0xf0a4,0xf1a0,0xf2a0,0xf3a4,0xf4a0,0xf5a4,0xf6a4,0xf7a0,\r | |
904 | 0xf8a8,0xf9ac,0xfaac,0xfba8,0xfcac,0xfda8,0xfea8,0xffac,\r | |
905 | };\r | |
906 | \r | |
907 | /* cpTable[i] = (i & 0x80) | (((i & 0xff) == 0) << 6), i = 0..255 */\r | |
908 | static const uint8 cpTable[256] = {\r | |
909 | 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r | |
910 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r | |
911 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r | |
912 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r | |
913 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r | |
914 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r | |
915 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r | |
916 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r | |
917 | 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,\r | |
918 | 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,\r | |
919 | 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,\r | |
920 | 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,\r | |
921 | 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,\r | |
922 | 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,\r | |
923 | 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,\r | |
924 | 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,\r | |
925 | };\r | |
926 | \r | |
927 | /* Memory management */\r | |
928 | \r | |
929 | uint8 MOPT[MAXBANKSIZE]; /* RAM which is present */\r | |
930 | \r | |
931 | static uint8 GET_BYTE(register uint32 Addr) {\r | |
932 | return MOPT[Addr & ADDRMASK];\r | |
933 | }\r | |
934 | \r | |
935 | static void PUT_BYTE(register uint32 Addr, register uint32 Value) {\r | |
936 | MOPT[Addr & ADDRMASK] = Value;\r | |
937 | }\r | |
938 | \r | |
939 | static void PUT_WORD(register uint32 Addr, register uint32 Value) {\r | |
940 | MOPT[Addr & ADDRMASK] = Value;\r | |
941 | MOPT[(Addr + 1) & ADDRMASK] = Value >> 8;\r | |
942 | }\r | |
943 | \r | |
944 | static uint16 GET_WORD(register uint32 a) {\r | |
945 | return GET_BYTE(a) | (GET_BYTE(a + 1) << 8);\r | |
946 | }\r | |
947 | \r | |
948 | #define RAM_MM(a) GET_BYTE(a--)\r | |
949 | #define RAM_PP(a) GET_BYTE(a++)\r | |
950 | \r | |
951 | #define PUT_BYTE_PP(a,v) PUT_BYTE(a++, v)\r | |
952 | #define PUT_BYTE_MM(a,v) PUT_BYTE(a--, v)\r | |
953 | #define MM_PUT_BYTE(a,v) PUT_BYTE(--a, v)\r | |
954 | \r | |
955 | #define PUSH(x) do { \\r | |
956 | MM_PUT_BYTE(SP, (x) >> 8); \\r | |
957 | MM_PUT_BYTE(SP, x); \\r | |
958 | } while (0)\r | |
959 | \r | |
960 | /* Macros for the IN/OUT instructions INI/INIR/IND/INDR/OUTI/OTIR/OUTD/OTDR\r | |
961 | \r | |
962 | Pre condition\r | |
963 | temp == value of register B at entry of the instruction\r | |
964 | acu == value of transferred byte (IN or OUT)\r | |
965 | Post condition\r | |
966 | F is set correctly\r | |
967 | \r | |
968 | Use INOUTFLAGS_ZERO(x) for INIR/INDR/OTIR/OTDR where\r | |
969 | x == (C + 1) & 0xff for INIR\r | |
970 | x == L for OTIR and OTDR\r | |
971 | x == (C - 1) & 0xff for INDR\r | |
972 | Use INOUTFLAGS_NONZERO(x) for INI/IND/OUTI/OUTD where\r | |
973 | x == (C + 1) & 0xff for INI\r | |
974 | x == L for OUTI and OUTD\r | |
975 | x == (C - 1) & 0xff for IND\r | |
976 | */\r | |
977 | #define INOUTFLAGS(syxz, x) \\r | |
978 | AF = (AF & 0xff00) | (syxz) | /* SF, YF, XF, ZF */ \\r | |
979 | ((acu & 0x80) >> 6) | /* NF */ \\r | |
980 | ((acu + (x)) > 0xff ? (FLAG_C | FLAG_H) : 0) | /* CF, HF */ \\r | |
981 | parityTable[((acu + (x)) & 7) ^ temp] /* PF */\r | |
982 | \r | |
983 | #define INOUTFLAGS_ZERO(x) INOUTFLAGS(FLAG_Z, x)\r | |
984 | #define INOUTFLAGS_NONZERO(x) \\r | |
985 | INOUTFLAGS((HIGH_REGISTER(BC) & 0xa8) | ((HIGH_REGISTER(BC) == 0) << 6), x)\r | |
986 | \r | |
987 | t_stat sim_instr_nommu(void) {\r | |
988 | extern int32 sim_interval;\r | |
989 | extern uint32 sim_brk_summ;\r | |
990 | int32 reason = 0;\r | |
991 | register uint32 AF;\r | |
992 | register uint32 BC;\r | |
993 | register uint32 DE;\r | |
994 | register uint32 HL;\r | |
995 | register uint32 PC;\r | |
996 | register uint32 SP;\r | |
997 | register uint32 IX;\r | |
998 | register uint32 IY;\r | |
999 | register uint32 temp = 0;\r | |
1000 | register uint32 acu = 0;\r | |
1001 | register uint32 sum;\r | |
1002 | register uint32 cbits;\r | |
1003 | register uint32 op;\r | |
1004 | register uint32 adr;\r | |
1005 | register int32 l_sim_brk_summ;\r | |
1006 | \r | |
1007 | AF = AF_S;\r | |
1008 | BC = BC_S;\r | |
1009 | DE = DE_S;\r | |
1010 | HL = HL_S;\r | |
1011 | PC = PC_S & ADDRMASK;\r | |
1012 | SP = SP_S;\r | |
1013 | IX = IX_S;\r | |
1014 | IY = IY_S;\r | |
1015 | l_sim_brk_summ = sim_brk_summ;\r | |
1016 | \r | |
1017 | /* main instruction fetch/decode loop */\r | |
1018 | while (TRUE) { /* loop until halted */\r | |
1019 | if (sim_interval <= 0) { /* check clock queue */\r | |
1020 | #if !UNIX_PLATFORM\r | |
1021 | if ((reason = sim_poll_kbd()) == SCPE_STOP) break; /* poll on platforms without reliable signalling */\r | |
1022 | #endif\r | |
1023 | if ((reason = sim_process_event())) break;\r | |
1024 | }\r | |
1025 | \r | |
1026 | if (l_sim_brk_summ && sim_brk_test(PC, SWMASK('E'))) {/* breakpoint? */\r | |
1027 | reason = STOP_IBKPT; /* stop simulation */\r | |
1028 | break;\r | |
1029 | }\r | |
1030 | \r | |
1031 | PCX = PC;\r | |
1032 | sim_interval--;\r | |
1033 | \r | |
1034 | switch(RAM_PP(PC)) {\r | |
1035 | \r | |
1036 | case 0x00: /* NOP */\r | |
1037 | break;\r | |
1038 | \r | |
1039 | case 0x01: /* LD BC,nnnn */\r | |
1040 | BC = GET_WORD(PC);\r | |
1041 | PC += 2;\r | |
1042 | break;\r | |
1043 | \r | |
1044 | case 0x02: /* LD (BC),A */\r | |
1045 | PUT_BYTE(BC, HIGH_REGISTER(AF));\r | |
1046 | break;\r | |
1047 | \r | |
1048 | case 0x03: /* INC BC */\r | |
1049 | ++BC;\r | |
1050 | break;\r | |
1051 | \r | |
1052 | case 0x04: /* INC B */\r | |
1053 | BC += 0x100;\r | |
1054 | temp = HIGH_REGISTER(BC);\r | |
1055 | AF = (AF & ~0xfe) | incTable[temp] | SET_PV2(0x80); /* SET_PV2 uses temp */\r | |
1056 | break;\r | |
1057 | \r | |
1058 | case 0x05: /* DEC B */\r | |
1059 | BC -= 0x100;\r | |
1060 | temp = HIGH_REGISTER(BC);\r | |
1061 | AF = (AF & ~0xfe) | decTable[temp] | SET_PV2(0x7f); /* SET_PV2 uses temp */\r | |
1062 | break;\r | |
1063 | \r | |
1064 | case 0x06: /* LD B,nn */\r | |
1065 | SET_HIGH_REGISTER(BC, RAM_PP(PC));\r | |
1066 | break;\r | |
1067 | \r | |
1068 | case 0x07: /* RLCA */\r | |
1069 | AF = ((AF >> 7) & 0x0128) | ((AF << 1) & ~0x1ff) |\r | |
1070 | (AF & 0xc4) | ((AF >> 15) & 1);\r | |
1071 | break;\r | |
1072 | \r | |
1073 | case 0x08: /* EX AF,AF' */\r | |
1074 | CHECK_CPU_8080;\r | |
1075 | temp = AF;\r | |
1076 | AF = AF1_S;\r | |
1077 | AF1_S = temp;\r | |
1078 | break;\r | |
1079 | \r | |
1080 | case 0x09: /* ADD HL,BC */\r | |
1081 | HL &= ADDRMASK;\r | |
1082 | BC &= ADDRMASK;\r | |
1083 | sum = HL + BC;\r | |
1084 | AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) | cbitsTable[(HL ^ BC ^ sum) >> 8];\r | |
1085 | HL = sum;\r | |
1086 | break;\r | |
1087 | \r | |
1088 | case 0x0a: /* LD A,(BC) */\r | |
1089 | SET_HIGH_REGISTER(AF, GET_BYTE(BC));\r | |
1090 | break;\r | |
1091 | \r | |
1092 | case 0x0b: /* DEC BC */\r | |
1093 | --BC;\r | |
1094 | break;\r | |
1095 | \r | |
1096 | case 0x0c: /* INC C */\r | |
1097 | temp = LOW_REGISTER(BC) + 1;\r | |
1098 | SET_LOW_REGISTER(BC, temp);\r | |
1099 | AF = (AF & ~0xfe) | incTable[temp] | SET_PV2(0x80);\r | |
1100 | break;\r | |
1101 | \r | |
1102 | case 0x0d: /* DEC C */\r | |
1103 | temp = LOW_REGISTER(BC) - 1;\r | |
1104 | SET_LOW_REGISTER(BC, temp);\r | |
1105 | AF = (AF & ~0xfe) | decTable[temp & 0xff] | SET_PV2(0x7f);\r | |
1106 | break;\r | |
1107 | \r | |
1108 | case 0x0e: /* LD C,nn */\r | |
1109 | SET_LOW_REGISTER(BC, RAM_PP(PC));\r | |
1110 | break;\r | |
1111 | \r | |
1112 | case 0x0f: /* RRCA */\r | |
1113 | AF = (AF & 0xc4) | rrcaTable[HIGH_REGISTER(AF)];\r | |
1114 | break;\r | |
1115 | \r | |
1116 | case 0x10: /* DJNZ dd */\r | |
1117 | CHECK_CPU_8080;\r | |
1118 | if ((BC -= 0x100) & 0xff00) PC += (int8) GET_BYTE(PC) + 1;\r | |
1119 | else PC++;\r | |
1120 | break;\r | |
1121 | \r | |
1122 | case 0x11: /* LD DE,nnnn */\r | |
1123 | DE = GET_WORD(PC);\r | |
1124 | PC += 2;\r | |
1125 | break;\r | |
1126 | \r | |
1127 | case 0x12: /* LD (DE),A */\r | |
1128 | PUT_BYTE(DE, HIGH_REGISTER(AF));\r | |
1129 | break;\r | |
1130 | \r | |
1131 | case 0x13: /* INC DE */\r | |
1132 | ++DE;\r | |
1133 | break;\r | |
1134 | \r | |
1135 | case 0x14: /* INC D */\r | |
1136 | DE += 0x100;\r | |
1137 | temp = HIGH_REGISTER(DE);\r | |
1138 | AF = (AF & ~0xfe) | incTable[temp] | SET_PV2(0x80); /* SET_PV2 uses temp */\r | |
1139 | break;\r | |
1140 | \r | |
1141 | case 0x15: /* DEC D */\r | |
1142 | DE -= 0x100;\r | |
1143 | temp = HIGH_REGISTER(DE);\r | |
1144 | AF = (AF & ~0xfe) | decTable[temp] | SET_PV2(0x7f); /* SET_PV2 uses temp */\r | |
1145 | break;\r | |
1146 | \r | |
1147 | case 0x16: /* LD D,nn */\r | |
1148 | SET_HIGH_REGISTER(DE, RAM_PP(PC));\r | |
1149 | break;\r | |
1150 | \r | |
1151 | case 0x17: /* RLA */\r | |
1152 | AF = ((AF << 8) & 0x0100) | ((AF >> 7) & 0x28) | ((AF << 1) & ~0x01ff) |\r | |
1153 | (AF & 0xc4) | ((AF >> 15) & 1);\r | |
1154 | break;\r | |
1155 | \r | |
1156 | case 0x18: /* JR dd */\r | |
1157 | CHECK_CPU_8080;\r | |
1158 | PC += (int8) GET_BYTE(PC) + 1;\r | |
1159 | break;\r | |
1160 | \r | |
1161 | case 0x19: /* ADD HL,DE */\r | |
1162 | HL &= ADDRMASK;\r | |
1163 | DE &= ADDRMASK;\r | |
1164 | sum = HL + DE;\r | |
1165 | AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) | cbitsTable[(HL ^ DE ^ sum) >> 8];\r | |
1166 | HL = sum;\r | |
1167 | break;\r | |
1168 | \r | |
1169 | case 0x1a: /* LD A,(DE) */\r | |
1170 | SET_HIGH_REGISTER(AF, GET_BYTE(DE));\r | |
1171 | break;\r | |
1172 | \r | |
1173 | case 0x1b: /* DEC DE */\r | |
1174 | --DE;\r | |
1175 | break;\r | |
1176 | \r | |
1177 | case 0x1c: /* INC E */\r | |
1178 | temp = LOW_REGISTER(DE) + 1;\r | |
1179 | SET_LOW_REGISTER(DE, temp);\r | |
1180 | AF = (AF & ~0xfe) | incTable[temp] | SET_PV2(0x80);\r | |
1181 | break;\r | |
1182 | \r | |
1183 | case 0x1d: /* DEC E */\r | |
1184 | temp = LOW_REGISTER(DE) - 1;\r | |
1185 | SET_LOW_REGISTER(DE, temp);\r | |
1186 | AF = (AF & ~0xfe) | decTable[temp & 0xff] | SET_PV2(0x7f);\r | |
1187 | break;\r | |
1188 | \r | |
1189 | case 0x1e: /* LD E,nn */\r | |
1190 | SET_LOW_REGISTER(DE, RAM_PP(PC));\r | |
1191 | break;\r | |
1192 | \r | |
1193 | case 0x1f: /* RRA */\r | |
1194 | AF = ((AF & 1) << 15) | (AF & 0xc4) | rraTable[HIGH_REGISTER(AF)];\r | |
1195 | break;\r | |
1196 | \r | |
1197 | case 0x20: /* JR NZ,dd */\r | |
1198 | CHECK_CPU_8080;\r | |
1199 | if (TSTFLAG(Z)) PC++;\r | |
1200 | else PC += (int8) GET_BYTE(PC) + 1;\r | |
1201 | break;\r | |
1202 | \r | |
1203 | case 0x21: /* LD HL,nnnn */\r | |
1204 | HL = GET_WORD(PC);\r | |
1205 | PC += 2;\r | |
1206 | break;\r | |
1207 | \r | |
1208 | case 0x22: /* LD (nnnn),HL */\r | |
1209 | temp = GET_WORD(PC);\r | |
1210 | PUT_WORD(temp, HL);\r | |
1211 | PC += 2;\r | |
1212 | break;\r | |
1213 | \r | |
1214 | case 0x23: /* INC HL */\r | |
1215 | ++HL;\r | |
1216 | break;\r | |
1217 | \r | |
1218 | case 0x24: /* INC H */\r | |
1219 | HL += 0x100;\r | |
1220 | temp = HIGH_REGISTER(HL);\r | |
1221 | AF = (AF & ~0xfe) | incTable[temp] | SET_PV2(0x80); /* SET_PV2 uses temp */\r | |
1222 | break;\r | |
1223 | \r | |
1224 | case 0x25: /* DEC H */\r | |
1225 | HL -= 0x100;\r | |
1226 | temp = HIGH_REGISTER(HL);\r | |
1227 | AF = (AF & ~0xfe) | decTable[temp] | SET_PV2(0x7f); /* SET_PV2 uses temp */\r | |
1228 | break;\r | |
1229 | \r | |
1230 | case 0x26: /* LD H,nn */\r | |
1231 | SET_HIGH_REGISTER(HL, RAM_PP(PC));\r | |
1232 | break;\r | |
1233 | \r | |
1234 | case 0x27: /* DAA */\r | |
1235 | acu = HIGH_REGISTER(AF);\r | |
1236 | temp = LOW_DIGIT(acu);\r | |
1237 | cbits = TSTFLAG(C);\r | |
1238 | if (TSTFLAG(N)) { /* last operation was a subtract */\r | |
1239 | int hd = cbits || acu > 0x99;\r | |
1240 | if (TSTFLAG(H) || (temp > 9)) { /* adjust low digit */\r | |
1241 | if (temp > 5) SETFLAG(H, 0);\r | |
1242 | acu -= 6;\r | |
1243 | acu &= 0xff;\r | |
1244 | }\r | |
1245 | if (hd) acu -= 0x160; /* adjust high digit */\r | |
1246 | }\r | |
1247 | else { /* last operation was an add */\r | |
1248 | if (TSTFLAG(H) || (temp > 9)) { /* adjust low digit */\r | |
1249 | SETFLAG(H, (temp > 9));\r | |
1250 | acu += 6;\r | |
1251 | }\r | |
1252 | if (cbits || ((acu & 0x1f0) > 0x90)) acu += 0x60; /* adjust high digit */\r | |
1253 | }\r | |
1254 | AF = (AF & 0x12) | rrdrldTable[acu & 0xff] | ((acu >> 8) & 1) | cbits;\r | |
1255 | break;\r | |
1256 | \r | |
1257 | case 0x28: /* JR Z,dd */\r | |
1258 | CHECK_CPU_8080;\r | |
1259 | if (TSTFLAG(Z)) PC += (int8) GET_BYTE(PC) + 1;\r | |
1260 | else PC++;\r | |
1261 | break;\r | |
1262 | \r | |
1263 | case 0x29: /* ADD HL,HL */\r | |
1264 | HL &= ADDRMASK;\r | |
1265 | sum = HL + HL;\r | |
1266 | AF = (AF & ~0x3b) | cbitsDup16Table[sum >> 8];\r | |
1267 | HL = sum;\r | |
1268 | break;\r | |
1269 | \r | |
1270 | case 0x2a: /* LD HL,(nnnn) */\r | |
1271 | temp = GET_WORD(PC);\r | |
1272 | HL = GET_WORD(temp);\r | |
1273 | PC += 2;\r | |
1274 | break;\r | |
1275 | \r | |
1276 | case 0x2b: /* DEC HL */\r | |
1277 | --HL;\r | |
1278 | break;\r | |
1279 | \r | |
1280 | case 0x2c: /* INC L */\r | |
1281 | temp = LOW_REGISTER(HL) + 1;\r | |
1282 | SET_LOW_REGISTER(HL, temp);\r | |
1283 | AF = (AF & ~0xfe) | incTable[temp] | SET_PV2(0x80);\r | |
1284 | break;\r | |
1285 | \r | |
1286 | case 0x2d: /* DEC L */\r | |
1287 | temp = LOW_REGISTER(HL) - 1;\r | |
1288 | SET_LOW_REGISTER(HL, temp);\r | |
1289 | AF = (AF & ~0xfe) | decTable[temp & 0xff] | SET_PV2(0x7f);\r | |
1290 | break;\r | |
1291 | \r | |
1292 | case 0x2e: /* LD L,nn */\r | |
1293 | SET_LOW_REGISTER(HL, RAM_PP(PC));\r | |
1294 | break;\r | |
1295 | \r | |
1296 | case 0x2f: /* CPL */\r | |
1297 | AF = (~AF & ~0xff) | (AF & 0xc5) | ((~AF >> 8) & 0x28) | 0x12;\r | |
1298 | break;\r | |
1299 | \r | |
1300 | case 0x30: /* JR NC,dd */\r | |
1301 | CHECK_CPU_8080;\r | |
1302 | if (TSTFLAG(C)) PC++;\r | |
1303 | else PC += (int8) GET_BYTE(PC) + 1;\r | |
1304 | break;\r | |
1305 | \r | |
1306 | case 0x31: /* LD SP,nnnn */\r | |
1307 | SP = GET_WORD(PC);\r | |
1308 | PC += 2;\r | |
1309 | break;\r | |
1310 | \r | |
1311 | case 0x32: /* LD (nnnn),A */\r | |
1312 | temp = GET_WORD(PC);\r | |
1313 | PUT_BYTE(temp, HIGH_REGISTER(AF));\r | |
1314 | PC += 2;\r | |
1315 | break;\r | |
1316 | \r | |
1317 | case 0x33: /* INC SP */\r | |
1318 | ++SP;\r | |
1319 | break;\r | |
1320 | \r | |
1321 | case 0x34: /* INC (HL) */\r | |
1322 | temp = GET_BYTE(HL) + 1;\r | |
1323 | PUT_BYTE(HL, temp);\r | |
1324 | AF = (AF & ~0xfe) | incTable[temp] | SET_PV2(0x80);\r | |
1325 | break;\r | |
1326 | \r | |
1327 | case 0x35: /* DEC (HL) */\r | |
1328 | temp = GET_BYTE(HL) - 1;\r | |
1329 | PUT_BYTE(HL, temp);\r | |
1330 | AF = (AF & ~0xfe) | decTable[temp & 0xff] | SET_PV2(0x7f);\r | |
1331 | break;\r | |
1332 | \r | |
1333 | case 0x36: /* LD (HL),nn */\r | |
1334 | PUT_BYTE(HL, RAM_PP(PC));\r | |
1335 | break;\r | |
1336 | \r | |
1337 | case 0x37: /* SCF */\r | |
1338 | AF = (AF & ~0x3b) | ((AF >> 8) & 0x28) | 1;\r | |
1339 | break;\r | |
1340 | \r | |
1341 | case 0x38: /* JR C,dd */\r | |
1342 | CHECK_CPU_8080;\r | |
1343 | if (TSTFLAG(C)) PC += (int8) GET_BYTE(PC) + 1;\r | |
1344 | else PC++;\r | |
1345 | break;\r | |
1346 | \r | |
1347 | case 0x39: /* ADD HL,SP */\r | |
1348 | HL &= ADDRMASK;\r | |
1349 | SP &= ADDRMASK;\r | |
1350 | sum = HL + SP;\r | |
1351 | AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) | cbitsTable[(HL ^ SP ^ sum) >> 8];\r | |
1352 | HL = sum;\r | |
1353 | break;\r | |
1354 | \r | |
1355 | case 0x3a: /* LD A,(nnnn) */\r | |
1356 | temp = GET_WORD(PC);\r | |
1357 | SET_HIGH_REGISTER(AF, GET_BYTE(temp));\r | |
1358 | PC += 2;\r | |
1359 | break;\r | |
1360 | \r | |
1361 | case 0x3b: /* DEC SP */\r | |
1362 | --SP;\r | |
1363 | break;\r | |
1364 | \r | |
1365 | case 0x3c: /* INC A */\r | |
1366 | AF += 0x100;\r | |
1367 | temp = HIGH_REGISTER(AF);\r | |
1368 | AF = (AF & ~0xfe) | incTable[temp] | SET_PV2(0x80); /* SET_PV2 uses temp */\r | |
1369 | break;\r | |
1370 | \r | |
1371 | case 0x3d: /* DEC A */\r | |
1372 | AF -= 0x100;\r | |
1373 | temp = HIGH_REGISTER(AF);\r | |
1374 | AF = (AF & ~0xfe) | decTable[temp] | SET_PV2(0x7f); /* SET_PV2 uses temp */\r | |
1375 | break;\r | |
1376 | \r | |
1377 | case 0x3e: /* LD A,nn */\r | |
1378 | SET_HIGH_REGISTER(AF, RAM_PP(PC));\r | |
1379 | break;\r | |
1380 | \r | |
1381 | case 0x3f: /* CCF */\r | |
1382 | AF = (AF & ~0x3b) | ((AF >> 8) & 0x28) | ((AF & 1) << 4) | (~AF & 1);\r | |
1383 | break;\r | |
1384 | \r | |
1385 | case 0x40: /* LD B,B */\r | |
1386 | break;\r | |
1387 | \r | |
1388 | case 0x41: /* LD B,C */\r | |
1389 | BC = (BC & 0xff) | ((BC & 0xff) << 8);\r | |
1390 | break;\r | |
1391 | \r | |
1392 | case 0x42: /* LD B,D */\r | |
1393 | BC = (BC & 0xff) | (DE & ~0xff);\r | |
1394 | break;\r | |
1395 | \r | |
1396 | case 0x43: /* LD B,E */\r | |
1397 | BC = (BC & 0xff) | ((DE & 0xff) << 8);\r | |
1398 | break;\r | |
1399 | \r | |
1400 | case 0x44: /* LD B,H */\r | |
1401 | BC = (BC & 0xff) | (HL & ~0xff);\r | |
1402 | break;\r | |
1403 | \r | |
1404 | case 0x45: /* LD B,L */\r | |
1405 | BC = (BC & 0xff) | ((HL & 0xff) << 8);\r | |
1406 | break;\r | |
1407 | \r | |
1408 | case 0x46: /* LD B,(HL) */\r | |
1409 | SET_HIGH_REGISTER(BC, GET_BYTE(HL));\r | |
1410 | break;\r | |
1411 | \r | |
1412 | case 0x47: /* LD B,A */\r | |
1413 | BC = (BC & 0xff) | (AF & ~0xff);\r | |
1414 | break;\r | |
1415 | \r | |
1416 | case 0x48: /* LD C,B */\r | |
1417 | BC = (BC & ~0xff) | ((BC >> 8) & 0xff);\r | |
1418 | break;\r | |
1419 | \r | |
1420 | case 0x49: /* LD C,C */\r | |
1421 | break;\r | |
1422 | \r | |
1423 | case 0x4a: /* LD C,D */\r | |
1424 | BC = (BC & ~0xff) | ((DE >> 8) & 0xff);\r | |
1425 | break;\r | |
1426 | \r | |
1427 | case 0x4b: /* LD C,E */\r | |
1428 | BC = (BC & ~0xff) | (DE & 0xff);\r | |
1429 | break;\r | |
1430 | \r | |
1431 | case 0x4c: /* LD C,H */\r | |
1432 | BC = (BC & ~0xff) | ((HL >> 8) & 0xff);\r | |
1433 | break;\r | |
1434 | \r | |
1435 | case 0x4d: /* LD C,L */\r | |
1436 | BC = (BC & ~0xff) | (HL & 0xff);\r | |
1437 | break;\r | |
1438 | \r | |
1439 | case 0x4e: /* LD C,(HL) */\r | |
1440 | SET_LOW_REGISTER(BC, GET_BYTE(HL));\r | |
1441 | break;\r | |
1442 | \r | |
1443 | case 0x4f: /* LD C,A */\r | |
1444 | BC = (BC & ~0xff) | ((AF >> 8) & 0xff);\r | |
1445 | break;\r | |
1446 | \r | |
1447 | case 0x50: /* LD D,B */\r | |
1448 | DE = (DE & 0xff) | (BC & ~0xff);\r | |
1449 | break;\r | |
1450 | \r | |
1451 | case 0x51: /* LD D,C */\r | |
1452 | DE = (DE & 0xff) | ((BC & 0xff) << 8);\r | |
1453 | break;\r | |
1454 | \r | |
1455 | case 0x52: /* LD D,D */\r | |
1456 | break;\r | |
1457 | \r | |
1458 | case 0x53: /* LD D,E */\r | |
1459 | DE = (DE & 0xff) | ((DE & 0xff) << 8);\r | |
1460 | break;\r | |
1461 | \r | |
1462 | case 0x54: /* LD D,H */\r | |
1463 | DE = (DE & 0xff) | (HL & ~0xff);\r | |
1464 | break;\r | |
1465 | \r | |
1466 | case 0x55: /* LD D,L */\r | |
1467 | DE = (DE & 0xff) | ((HL & 0xff) << 8);\r | |
1468 | break;\r | |
1469 | \r | |
1470 | case 0x56: /* LD D,(HL) */\r | |
1471 | SET_HIGH_REGISTER(DE, GET_BYTE(HL));\r | |
1472 | break;\r | |
1473 | \r | |
1474 | case 0x57: /* LD D,A */\r | |
1475 | DE = (DE & 0xff) | (AF & ~0xff);\r | |
1476 | break;\r | |
1477 | \r | |
1478 | case 0x58: /* LD E,B */\r | |
1479 | DE = (DE & ~0xff) | ((BC >> 8) & 0xff);\r | |
1480 | break;\r | |
1481 | \r | |
1482 | case 0x59: /* LD E,C */\r | |
1483 | DE = (DE & ~0xff) | (BC & 0xff);\r | |
1484 | break;\r | |
1485 | \r | |
1486 | case 0x5a: /* LD E,D */\r | |
1487 | DE = (DE & ~0xff) | ((DE >> 8) & 0xff);\r | |
1488 | break;\r | |
1489 | \r | |
1490 | case 0x5b: /* LD E,E */\r | |
1491 | break;\r | |
1492 | \r | |
1493 | case 0x5c: /* LD E,H */\r | |
1494 | DE = (DE & ~0xff) | ((HL >> 8) & 0xff);\r | |
1495 | break;\r | |
1496 | \r | |
1497 | case 0x5d: /* LD E,L */\r | |
1498 | DE = (DE & ~0xff) | (HL & 0xff);\r | |
1499 | break;\r | |
1500 | \r | |
1501 | case 0x5e: /* LD E,(HL) */\r | |
1502 | SET_LOW_REGISTER(DE, GET_BYTE(HL));\r | |
1503 | break;\r | |
1504 | \r | |
1505 | case 0x5f: /* LD E,A */\r | |
1506 | DE = (DE & ~0xff) | ((AF >> 8) & 0xff);\r | |
1507 | break;\r | |
1508 | \r | |
1509 | case 0x60: /* LD H,B */\r | |
1510 | HL = (HL & 0xff) | (BC & ~0xff);\r | |
1511 | break;\r | |
1512 | \r | |
1513 | case 0x61: /* LD H,C */\r | |
1514 | HL = (HL & 0xff) | ((BC & 0xff) << 8);\r | |
1515 | break;\r | |
1516 | \r | |
1517 | case 0x62: /* LD H,D */\r | |
1518 | HL = (HL & 0xff) | (DE & ~0xff);\r | |
1519 | break;\r | |
1520 | \r | |
1521 | case 0x63: /* LD H,E */\r | |
1522 | HL = (HL & 0xff) | ((DE & 0xff) << 8);\r | |
1523 | break;\r | |
1524 | \r | |
1525 | case 0x64: /* LD H,H */\r | |
1526 | break;\r | |
1527 | \r | |
1528 | case 0x65: /* LD H,L */\r | |
1529 | HL = (HL & 0xff) | ((HL & 0xff) << 8);\r | |
1530 | break;\r | |
1531 | \r | |
1532 | case 0x66: /* LD H,(HL) */\r | |
1533 | SET_HIGH_REGISTER(HL, GET_BYTE(HL));\r | |
1534 | break;\r | |
1535 | \r | |
1536 | case 0x67: /* LD H,A */\r | |
1537 | HL = (HL & 0xff) | (AF & ~0xff);\r | |
1538 | break;\r | |
1539 | \r | |
1540 | case 0x68: /* LD L,B */\r | |
1541 | HL = (HL & ~0xff) | ((BC >> 8) & 0xff);\r | |
1542 | break;\r | |
1543 | \r | |
1544 | case 0x69: /* LD L,C */\r | |
1545 | HL = (HL & ~0xff) | (BC & 0xff);\r | |
1546 | break;\r | |
1547 | \r | |
1548 | case 0x6a: /* LD L,D */\r | |
1549 | HL = (HL & ~0xff) | ((DE >> 8) & 0xff);\r | |
1550 | break;\r | |
1551 | \r | |
1552 | case 0x6b: /* LD L,E */\r | |
1553 | HL = (HL & ~0xff) | (DE & 0xff);\r | |
1554 | break;\r | |
1555 | \r | |
1556 | case 0x6c: /* LD L,H */\r | |
1557 | HL = (HL & ~0xff) | ((HL >> 8) & 0xff);\r | |
1558 | break;\r | |
1559 | \r | |
1560 | case 0x6d: /* LD L,L */\r | |
1561 | break;\r | |
1562 | \r | |
1563 | case 0x6e: /* LD L,(HL) */\r | |
1564 | SET_LOW_REGISTER(HL, GET_BYTE(HL));\r | |
1565 | break;\r | |
1566 | \r | |
1567 | case 0x6f: /* LD L,A */\r | |
1568 | HL = (HL & ~0xff) | ((AF >> 8) & 0xff);\r | |
1569 | break;\r | |
1570 | \r | |
1571 | case 0x70: /* LD (HL),B */\r | |
1572 | PUT_BYTE(HL, HIGH_REGISTER(BC));\r | |
1573 | break;\r | |
1574 | \r | |
1575 | case 0x71: /* LD (HL),C */\r | |
1576 | PUT_BYTE(HL, LOW_REGISTER(BC));\r | |
1577 | break;\r | |
1578 | \r | |
1579 | case 0x72: /* LD (HL),D */\r | |
1580 | PUT_BYTE(HL, HIGH_REGISTER(DE));\r | |
1581 | break;\r | |
1582 | \r | |
1583 | case 0x73: /* LD (HL),E */\r | |
1584 | PUT_BYTE(HL, LOW_REGISTER(DE));\r | |
1585 | break;\r | |
1586 | \r | |
1587 | case 0x74: /* LD (HL),H */\r | |
1588 | PUT_BYTE(HL, HIGH_REGISTER(HL));\r | |
1589 | break;\r | |
1590 | \r | |
1591 | case 0x75: /* LD (HL),L */\r | |
1592 | PUT_BYTE(HL, LOW_REGISTER(HL));\r | |
1593 | break;\r | |
1594 | \r | |
1595 | case 0x76: /* HALT */\r | |
1596 | PC--;\r | |
1597 | if (cpu_unit.flags & UNIT_CPU_STOPONHALT) {\r | |
1598 | reason = STOP_HALT;\r | |
1599 | goto end_decode;\r | |
1600 | }\r | |
1601 | sim_interval = 0;\r | |
1602 | break;\r | |
1603 | \r | |
1604 | case 0x77: /* LD (HL),A */\r | |
1605 | PUT_BYTE(HL, HIGH_REGISTER(AF));\r | |
1606 | break;\r | |
1607 | \r | |
1608 | case 0x78: /* LD A,B */\r | |
1609 | AF = (AF & 0xff) | (BC & ~0xff);\r | |
1610 | break;\r | |
1611 | \r | |
1612 | case 0x79: /* LD A,C */\r | |
1613 | AF = (AF & 0xff) | ((BC & 0xff) << 8);\r | |
1614 | break;\r | |
1615 | \r | |
1616 | case 0x7a: /* LD A,D */\r | |
1617 | AF = (AF & 0xff) | (DE & ~0xff);\r | |
1618 | break;\r | |
1619 | \r | |
1620 | case 0x7b: /* LD A,E */\r | |
1621 | AF = (AF & 0xff) | ((DE & 0xff) << 8);\r | |
1622 | break;\r | |
1623 | \r | |
1624 | case 0x7c: /* LD A,H */\r | |
1625 | AF = (AF & 0xff) | (HL & ~0xff);\r | |
1626 | break;\r | |
1627 | \r | |
1628 | case 0x7d: /* LD A,L */\r | |
1629 | AF = (AF & 0xff) | ((HL & 0xff) << 8);\r | |
1630 | break;\r | |
1631 | \r | |
1632 | case 0x7e: /* LD A,(HL) */\r | |
1633 | SET_HIGH_REGISTER(AF, GET_BYTE(HL));\r | |
1634 | break;\r | |
1635 | \r | |
1636 | case 0x7f: /* LD A,A */\r | |
1637 | break;\r | |
1638 | \r | |
1639 | case 0x80: /* ADD A,B */\r | |
1640 | temp = HIGH_REGISTER(BC);\r | |
1641 | acu = HIGH_REGISTER(AF);\r | |
1642 | sum = acu + temp;\r | |
1643 | cbits = acu ^ temp ^ sum;\r | |
1644 | AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);\r | |
1645 | break;\r | |
1646 | \r | |
1647 | case 0x81: /* ADD A,C */\r | |
1648 | temp = LOW_REGISTER(BC);\r | |
1649 | acu = HIGH_REGISTER(AF);\r | |
1650 | sum = acu + temp;\r | |
1651 | cbits = acu ^ temp ^ sum;\r | |
1652 | AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);\r | |
1653 | break;\r | |
1654 | \r | |
1655 | case 0x82: /* ADD A,D */\r | |
1656 | temp = HIGH_REGISTER(DE);\r | |
1657 | acu = HIGH_REGISTER(AF);\r | |
1658 | sum = acu + temp;\r | |
1659 | cbits = acu ^ temp ^ sum;\r | |
1660 | AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);\r | |
1661 | break;\r | |
1662 | \r | |
1663 | case 0x83: /* ADD A,E */\r | |
1664 | temp = LOW_REGISTER(DE);\r | |
1665 | acu = HIGH_REGISTER(AF);\r | |
1666 | sum = acu + temp;\r | |
1667 | cbits = acu ^ temp ^ sum;\r | |
1668 | AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);\r | |
1669 | break;\r | |
1670 | \r | |
1671 | case 0x84: /* ADD A,H */\r | |
1672 | temp = HIGH_REGISTER(HL);\r | |
1673 | acu = HIGH_REGISTER(AF);\r | |
1674 | sum = acu + temp;\r | |
1675 | cbits = acu ^ temp ^ sum;\r | |
1676 | AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);\r | |
1677 | break;\r | |
1678 | \r | |
1679 | case 0x85: /* ADD A,L */\r | |
1680 | temp = LOW_REGISTER(HL);\r | |
1681 | acu = HIGH_REGISTER(AF);\r | |
1682 | sum = acu + temp;\r | |
1683 | cbits = acu ^ temp ^ sum;\r | |
1684 | AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);\r | |
1685 | break;\r | |
1686 | \r | |
1687 | case 0x86: /* ADD A,(HL) */\r | |
1688 | temp = GET_BYTE(HL);\r | |
1689 | acu = HIGH_REGISTER(AF);\r | |
1690 | sum = acu + temp;\r | |
1691 | cbits = acu ^ temp ^ sum;\r | |
1692 | AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);\r | |
1693 | break;\r | |
1694 | \r | |
1695 | case 0x87: /* ADD A,A */\r | |
1696 | cbits = 2 * HIGH_REGISTER(AF);\r | |
1697 | AF = cbitsDup8Table[cbits] | (SET_PVS(cbits));\r | |
1698 | break;\r | |
1699 | \r | |
1700 | case 0x88: /* ADC A,B */\r | |
1701 | temp = HIGH_REGISTER(BC);\r | |
1702 | acu = HIGH_REGISTER(AF);\r | |
1703 | sum = acu + temp + TSTFLAG(C);\r | |
1704 | cbits = acu ^ temp ^ sum;\r | |
1705 | AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);\r | |
1706 | break;\r | |
1707 | \r | |
1708 | case 0x89: /* ADC A,C */\r | |
1709 | temp = LOW_REGISTER(BC);\r | |
1710 | acu = HIGH_REGISTER(AF);\r | |
1711 | sum = acu + temp + TSTFLAG(C);\r | |
1712 | cbits = acu ^ temp ^ sum;\r | |
1713 | AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);\r | |
1714 | break;\r | |
1715 | \r | |
1716 | case 0x8a: /* ADC A,D */\r | |
1717 | temp = HIGH_REGISTER(DE);\r | |
1718 | acu = HIGH_REGISTER(AF);\r | |
1719 | sum = acu + temp + TSTFLAG(C);\r | |
1720 | cbits = acu ^ temp ^ sum;\r | |
1721 | AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);\r | |
1722 | break;\r | |
1723 | \r | |
1724 | case 0x8b: /* ADC A,E */\r | |
1725 | temp = LOW_REGISTER(DE);\r | |
1726 | acu = HIGH_REGISTER(AF);\r | |
1727 | sum = acu + temp + TSTFLAG(C);\r | |
1728 | cbits = acu ^ temp ^ sum;\r | |
1729 | AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);\r | |
1730 | break;\r | |
1731 | \r | |
1732 | case 0x8c: /* ADC A,H */\r | |
1733 | temp = HIGH_REGISTER(HL);\r | |
1734 | acu = HIGH_REGISTER(AF);\r | |
1735 | sum = acu + temp + TSTFLAG(C);\r | |
1736 | cbits = acu ^ temp ^ sum;\r | |
1737 | AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);\r | |
1738 | break;\r | |
1739 | \r | |
1740 | case 0x8d: /* ADC A,L */\r | |
1741 | temp = LOW_REGISTER(HL);\r | |
1742 | acu = HIGH_REGISTER(AF);\r | |
1743 | sum = acu + temp + TSTFLAG(C);\r | |
1744 | cbits = acu ^ temp ^ sum;\r | |
1745 | AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);\r | |
1746 | break;\r | |
1747 | \r | |
1748 | case 0x8e: /* ADC A,(HL) */\r | |
1749 | temp = GET_BYTE(HL);\r | |
1750 | acu = HIGH_REGISTER(AF);\r | |
1751 | sum = acu + temp + TSTFLAG(C);\r | |
1752 | cbits = acu ^ temp ^ sum;\r | |
1753 | AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);\r | |
1754 | break;\r | |
1755 | \r | |
1756 | case 0x8f: /* ADC A,A */\r | |
1757 | cbits = 2 * HIGH_REGISTER(AF) + TSTFLAG(C);\r | |
1758 | AF = cbitsDup8Table[cbits] | (SET_PVS(cbits));\r | |
1759 | break;\r | |
1760 | \r | |
1761 | case 0x90: /* SUB B */\r | |
1762 | temp = HIGH_REGISTER(BC);\r | |
1763 | acu = HIGH_REGISTER(AF);\r | |
1764 | sum = acu - temp;\r | |
1765 | cbits = acu ^ temp ^ sum;\r | |
1766 | AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);\r | |
1767 | break;\r | |
1768 | \r | |
1769 | case 0x91: /* SUB C */\r | |
1770 | temp = LOW_REGISTER(BC);\r | |
1771 | acu = HIGH_REGISTER(AF);\r | |
1772 | sum = acu - temp;\r | |
1773 | cbits = acu ^ temp ^ sum;\r | |
1774 | AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);\r | |
1775 | break;\r | |
1776 | \r | |
1777 | case 0x92: /* SUB D */\r | |
1778 | temp = HIGH_REGISTER(DE);\r | |
1779 | acu = HIGH_REGISTER(AF);\r | |
1780 | sum = acu - temp;\r | |
1781 | cbits = acu ^ temp ^ sum;\r | |
1782 | AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);\r | |
1783 | break;\r | |
1784 | \r | |
1785 | case 0x93: /* SUB E */\r | |
1786 | temp = LOW_REGISTER(DE);\r | |
1787 | acu = HIGH_REGISTER(AF);\r | |
1788 | sum = acu - temp;\r | |
1789 | cbits = acu ^ temp ^ sum;\r | |
1790 | AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);\r | |
1791 | break;\r | |
1792 | \r | |
1793 | case 0x94: /* SUB H */\r | |
1794 | temp = HIGH_REGISTER(HL);\r | |
1795 | acu = HIGH_REGISTER(AF);\r | |
1796 | sum = acu - temp;\r | |
1797 | cbits = acu ^ temp ^ sum;\r | |
1798 | AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);\r | |
1799 | break;\r | |
1800 | \r | |
1801 | case 0x95: /* SUB L */\r | |
1802 | temp = LOW_REGISTER(HL);\r | |
1803 | acu = HIGH_REGISTER(AF);\r | |
1804 | sum = acu - temp;\r | |
1805 | cbits = acu ^ temp ^ sum;\r | |
1806 | AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);\r | |
1807 | break;\r | |
1808 | \r | |
1809 | case 0x96: /* SUB (HL) */\r | |
1810 | temp = GET_BYTE(HL);\r | |
1811 | acu = HIGH_REGISTER(AF);\r | |
1812 | sum = acu - temp;\r | |
1813 | cbits = acu ^ temp ^ sum;\r | |
1814 | AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);\r | |
1815 | break;\r | |
1816 | \r | |
1817 | case 0x97: /* SUB A */\r | |
1818 | AF = (chiptype == CHIP_TYPE_Z80) ? 0x42 : 0x46;\r | |
1819 | break;\r | |
1820 | \r | |
1821 | case 0x98: /* SBC A,B */\r | |
1822 | temp = HIGH_REGISTER(BC);\r | |
1823 | acu = HIGH_REGISTER(AF);\r | |
1824 | sum = acu - temp - TSTFLAG(C);\r | |
1825 | cbits = acu ^ temp ^ sum;\r | |
1826 | AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);\r | |
1827 | break;\r | |
1828 | \r | |
1829 | case 0x99: /* SBC A,C */\r | |
1830 | temp = LOW_REGISTER(BC);\r | |
1831 | acu = HIGH_REGISTER(AF);\r | |
1832 | sum = acu - temp - TSTFLAG(C);\r | |
1833 | cbits = acu ^ temp ^ sum;\r | |
1834 | AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);\r | |
1835 | break;\r | |
1836 | \r | |
1837 | case 0x9a: /* SBC A,D */\r | |
1838 | temp = HIGH_REGISTER(DE);\r | |
1839 | acu = HIGH_REGISTER(AF);\r | |
1840 | sum = acu - temp - TSTFLAG(C);\r | |
1841 | cbits = acu ^ temp ^ sum;\r | |
1842 | AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);\r | |
1843 | break;\r | |
1844 | \r | |
1845 | case 0x9b: /* SBC A,E */\r | |
1846 | temp = LOW_REGISTER(DE);\r | |
1847 | acu = HIGH_REGISTER(AF);\r | |
1848 | sum = acu - temp - TSTFLAG(C);\r | |
1849 | cbits = acu ^ temp ^ sum;\r | |
1850 | AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);\r | |
1851 | break;\r | |
1852 | \r | |
1853 | case 0x9c: /* SBC A,H */\r | |
1854 | temp = HIGH_REGISTER(HL);\r | |
1855 | acu = HIGH_REGISTER(AF);\r | |
1856 | sum = acu - temp - TSTFLAG(C);\r | |
1857 | cbits = acu ^ temp ^ sum;\r | |
1858 | AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);\r | |
1859 | break;\r | |
1860 | \r | |
1861 | case 0x9d: /* SBC A,L */\r | |
1862 | temp = LOW_REGISTER(HL);\r | |
1863 | acu = HIGH_REGISTER(AF);\r | |
1864 | sum = acu - temp - TSTFLAG(C);\r | |
1865 | cbits = acu ^ temp ^ sum;\r | |
1866 | AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);\r | |
1867 | break;\r | |
1868 | \r | |
1869 | case 0x9e: /* SBC A,(HL) */\r | |
1870 | temp = GET_BYTE(HL);\r | |
1871 | acu = HIGH_REGISTER(AF);\r | |
1872 | sum = acu - temp - TSTFLAG(C);\r | |
1873 | cbits = acu ^ temp ^ sum;\r | |
1874 | AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);\r | |
1875 | break;\r | |
1876 | \r | |
1877 | case 0x9f: /* SBC A,A */\r | |
1878 | cbits = -TSTFLAG(C);\r | |
1879 | AF = subTable[cbits & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PVS(cbits));\r | |
1880 | break;\r | |
1881 | \r | |
1882 | case 0xa0: /* AND B */\r | |
1883 | AF = andTable[((AF & BC) >> 8) & 0xff];\r | |
1884 | break;\r | |
1885 | \r | |
1886 | case 0xa1: /* AND C */\r | |
1887 | AF = andTable[((AF >> 8) & BC) & 0xff];\r | |
1888 | break;\r | |
1889 | \r | |
1890 | case 0xa2: /* AND D */\r | |
1891 | AF = andTable[((AF & DE) >> 8) & 0xff];\r | |
1892 | break;\r | |
1893 | \r | |
1894 | case 0xa3: /* AND E */\r | |
1895 | AF = andTable[((AF >> 8) & DE) & 0xff];\r | |
1896 | break;\r | |
1897 | \r | |
1898 | case 0xa4: /* AND H */\r | |
1899 | AF = andTable[((AF & HL) >> 8) & 0xff];\r | |
1900 | break;\r | |
1901 | \r | |
1902 | case 0xa5: /* AND L */\r | |
1903 | AF = andTable[((AF >> 8) & HL) & 0xff];\r | |
1904 | break;\r | |
1905 | \r | |
1906 | case 0xa6: /* AND (HL) */\r | |
1907 | AF = andTable[((AF >> 8) & GET_BYTE(HL)) & 0xff];\r | |
1908 | break;\r | |
1909 | \r | |
1910 | case 0xa7: /* AND A */\r | |
1911 | AF = andTable[(AF >> 8) & 0xff];\r | |
1912 | break;\r | |
1913 | \r | |
1914 | case 0xa8: /* XOR B */\r | |
1915 | AF = xororTable[((AF ^ BC) >> 8) & 0xff];\r | |
1916 | break;\r | |
1917 | \r | |
1918 | case 0xa9: /* XOR C */\r | |
1919 | AF = xororTable[((AF >> 8) ^ BC) & 0xff];\r | |
1920 | break;\r | |
1921 | \r | |
1922 | case 0xaa: /* XOR D */\r | |
1923 | AF = xororTable[((AF ^ DE) >> 8) & 0xff];\r | |
1924 | break;\r | |
1925 | \r | |
1926 | case 0xab: /* XOR E */\r | |
1927 | AF = xororTable[((AF >> 8) ^ DE) & 0xff];\r | |
1928 | break;\r | |
1929 | \r | |
1930 | case 0xac: /* XOR H */\r | |
1931 | AF = xororTable[((AF ^ HL) >> 8) & 0xff];\r | |
1932 | break;\r | |
1933 | \r | |
1934 | case 0xad: /* XOR L */\r | |
1935 | AF = xororTable[((AF >> 8) ^ HL) & 0xff];\r | |
1936 | break;\r | |
1937 | \r | |
1938 | case 0xae: /* XOR (HL) */\r | |
1939 | AF = xororTable[((AF >> 8) ^ GET_BYTE(HL)) & 0xff];\r | |
1940 | break;\r | |
1941 | \r | |
1942 | case 0xaf: /* XOR A */\r | |
1943 | AF = 0x44;\r | |
1944 | break;\r | |
1945 | \r | |
1946 | case 0xb0: /* OR B */\r | |
1947 | AF = xororTable[((AF | BC) >> 8) & 0xff];\r | |
1948 | break;\r | |
1949 | \r | |
1950 | case 0xb1: /* OR C */\r | |
1951 | AF = xororTable[((AF >> 8) | BC) & 0xff];\r | |
1952 | break;\r | |
1953 | \r | |
1954 | case 0xb2: /* OR D */\r | |
1955 | AF = xororTable[((AF | DE) >> 8) & 0xff];\r | |
1956 | break;\r | |
1957 | \r | |
1958 | case 0xb3: /* OR E */\r | |
1959 | AF = xororTable[((AF >> 8) | DE) & 0xff];\r | |
1960 | break;\r | |
1961 | \r | |
1962 | case 0xb4: /* OR H */\r | |
1963 | AF = xororTable[((AF | HL) >> 8) & 0xff];\r | |
1964 | break;\r | |
1965 | \r | |
1966 | case 0xb5: /* OR L */\r | |
1967 | AF = xororTable[((AF >> 8) | HL) & 0xff];\r | |
1968 | break;\r | |
1969 | \r | |
1970 | case 0xb6: /* OR (HL) */\r | |
1971 | AF = xororTable[((AF >> 8) | GET_BYTE(HL)) & 0xff];\r | |
1972 | break;\r | |
1973 | \r | |
1974 | case 0xb7: /* OR A */\r | |
1975 | AF = xororTable[(AF >> 8) & 0xff];\r | |
1976 | break;\r | |
1977 | \r | |
1978 | case 0xb8: /* CP B */\r | |
1979 | temp = HIGH_REGISTER(BC);\r | |
1980 | AF = (AF & ~0x28) | (temp & 0x28);\r | |
1981 | acu = HIGH_REGISTER(AF);\r | |
1982 | sum = acu - temp;\r | |
1983 | cbits = acu ^ temp ^ sum;\r | |
1984 | AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |\r | |
1985 | (SET_PV) | cbits2Table[cbits & 0x1ff];\r | |
1986 | break;\r | |
1987 | \r | |
1988 | case 0xb9: /* CP C */\r | |
1989 | temp = LOW_REGISTER(BC);\r | |
1990 | AF = (AF & ~0x28) | (temp & 0x28);\r | |
1991 | acu = HIGH_REGISTER(AF);\r | |
1992 | sum = acu - temp;\r | |
1993 | cbits = acu ^ temp ^ sum;\r | |
1994 | AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |\r | |
1995 | (SET_PV) | cbits2Table[cbits & 0x1ff];\r | |
1996 | break;\r | |
1997 | \r | |
1998 | case 0xba: /* CP D */\r | |
1999 | temp = HIGH_REGISTER(DE);\r | |
2000 | AF = (AF & ~0x28) | (temp & 0x28);\r | |
2001 | acu = HIGH_REGISTER(AF);\r | |
2002 | sum = acu - temp;\r | |
2003 | cbits = acu ^ temp ^ sum;\r | |
2004 | AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |\r | |
2005 | (SET_PV) | cbits2Table[cbits & 0x1ff];\r | |
2006 | break;\r | |
2007 | \r | |
2008 | case 0xbb: /* CP E */\r | |
2009 | temp = LOW_REGISTER(DE);\r | |
2010 | AF = (AF & ~0x28) | (temp & 0x28);\r | |
2011 | acu = HIGH_REGISTER(AF);\r | |
2012 | sum = acu - temp;\r | |
2013 | cbits = acu ^ temp ^ sum;\r | |
2014 | AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |\r | |
2015 | (SET_PV) | cbits2Table[cbits & 0x1ff];\r | |
2016 | break;\r | |
2017 | \r | |
2018 | case 0xbc: /* CP H */\r | |
2019 | temp = HIGH_REGISTER(HL);\r | |
2020 | AF = (AF & ~0x28) | (temp & 0x28);\r | |
2021 | acu = HIGH_REGISTER(AF);\r | |
2022 | sum = acu - temp;\r | |
2023 | cbits = acu ^ temp ^ sum;\r | |
2024 | AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |\r | |
2025 | (SET_PV) | cbits2Table[cbits & 0x1ff];\r | |
2026 | break;\r | |
2027 | \r | |
2028 | case 0xbd: /* CP L */\r | |
2029 | temp = LOW_REGISTER(HL);\r | |
2030 | AF = (AF & ~0x28) | (temp & 0x28);\r | |
2031 | acu = HIGH_REGISTER(AF);\r | |
2032 | sum = acu - temp;\r | |
2033 | cbits = acu ^ temp ^ sum;\r | |
2034 | AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |\r | |
2035 | (SET_PV) | cbits2Table[cbits & 0x1ff];\r | |
2036 | break;\r | |
2037 | \r | |
2038 | case 0xbe: /* CP (HL) */\r | |
2039 | temp = GET_BYTE(HL);\r | |
2040 | AF = (AF & ~0x28) | (temp & 0x28);\r | |
2041 | acu = HIGH_REGISTER(AF);\r | |
2042 | sum = acu - temp;\r | |
2043 | cbits = acu ^ temp ^ sum;\r | |
2044 | AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |\r | |
2045 | (SET_PV) | cbits2Table[cbits & 0x1ff];\r | |
2046 | break;\r | |
2047 | \r | |
2048 | case 0xbf: /* CP A */\r | |
2049 | SET_LOW_REGISTER(AF, (HIGH_REGISTER(AF) & 0x28) | (chiptype == CHIP_TYPE_Z80 ? 0x42 : 0x46));\r | |
2050 | break;\r | |
2051 | \r | |
2052 | case 0xc0: /* RET NZ */\r | |
2053 | if (!(TSTFLAG(Z))) POP(PC);\r | |
2054 | break;\r | |
2055 | \r | |
2056 | case 0xc1: /* POP BC */\r | |
2057 | POP(BC);\r | |
2058 | break;\r | |
2059 | \r | |
2060 | case 0xc2: /* JP NZ,nnnn */\r | |
2061 | JPC(!TSTFLAG(Z));\r | |
2062 | break;\r | |
2063 | \r | |
2064 | case 0xc3: /* JP nnnn */\r | |
2065 | JPC(1);\r | |
2066 | break;\r | |
2067 | \r | |
2068 | case 0xc4: /* CALL NZ,nnnn */\r | |
2069 | CALLC(!TSTFLAG(Z));\r | |
2070 | break;\r | |
2071 | \r | |
2072 | case 0xc5: /* PUSH BC */\r | |
2073 | PUSH(BC);\r | |
2074 | break;\r | |
2075 | \r | |
2076 | case 0xc6: /* ADD A,nn */\r | |
2077 | temp = RAM_PP(PC);\r | |
2078 | acu = HIGH_REGISTER(AF);\r | |
2079 | sum = acu + temp;\r | |
2080 | cbits = acu ^ temp ^ sum;\r | |
2081 | AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);\r | |
2082 | break;\r | |
2083 | \r | |
2084 | case 0xc7: /* RST 0 */\r | |
2085 | PUSH(PC);\r | |
2086 | PC = 0;\r | |
2087 | break;\r | |
2088 | \r | |
2089 | case 0xc8: /* RET Z */\r | |
2090 | if (TSTFLAG(Z)) POP(PC);\r | |
2091 | break;\r | |
2092 | \r | |
2093 | case 0xc9: /* RET */\r | |
2094 | POP(PC);\r | |
2095 | break;\r | |
2096 | \r | |
2097 | case 0xca: /* JP Z,nnnn */\r | |
2098 | JPC(TSTFLAG(Z));\r | |
2099 | break;\r | |
2100 | \r | |
2101 | case 0xcb: /* CB prefix */\r | |
2102 | CHECK_CPU_8080;\r | |
2103 | adr = HL;\r | |
2104 | switch ((op = GET_BYTE(PC)) & 7) {\r | |
2105 | \r | |
2106 | case 0:\r | |
2107 | ++PC;\r | |
2108 | acu = HIGH_REGISTER(BC);\r | |
2109 | break;\r | |
2110 | \r | |
2111 | case 1:\r | |
2112 | ++PC;\r | |
2113 | acu = LOW_REGISTER(BC);\r | |
2114 | break;\r | |
2115 | \r | |
2116 | case 2:\r | |
2117 | ++PC;\r | |
2118 | acu = HIGH_REGISTER(DE);\r | |
2119 | break;\r | |
2120 | \r | |
2121 | case 3:\r | |
2122 | ++PC;\r | |
2123 | acu = LOW_REGISTER(DE);\r | |
2124 | break;\r | |
2125 | \r | |
2126 | case 4:\r | |
2127 | ++PC;\r | |
2128 | acu = HIGH_REGISTER(HL);\r | |
2129 | break;\r | |
2130 | \r | |
2131 | case 5:\r | |
2132 | ++PC;\r | |
2133 | acu = LOW_REGISTER(HL);\r | |
2134 | break;\r | |
2135 | \r | |
2136 | case 6:\r | |
2137 | ++PC;\r | |
2138 | acu = GET_BYTE(adr);\r | |
2139 | break;\r | |
2140 | \r | |
2141 | case 7:\r | |
2142 | ++PC;\r | |
2143 | acu = HIGH_REGISTER(AF);\r | |
2144 | break;\r | |
2145 | }\r | |
2146 | switch (op & 0xc0) {\r | |
2147 | \r | |
2148 | case 0x00: /* shift/rotate */\r | |
2149 | switch (op & 0x38) {\r | |
2150 | \r | |
2151 | case 0x00:/* RLC */\r | |
2152 | temp = (acu << 1) | (acu >> 7);\r | |
2153 | cbits = temp & 1;\r | |
2154 | goto cbshflg1;\r | |
2155 | \r | |
2156 | case 0x08:/* RRC */\r | |
2157 | temp = (acu >> 1) | (acu << 7);\r | |
2158 | cbits = temp & 0x80;\r | |
2159 | goto cbshflg1;\r | |
2160 | \r | |
2161 | case 0x10:/* RL */\r | |
2162 | temp = (acu << 1) | TSTFLAG(C);\r | |
2163 | cbits = acu & 0x80;\r | |
2164 | goto cbshflg1;\r | |
2165 | \r | |
2166 | case 0x18:/* RR */\r | |
2167 | temp = (acu >> 1) | (TSTFLAG(C) << 7);\r | |
2168 | cbits = acu & 1;\r | |
2169 | goto cbshflg1;\r | |
2170 | \r | |
2171 | case 0x20:/* SLA */\r | |
2172 | temp = acu << 1;\r | |
2173 | cbits = acu & 0x80;\r | |
2174 | goto cbshflg1;\r | |
2175 | \r | |
2176 | case 0x28:/* SRA */\r | |
2177 | temp = (acu >> 1) | (acu & 0x80);\r | |
2178 | cbits = acu & 1;\r | |
2179 | goto cbshflg1;\r | |
2180 | \r | |
2181 | case 0x30:/* SLIA */\r | |
2182 | temp = (acu << 1) | 1;\r | |
2183 | cbits = acu & 0x80;\r | |
2184 | goto cbshflg1;\r | |
2185 | \r | |
2186 | case 0x38:/* SRL */\r | |
2187 | temp = acu >> 1;\r | |
2188 | cbits = acu & 1;\r | |
2189 | cbshflg1:\r | |
2190 | AF = (AF & ~0xff) | rotateShiftTable[temp & 0xff] | !!cbits;\r | |
2191 | }\r | |
2192 | break;\r | |
2193 | \r | |
2194 | case 0x40: /* BIT */\r | |
2195 | if (acu & (1 << ((op >> 3) & 7)))\r | |
2196 | AF = (AF & ~0xfe) | 0x10 | (((op & 0x38) == 0x38) << 7);\r | |
2197 | else AF = (AF & ~0xfe) | 0x54;\r | |
2198 | if ((op & 7) != 6) AF |= (acu & 0x28);\r | |
2199 | temp = acu;\r | |
2200 | break;\r | |
2201 | \r | |
2202 | case 0x80: /* RES */\r | |
2203 | temp = acu & ~(1 << ((op >> 3) & 7));\r | |
2204 | break;\r | |
2205 | \r | |
2206 | case 0xc0: /* SET */\r | |
2207 | temp = acu | (1 << ((op >> 3) & 7));\r | |
2208 | break;\r | |
2209 | }\r | |
2210 | switch (op & 7) {\r | |
2211 | \r | |
2212 | case 0:\r | |
2213 | SET_HIGH_REGISTER(BC, temp);\r | |
2214 | break;\r | |
2215 | \r | |
2216 | case 1:\r | |
2217 | SET_LOW_REGISTER(BC, temp);\r | |
2218 | break;\r | |
2219 | \r | |
2220 | case 2:\r | |
2221 | SET_HIGH_REGISTER(DE, temp);\r | |
2222 | break;\r | |
2223 | \r | |
2224 | case 3:\r | |
2225 | SET_LOW_REGISTER(DE, temp);\r | |
2226 | break;\r | |
2227 | \r | |
2228 | case 4:\r | |
2229 | SET_HIGH_REGISTER(HL, temp);\r | |
2230 | break;\r | |
2231 | \r | |
2232 | case 5:\r | |
2233 | SET_LOW_REGISTER(HL, temp);\r | |
2234 | break;\r | |
2235 | \r | |
2236 | case 6:\r | |
2237 | PUT_BYTE(adr, temp);\r | |
2238 | break;\r | |
2239 | \r | |
2240 | case 7:\r | |
2241 | SET_HIGH_REGISTER(AF, temp);\r | |
2242 | break;\r | |
2243 | }\r | |
2244 | break;\r | |
2245 | \r | |
2246 | case 0xcc: /* CALL Z,nnnn */\r | |
2247 | CALLC(TSTFLAG(Z));\r | |
2248 | break;\r | |
2249 | \r | |
2250 | case 0xcd: /* CALL nnnn */\r | |
2251 | CALLC(1);\r | |
2252 | break;\r | |
2253 | \r | |
2254 | case 0xce: /* ADC A,nn */\r | |
2255 | temp = RAM_PP(PC);\r | |
2256 | acu = HIGH_REGISTER(AF);\r | |
2257 | sum = acu + temp + TSTFLAG(C);\r | |
2258 | cbits = acu ^ temp ^ sum;\r | |
2259 | AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);\r | |
2260 | break;\r | |
2261 | \r | |
2262 | case 0xcf: /* RST 8 */\r | |
2263 | PUSH(PC);\r | |
2264 | PC = 8;\r | |
2265 | break;\r | |
2266 | \r | |
2267 | case 0xd0: /* RET NC */\r | |
2268 | if (!(TSTFLAG(C))) POP(PC);\r | |
2269 | break;\r | |
2270 | \r | |
2271 | case 0xd1: /* POP DE */\r | |
2272 | POP(DE);\r | |
2273 | break;\r | |
2274 | \r | |
2275 | case 0xd2: /* JP NC,nnnn */\r | |
2276 | JPC(!TSTFLAG(C));\r | |
2277 | break;\r | |
2278 | \r | |
2279 | case 0xd3: /* OUT (nn),A */\r | |
2280 | out(RAM_PP(PC), HIGH_REGISTER(AF));\r | |
2281 | break;\r | |
2282 | \r | |
2283 | case 0xd4: /* CALL NC,nnnn */\r | |
2284 | CALLC(!TSTFLAG(C));\r | |
2285 | break;\r | |
2286 | \r | |
2287 | case 0xd5: /* PUSH DE */\r | |
2288 | PUSH(DE);\r | |
2289 | break;\r | |
2290 | \r | |
2291 | case 0xd6: /* SUB nn */\r | |
2292 | temp = RAM_PP(PC);\r | |
2293 | acu = HIGH_REGISTER(AF);\r | |
2294 | sum = acu - temp;\r | |
2295 | cbits = acu ^ temp ^ sum;\r | |
2296 | AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);\r | |
2297 | break;\r | |
2298 | \r | |
2299 | case 0xd7: /* RST 10H */\r | |
2300 | PUSH(PC);\r | |
2301 | PC = 0x10;\r | |
2302 | break;\r | |
2303 | \r | |
2304 | case 0xd8: /* RET C */\r | |
2305 | if (TSTFLAG(C)) POP(PC);\r | |
2306 | break;\r | |
2307 | \r | |
2308 | case 0xd9: /* EXX */\r | |
2309 | CHECK_CPU_8080;\r | |
2310 | temp = BC;\r | |
2311 | BC = BC1_S;\r | |
2312 | BC1_S = temp;\r | |
2313 | temp = DE;\r | |
2314 | DE = DE1_S;\r | |
2315 | DE1_S = temp;\r | |
2316 | temp = HL;\r | |
2317 | HL = HL1_S;\r | |
2318 | HL1_S = temp;\r | |
2319 | break;\r | |
2320 | \r | |
2321 | case 0xda: /* JP C,nnnn */\r | |
2322 | JPC(TSTFLAG(C));\r | |
2323 | break;\r | |
2324 | \r | |
2325 | case 0xdb: /* IN A,(nn) */\r | |
2326 | SET_HIGH_REGISTER(AF, in(RAM_PP(PC)));\r | |
2327 | break;\r | |
2328 | \r | |
2329 | case 0xdc: /* CALL C,nnnn */\r | |
2330 | CALLC(TSTFLAG(C));\r | |
2331 | break;\r | |
2332 | \r | |
2333 | case 0xdd: /* DD prefix */\r | |
2334 | CHECK_CPU_8080;\r | |
2335 | switch (op = RAM_PP(PC)) {\r | |
2336 | \r | |
2337 | case 0x09: /* ADD IX,BC */\r | |
2338 | IX &= ADDRMASK;\r | |
2339 | BC &= ADDRMASK;\r | |
2340 | sum = IX + BC;\r | |
2341 | AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) | cbitsTable[(IX ^ BC ^ sum) >> 8];\r | |
2342 | IX = sum;\r | |
2343 | break;\r | |
2344 | \r | |
2345 | case 0x19: /* ADD IX,DE */\r | |
2346 | IX &= ADDRMASK;\r | |
2347 | DE &= ADDRMASK;\r | |
2348 | sum = IX + DE;\r | |
2349 | AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) | cbitsTable[(IX ^ DE ^ sum) >> 8];\r | |
2350 | IX = sum;\r | |
2351 | break;\r | |
2352 | \r | |
2353 | case 0x21: /* LD IX,nnnn */\r | |
2354 | IX = GET_WORD(PC);\r | |
2355 | PC += 2;\r | |
2356 | break;\r | |
2357 | \r | |
2358 | case 0x22: /* LD (nnnn),IX */\r | |
2359 | temp = GET_WORD(PC);\r | |
2360 | PUT_WORD(temp, IX);\r | |
2361 | PC += 2;\r | |
2362 | break;\r | |
2363 | \r | |
2364 | case 0x23: /* INC IX */\r | |
2365 | ++IX;\r | |
2366 | break;\r | |
2367 | \r | |
2368 | case 0x24: /* INC IXH */\r | |
2369 | IX += 0x100;\r | |
2370 | AF = (AF & ~0xfe) | incZ80Table[HIGH_REGISTER(IX)];\r | |
2371 | break;\r | |
2372 | \r | |
2373 | case 0x25: /* DEC IXH */\r | |
2374 | IX -= 0x100;\r | |
2375 | AF = (AF & ~0xfe) | decZ80Table[HIGH_REGISTER(IX)];\r | |
2376 | break;\r | |
2377 | \r | |
2378 | case 0x26: /* LD IXH,nn */\r | |
2379 | SET_HIGH_REGISTER(IX, RAM_PP(PC));\r | |
2380 | break;\r | |
2381 | \r | |
2382 | case 0x29: /* ADD IX,IX */\r | |
2383 | IX &= ADDRMASK;\r | |
2384 | sum = IX + IX;\r | |
2385 | AF = (AF & ~0x3b) | cbitsDup16Table[sum >> 8];\r | |
2386 | IX = sum;\r | |
2387 | break;\r | |
2388 | \r | |
2389 | case 0x2a: /* LD IX,(nnnn) */\r | |
2390 | temp = GET_WORD(PC);\r | |
2391 | IX = GET_WORD(temp);\r | |
2392 | PC += 2;\r | |
2393 | break;\r | |
2394 | \r | |
2395 | case 0x2b: /* DEC IX */\r | |
2396 | --IX;\r | |
2397 | break;\r | |
2398 | \r | |
2399 | case 0x2c: /* INC IXL */\r | |
2400 | temp = LOW_REGISTER(IX) + 1;\r | |
2401 | SET_LOW_REGISTER(IX, temp);\r | |
2402 | AF = (AF & ~0xfe) | incZ80Table[temp];\r | |
2403 | break;\r | |
2404 | \r | |
2405 | case 0x2d: /* DEC IXL */\r | |
2406 | temp = LOW_REGISTER(IX) - 1;\r | |
2407 | SET_LOW_REGISTER(IX, temp);\r | |
2408 | AF = (AF & ~0xfe) | decZ80Table[temp & 0xff];\r | |
2409 | break;\r | |
2410 | \r | |
2411 | case 0x2e: /* LD IXL,nn */\r | |
2412 | SET_LOW_REGISTER(IX, RAM_PP(PC));\r | |
2413 | break;\r | |
2414 | \r | |
2415 | case 0x34: /* INC (IX+dd) */\r | |
2416 | adr = IX + (int8) RAM_PP(PC);\r | |
2417 | temp = GET_BYTE(adr) + 1;\r | |
2418 | PUT_BYTE(adr, temp);\r | |
2419 | AF = (AF & ~0xfe) | incZ80Table[temp];\r | |
2420 | break;\r | |
2421 | \r | |
2422 | case 0x35: /* DEC (IX+dd) */\r | |
2423 | adr = IX + (int8) RAM_PP(PC);\r | |
2424 | temp = GET_BYTE(adr) - 1;\r | |
2425 | PUT_BYTE(adr, temp);\r | |
2426 | AF = (AF & ~0xfe) | decZ80Table[temp & 0xff];\r | |
2427 | break;\r | |
2428 | \r | |
2429 | case 0x36: /* LD (IX+dd),nn */\r | |
2430 | adr = IX + (int8) RAM_PP(PC);\r | |
2431 | PUT_BYTE(adr, RAM_PP(PC));\r | |
2432 | break;\r | |
2433 | \r | |
2434 | case 0x39: /* ADD IX,SP */\r | |
2435 | IX &= ADDRMASK;\r | |
2436 | SP &= ADDRMASK;\r | |
2437 | sum = IX + SP;\r | |
2438 | AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) | cbitsTable[(IX ^ SP ^ sum) >> 8];\r | |
2439 | IX = sum;\r | |
2440 | break;\r | |
2441 | \r | |
2442 | case 0x44: /* LD B,IXH */\r | |
2443 | SET_HIGH_REGISTER(BC, HIGH_REGISTER(IX));\r | |
2444 | break;\r | |
2445 | \r | |
2446 | case 0x45: /* LD B,IXL */\r | |
2447 | SET_HIGH_REGISTER(BC, LOW_REGISTER(IX));\r | |
2448 | break;\r | |
2449 | \r | |
2450 | case 0x46: /* LD B,(IX+dd) */\r | |
2451 | adr = IX + (int8) RAM_PP(PC);\r | |
2452 | SET_HIGH_REGISTER(BC, GET_BYTE(adr));\r | |
2453 | break;\r | |
2454 | \r | |
2455 | case 0x4c: /* LD C,IXH */\r | |
2456 | SET_LOW_REGISTER(BC, HIGH_REGISTER(IX));\r | |
2457 | break;\r | |
2458 | \r | |
2459 | case 0x4d: /* LD C,IXL */\r | |
2460 | SET_LOW_REGISTER(BC, LOW_REGISTER(IX));\r | |
2461 | break;\r | |
2462 | \r | |
2463 | case 0x4e: /* LD C,(IX+dd) */\r | |
2464 | adr = IX + (int8) RAM_PP(PC);\r | |
2465 | SET_LOW_REGISTER(BC, GET_BYTE(adr));\r | |
2466 | break;\r | |
2467 | \r | |
2468 | case 0x54: /* LD D,IXH */\r | |
2469 | SET_HIGH_REGISTER(DE, HIGH_REGISTER(IX));\r | |
2470 | break;\r | |
2471 | \r | |
2472 | case 0x55: /* LD D,IXL */\r | |
2473 | SET_HIGH_REGISTER(DE, LOW_REGISTER(IX));\r | |
2474 | break;\r | |
2475 | \r | |
2476 | case 0x56: /* LD D,(IX+dd) */\r | |
2477 | adr = IX + (int8) RAM_PP(PC);\r | |
2478 | SET_HIGH_REGISTER(DE, GET_BYTE(adr));\r | |
2479 | break;\r | |
2480 | \r | |
2481 | case 0x5c: /* LD E,IXH */\r | |
2482 | SET_LOW_REGISTER(DE, HIGH_REGISTER(IX));\r | |
2483 | break;\r | |
2484 | \r | |
2485 | case 0x5d: /* LD E,IXL */\r | |
2486 | SET_LOW_REGISTER(DE, LOW_REGISTER(IX));\r | |
2487 | break;\r | |
2488 | \r | |
2489 | case 0x5e: /* LD E,(IX+dd) */\r | |
2490 | adr = IX + (int8) RAM_PP(PC);\r | |
2491 | SET_LOW_REGISTER(DE, GET_BYTE(adr));\r | |
2492 | break;\r | |
2493 | \r | |
2494 | case 0x60: /* LD IXH,B */\r | |
2495 | SET_HIGH_REGISTER(IX, HIGH_REGISTER(BC));\r | |
2496 | break;\r | |
2497 | \r | |
2498 | case 0x61: /* LD IXH,C */\r | |
2499 | SET_HIGH_REGISTER(IX, LOW_REGISTER(BC));\r | |
2500 | break;\r | |
2501 | \r | |
2502 | case 0x62: /* LD IXH,D */\r | |
2503 | SET_HIGH_REGISTER(IX, HIGH_REGISTER(DE));\r | |
2504 | break;\r | |
2505 | \r | |
2506 | case 0x63: /* LD IXH,E */\r | |
2507 | SET_HIGH_REGISTER(IX, LOW_REGISTER(DE));\r | |
2508 | break;\r | |
2509 | \r | |
2510 | case 0x64: /* LD IXH,IXH */\r | |
2511 | break;\r | |
2512 | \r | |
2513 | case 0x65: /* LD IXH,IXL */\r | |
2514 | SET_HIGH_REGISTER(IX, LOW_REGISTER(IX));\r | |
2515 | break;\r | |
2516 | \r | |
2517 | case 0x66: /* LD H,(IX+dd) */\r | |
2518 | adr = IX + (int8) RAM_PP(PC);\r | |
2519 | SET_HIGH_REGISTER(HL, GET_BYTE(adr));\r | |
2520 | break;\r | |
2521 | \r | |
2522 | case 0x67: /* LD IXH,A */\r | |
2523 | SET_HIGH_REGISTER(IX, HIGH_REGISTER(AF));\r | |
2524 | break;\r | |
2525 | \r | |
2526 | case 0x68: /* LD IXL,B */\r | |
2527 | SET_LOW_REGISTER(IX, HIGH_REGISTER(BC));\r | |
2528 | break;\r | |
2529 | \r | |
2530 | case 0x69: /* LD IXL,C */\r | |
2531 | SET_LOW_REGISTER(IX, LOW_REGISTER(BC));\r | |
2532 | break;\r | |
2533 | \r | |
2534 | case 0x6a: /* LD IXL,D */\r | |
2535 | SET_LOW_REGISTER(IX, HIGH_REGISTER(DE));\r | |
2536 | break;\r | |
2537 | \r | |
2538 | case 0x6b: /* LD IXL,E */\r | |
2539 | SET_LOW_REGISTER(IX, LOW_REGISTER(DE));\r | |
2540 | break;\r | |
2541 | \r | |
2542 | case 0x6c: /* LD IXL,IXH */\r | |
2543 | SET_LOW_REGISTER(IX, HIGH_REGISTER(IX));\r | |
2544 | break;\r | |
2545 | \r | |
2546 | case 0x6d: /* LD IXL,IXL */\r | |
2547 | break;\r | |
2548 | \r | |
2549 | case 0x6e: /* LD L,(IX+dd) */\r | |
2550 | adr = IX + (int8) RAM_PP(PC);\r | |
2551 | SET_LOW_REGISTER(HL, GET_BYTE(adr));\r | |
2552 | break;\r | |
2553 | \r | |
2554 | case 0x6f: /* LD IXL,A */\r | |
2555 | SET_LOW_REGISTER(IX, HIGH_REGISTER(AF));\r | |
2556 | break;\r | |
2557 | \r | |
2558 | case 0x70: /* LD (IX+dd),B */\r | |
2559 | adr = IX + (int8) RAM_PP(PC);\r | |
2560 | PUT_BYTE(adr, HIGH_REGISTER(BC));\r | |
2561 | break;\r | |
2562 | \r | |
2563 | case 0x71: /* LD (IX+dd),C */\r | |
2564 | adr = IX + (int8) RAM_PP(PC);\r | |
2565 | PUT_BYTE(adr, LOW_REGISTER(BC));\r | |
2566 | break;\r | |
2567 | \r | |
2568 | case 0x72: /* LD (IX+dd),D */\r | |
2569 | adr = IX + (int8) RAM_PP(PC);\r | |
2570 | PUT_BYTE(adr, HIGH_REGISTER(DE));\r | |
2571 | break;\r | |
2572 | \r | |
2573 | case 0x73: /* LD (IX+dd),E */\r | |
2574 | adr = IX + (int8) RAM_PP(PC);\r | |
2575 | PUT_BYTE(adr, LOW_REGISTER(DE));\r | |
2576 | break;\r | |
2577 | \r | |
2578 | case 0x74: /* LD (IX+dd),H */\r | |
2579 | adr = IX + (int8) RAM_PP(PC);\r | |
2580 | PUT_BYTE(adr, HIGH_REGISTER(HL));\r | |
2581 | break;\r | |
2582 | \r | |
2583 | case 0x75: /* LD (IX+dd),L */\r | |
2584 | adr = IX + (int8) RAM_PP(PC);\r | |
2585 | PUT_BYTE(adr, LOW_REGISTER(HL));\r | |
2586 | break;\r | |
2587 | \r | |
2588 | case 0x77: /* LD (IX+dd),A */\r | |
2589 | adr = IX + (int8) RAM_PP(PC);\r | |
2590 | PUT_BYTE(adr, HIGH_REGISTER(AF));\r | |
2591 | break;\r | |
2592 | \r | |
2593 | case 0x7c: /* LD A,IXH */\r | |
2594 | SET_HIGH_REGISTER(AF, HIGH_REGISTER(IX));\r | |
2595 | break;\r | |
2596 | \r | |
2597 | case 0x7d: /* LD A,IXL */\r | |
2598 | SET_HIGH_REGISTER(AF, LOW_REGISTER(IX));\r | |
2599 | break;\r | |
2600 | \r | |
2601 | case 0x7e: /* LD A,(IX+dd) */\r | |
2602 | adr = IX + (int8) RAM_PP(PC);\r | |
2603 | SET_HIGH_REGISTER(AF, GET_BYTE(adr));\r | |
2604 | break;\r | |
2605 | \r | |
2606 | case 0x84: /* ADD A,IXH */\r | |
2607 | temp = HIGH_REGISTER(IX);\r | |
2608 | acu = HIGH_REGISTER(AF);\r | |
2609 | sum = acu + temp;\r | |
2610 | AF = addTable[sum] | cbitsZ80Table[acu ^ temp ^ sum];\r | |
2611 | break;\r | |
2612 | \r | |
2613 | case 0x85: /* ADD A,IXL */\r | |
2614 | temp = LOW_REGISTER(IX);\r | |
2615 | acu = HIGH_REGISTER(AF);\r | |
2616 | sum = acu + temp;\r | |
2617 | AF = addTable[sum] | cbitsZ80Table[acu ^ temp ^ sum];\r | |
2618 | break;\r | |
2619 | \r | |
2620 | case 0x86: /* ADD A,(IX+dd) */\r | |
2621 | adr = IX + (int8) RAM_PP(PC);\r | |
2622 | temp = GET_BYTE(adr);\r | |
2623 | acu = HIGH_REGISTER(AF);\r | |
2624 | sum = acu + temp;\r | |
2625 | AF = addTable[sum] | cbitsZ80Table[acu ^ temp ^ sum];\r | |
2626 | break;\r | |
2627 | \r | |
2628 | case 0x8c: /* ADC A,IXH */\r | |
2629 | temp = HIGH_REGISTER(IX);\r | |
2630 | acu = HIGH_REGISTER(AF);\r | |
2631 | sum = acu + temp + TSTFLAG(C);\r | |
2632 | AF = addTable[sum] | cbitsZ80Table[acu ^ temp ^ sum];\r | |
2633 | break;\r | |
2634 | \r | |
2635 | case 0x8d: /* ADC A,IXL */\r | |
2636 | temp = LOW_REGISTER(IX);\r | |
2637 | acu = HIGH_REGISTER(AF);\r | |
2638 | sum = acu + temp + TSTFLAG(C);\r | |
2639 | AF = addTable[sum] | cbitsZ80Table[acu ^ temp ^ sum];\r | |
2640 | break;\r | |
2641 | \r | |
2642 | case 0x8e: /* ADC A,(IX+dd) */\r | |
2643 | adr = IX + (int8) RAM_PP(PC);\r | |
2644 | temp = GET_BYTE(adr);\r | |
2645 | acu = HIGH_REGISTER(AF);\r | |
2646 | sum = acu + temp + TSTFLAG(C);\r | |
2647 | AF = addTable[sum] | cbitsZ80Table[acu ^ temp ^ sum];\r | |
2648 | break;\r | |
2649 | \r | |
2650 | case 0x96: /* SUB (IX+dd) */\r | |
2651 | adr = IX + (int8) RAM_PP(PC);\r | |
2652 | temp = GET_BYTE(adr);\r | |
2653 | acu = HIGH_REGISTER(AF);\r | |
2654 | sum = acu - temp;\r | |
2655 | AF = addTable[sum & 0xff] | cbits2Z80Table[(acu ^ temp ^ sum) & 0x1ff];\r | |
2656 | break;\r | |
2657 | \r | |
2658 | case 0x94: /* SUB IXH */\r | |
2659 | SETFLAG(C, 0);/* fall through, a bit less efficient but smaller code */\r | |
2660 | \r | |
2661 | case 0x9c: /* SBC A,IXH */\r | |
2662 | temp = HIGH_REGISTER(IX);\r | |
2663 | acu = HIGH_REGISTER(AF);\r | |
2664 | sum = acu - temp - TSTFLAG(C);\r | |
2665 | AF = addTable[sum & 0xff] | cbits2Z80Table[(acu ^ temp ^ sum) & 0x1ff];\r | |
2666 | break;\r | |
2667 | \r | |
2668 | case 0x95: /* SUB IXL */\r | |
2669 | SETFLAG(C, 0);/* fall through, a bit less efficient but smaller code */\r | |
2670 | \r | |
2671 | case 0x9d: /* SBC A,IXL */\r | |
2672 | temp = LOW_REGISTER(IX);\r | |
2673 | acu = HIGH_REGISTER(AF);\r | |
2674 | sum = acu - temp - TSTFLAG(C);\r | |
2675 | AF = addTable[sum & 0xff] | cbits2Z80Table[(acu ^ temp ^ sum) & 0x1ff];\r | |
2676 | break;\r | |
2677 | \r | |
2678 | case 0x9e: /* SBC A,(IX+dd) */\r | |
2679 | adr = IX + (int8) RAM_PP(PC);\r | |
2680 | temp = GET_BYTE(adr);\r | |
2681 | acu = HIGH_REGISTER(AF);\r | |
2682 | sum = acu - temp - TSTFLAG(C);\r | |
2683 | AF = addTable[sum & 0xff] | cbits2Z80Table[(acu ^ temp ^ sum) & 0x1ff];\r | |
2684 | break;\r | |
2685 | \r | |
2686 | case 0xa4: /* AND IXH */\r | |
2687 | AF = andTable[((AF & IX) >> 8) & 0xff];\r | |
2688 | break;\r | |
2689 | \r | |
2690 | case 0xa5: /* AND IXL */\r | |
2691 | AF = andTable[((AF >> 8) & IX) & 0xff];\r | |
2692 | break;\r | |
2693 | \r | |
2694 | case 0xa6: /* AND (IX+dd) */\r | |
2695 | adr = IX + (int8) RAM_PP(PC);\r | |
2696 | AF = andTable[((AF >> 8) & GET_BYTE(adr)) & 0xff];\r | |
2697 | break;\r | |
2698 | \r | |
2699 | case 0xac: /* XOR IXH */\r | |
2700 | AF = xororTable[((AF ^ IX) >> 8) & 0xff];\r | |
2701 | break;\r | |
2702 | \r | |
2703 | case 0xad: /* XOR IXL */\r | |
2704 | AF = xororTable[((AF >> 8) ^ IX) & 0xff];\r | |
2705 | break;\r | |
2706 | \r | |
2707 | case 0xae: /* XOR (IX+dd) */\r | |
2708 | adr = IX + (int8) RAM_PP(PC);\r | |
2709 | AF = xororTable[((AF >> 8) ^ GET_BYTE(adr)) & 0xff];\r | |
2710 | break;\r | |
2711 | \r | |
2712 | case 0xb4: /* OR IXH */\r | |
2713 | AF = xororTable[((AF | IX) >> 8) & 0xff];\r | |
2714 | break;\r | |
2715 | \r | |
2716 | case 0xb5: /* OR IXL */\r | |
2717 | AF = xororTable[((AF >> 8) | IX) & 0xff];\r | |
2718 | break;\r | |
2719 | \r | |
2720 | case 0xb6: /* OR (IX+dd) */\r | |
2721 | adr = IX + (int8) RAM_PP(PC);\r | |
2722 | AF = xororTable[((AF >> 8) | GET_BYTE(adr)) & 0xff];\r | |
2723 | break;\r | |
2724 | \r | |
2725 | case 0xbc: /* CP IXH */\r | |
2726 | temp = HIGH_REGISTER(IX);\r | |
2727 | AF = (AF & ~0x28) | (temp & 0x28);\r | |
2728 | acu = HIGH_REGISTER(AF);\r | |
2729 | sum = acu - temp;\r | |
2730 | AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |\r | |
2731 | cbits2Z80Table[(acu ^ temp ^ sum) & 0x1ff];\r | |
2732 | break;\r | |
2733 | \r | |
2734 | case 0xbd: /* CP IXL */\r | |
2735 | temp = LOW_REGISTER(IX);\r | |
2736 | AF = (AF & ~0x28) | (temp & 0x28);\r | |
2737 | acu = HIGH_REGISTER(AF);\r | |
2738 | sum = acu - temp;\r | |
2739 | AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |\r | |
2740 | cbits2Z80Table[(acu ^ temp ^ sum) & 0x1ff];\r | |
2741 | break;\r | |
2742 | \r | |
2743 | case 0xbe: /* CP (IX+dd) */\r | |
2744 | adr = IX + (int8) RAM_PP(PC);\r | |
2745 | temp = GET_BYTE(adr);\r | |
2746 | AF = (AF & ~0x28) | (temp & 0x28);\r | |
2747 | acu = HIGH_REGISTER(AF);\r | |
2748 | sum = acu - temp;\r | |
2749 | AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |\r | |
2750 | cbits2Z80Table[(acu ^ temp ^ sum) & 0x1ff];\r | |
2751 | break;\r | |
2752 | \r | |
2753 | case 0xcb: /* CB prefix */\r | |
2754 | adr = IX + (int8) RAM_PP(PC);\r | |
2755 | switch ((op = GET_BYTE(PC)) & 7) {\r | |
2756 | \r | |
2757 | case 0:\r | |
2758 | ++PC;\r | |
2759 | acu = HIGH_REGISTER(BC);\r | |
2760 | break;\r | |
2761 | \r | |
2762 | case 1:\r | |
2763 | ++PC;\r | |
2764 | acu = LOW_REGISTER(BC);\r | |
2765 | break;\r | |
2766 | \r | |
2767 | case 2:\r | |
2768 | ++PC;\r | |
2769 | acu = HIGH_REGISTER(DE);\r | |
2770 | break;\r | |
2771 | \r | |
2772 | case 3:\r | |
2773 | ++PC;\r | |
2774 | acu = LOW_REGISTER(DE);\r | |
2775 | break;\r | |
2776 | \r | |
2777 | case 4:\r | |
2778 | ++PC;\r | |
2779 | acu = HIGH_REGISTER(HL);\r | |
2780 | break;\r | |
2781 | \r | |
2782 | case 5:\r | |
2783 | ++PC;\r | |
2784 | acu = LOW_REGISTER(HL);\r | |
2785 | break;\r | |
2786 | \r | |
2787 | case 6:\r | |
2788 | ++PC;\r | |
2789 | acu = GET_BYTE(adr);\r | |
2790 | break;\r | |
2791 | \r | |
2792 | case 7:\r | |
2793 | ++PC;\r | |
2794 | acu = HIGH_REGISTER(AF);\r | |
2795 | break;\r | |
2796 | }\r | |
2797 | switch (op & 0xc0) {\r | |
2798 | \r | |
2799 | case 0x00: /* shift/rotate */\r | |
2800 | switch (op & 0x38) {\r | |
2801 | \r | |
2802 | case 0x00:/* RLC */\r | |
2803 | temp = (acu << 1) | (acu >> 7);\r | |
2804 | cbits = temp & 1;\r | |
2805 | goto cbshflg2;\r | |
2806 | \r | |
2807 | case 0x08:/* RRC */\r | |
2808 | temp = (acu >> 1) | (acu << 7);\r | |
2809 | cbits = temp & 0x80;\r | |
2810 | goto cbshflg2;\r | |
2811 | \r | |
2812 | case 0x10:/* RL */\r | |
2813 | temp = (acu << 1) | TSTFLAG(C);\r | |
2814 | cbits = acu & 0x80;\r | |
2815 | goto cbshflg2;\r | |
2816 | \r | |
2817 | case 0x18:/* RR */\r | |
2818 | temp = (acu >> 1) | (TSTFLAG(C) << 7);\r | |
2819 | cbits = acu & 1;\r | |
2820 | goto cbshflg2;\r | |
2821 | \r | |
2822 | case 0x20:/* SLA */\r | |
2823 | temp = acu << 1;\r | |
2824 | cbits = acu & 0x80;\r | |
2825 | goto cbshflg2;\r | |
2826 | \r | |
2827 | case 0x28:/* SRA */\r | |
2828 | temp = (acu >> 1) | (acu & 0x80);\r | |
2829 | cbits = acu & 1;\r | |
2830 | goto cbshflg2;\r | |
2831 | \r | |
2832 | case 0x30:/* SLIA */\r | |
2833 | temp = (acu << 1) | 1;\r | |
2834 | cbits = acu & 0x80;\r | |
2835 | goto cbshflg2;\r | |
2836 | \r | |
2837 | case 0x38:/* SRL */\r | |
2838 | temp = acu >> 1;\r | |
2839 | cbits = acu & 1;\r | |
2840 | cbshflg2:\r | |
2841 | AF = (AF & ~0xff) | rotateShiftTable[temp & 0xff] | !!cbits;\r | |
2842 | }\r | |
2843 | break;\r | |
2844 | \r | |
2845 | case 0x40: /* BIT */\r | |
2846 | if (acu & (1 << ((op >> 3) & 7)))\r | |
2847 | AF = (AF & ~0xfe) | 0x10 | (((op & 0x38) == 0x38) << 7);\r | |
2848 | else AF = (AF & ~0xfe) | 0x54;\r | |
2849 | if ((op & 7) != 6) AF |= (acu & 0x28);\r | |
2850 | temp = acu;\r | |
2851 | break;\r | |
2852 | \r | |
2853 | case 0x80: /* RES */\r | |
2854 | temp = acu & ~(1 << ((op >> 3) & 7));\r | |
2855 | break;\r | |
2856 | \r | |
2857 | case 0xc0: /* SET */\r | |
2858 | temp = acu | (1 << ((op >> 3) & 7));\r | |
2859 | break;\r | |
2860 | }\r | |
2861 | switch (op & 7) {\r | |
2862 | \r | |
2863 | case 0:\r | |
2864 | SET_HIGH_REGISTER(BC, temp);\r | |
2865 | break;\r | |
2866 | \r | |
2867 | case 1:\r | |
2868 | SET_LOW_REGISTER(BC, temp);\r | |
2869 | break;\r | |
2870 | \r | |
2871 | case 2:\r | |
2872 | SET_HIGH_REGISTER(DE, temp);\r | |
2873 | break;\r | |
2874 | \r | |
2875 | case 3:\r | |
2876 | SET_LOW_REGISTER(DE, temp);\r | |
2877 | break;\r | |
2878 | \r | |
2879 | case 4:\r | |
2880 | SET_HIGH_REGISTER(HL, temp);\r | |
2881 | break;\r | |
2882 | \r | |
2883 | case 5:\r | |
2884 | SET_LOW_REGISTER(HL, temp);\r | |
2885 | break;\r | |
2886 | \r | |
2887 | case 6:\r | |
2888 | PUT_BYTE(adr, temp);\r | |
2889 | break;\r | |
2890 | \r | |
2891 | case 7:\r | |
2892 | SET_HIGH_REGISTER(AF, temp);\r | |
2893 | break;\r | |
2894 | }\r | |
2895 | break;\r | |
2896 | \r | |
2897 | case 0xe1: /* POP IX */\r | |
2898 | POP(IX);\r | |
2899 | break;\r | |
2900 | \r | |
2901 | case 0xe3: /* EX (SP),IX */\r | |
2902 | temp = IX;\r | |
2903 | POP(IX);\r | |
2904 | PUSH(temp);\r | |
2905 | break;\r | |
2906 | \r | |
2907 | case 0xe5: /* PUSH IX */\r | |
2908 | PUSH(IX);\r | |
2909 | break;\r | |
2910 | \r | |
2911 | case 0xe9: /* JP (IX) */\r | |
2912 | PC = IX;\r | |
2913 | break;\r | |
2914 | \r | |
2915 | case 0xf9: /* LD SP,IX */\r | |
2916 | SP = IX;\r | |
2917 | break;\r | |
2918 | \r | |
2919 | default: /* ignore DD */\r | |
2920 | CHECK_CPU_Z80;\r | |
2921 | PC--;\r | |
2922 | }\r | |
2923 | break;\r | |
2924 | \r | |
2925 | case 0xde: /* SBC A,nn */\r | |
2926 | temp = RAM_PP(PC);\r | |
2927 | acu = HIGH_REGISTER(AF);\r | |
2928 | sum = acu - temp - TSTFLAG(C);\r | |
2929 | cbits = acu ^ temp ^ sum;\r | |
2930 | AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);\r | |
2931 | break;\r | |
2932 | \r | |
2933 | case 0xdf: /* RST 18H */\r | |
2934 | PUSH(PC);\r | |
2935 | PC = 0x18;\r | |
2936 | break;\r | |
2937 | \r | |
2938 | case 0xe0: /* RET PO */\r | |
2939 | if (!(TSTFLAG(P))) POP(PC);\r | |
2940 | break;\r | |
2941 | \r | |
2942 | case 0xe1: /* POP HL */\r | |
2943 | POP(HL);\r | |
2944 | break;\r | |
2945 | \r | |
2946 | case 0xe2: /* JP PO,nnnn */\r | |
2947 | JPC(!TSTFLAG(P));\r | |
2948 | break;\r | |
2949 | \r | |
2950 | case 0xe3: /* EX (SP),HL */\r | |
2951 | temp = HL;\r | |
2952 | POP(HL);\r | |
2953 | PUSH(temp);\r | |
2954 | break;\r | |
2955 | \r | |
2956 | case 0xe4: /* CALL PO,nnnn */\r | |
2957 | CALLC(!TSTFLAG(P));\r | |
2958 | break;\r | |
2959 | \r | |
2960 | case 0xe5: /* PUSH HL */\r | |
2961 | PUSH(HL);\r | |
2962 | break;\r | |
2963 | \r | |
2964 | case 0xe6: /* AND nn */\r | |
2965 | AF = andTable[((AF >> 8) & RAM_PP(PC)) & 0xff];\r | |
2966 | break;\r | |
2967 | \r | |
2968 | case 0xe7: /* RST 20H */\r | |
2969 | PUSH(PC);\r | |
2970 | PC = 0x20;\r | |
2971 | break;\r | |
2972 | \r | |
2973 | case 0xe8: /* RET PE */\r | |
2974 | if (TSTFLAG(P)) POP(PC);\r | |
2975 | break;\r | |
2976 | \r | |
2977 | case 0xe9: /* JP (HL) */\r | |
2978 | PC = HL;\r | |
2979 | break;\r | |
2980 | \r | |
2981 | case 0xea: /* JP PE,nnnn */\r | |
2982 | JPC(TSTFLAG(P));\r | |
2983 | break;\r | |
2984 | \r | |
2985 | case 0xeb: /* EX DE,HL */\r | |
2986 | temp = HL;\r | |
2987 | HL = DE;\r | |
2988 | DE = temp;\r | |
2989 | break;\r | |
2990 | \r | |
2991 | case 0xec: /* CALL PE,nnnn */\r | |
2992 | CALLC(TSTFLAG(P));\r | |
2993 | break;\r | |
2994 | \r | |
2995 | case 0xed: /* ED prefix */\r | |
2996 | CHECK_CPU_8080;\r | |
2997 | switch (op = RAM_PP(PC)) {\r | |
2998 | \r | |
2999 | case 0x40: /* IN B,(C) */\r | |
3000 | temp = in(LOW_REGISTER(BC));\r | |
3001 | SET_HIGH_REGISTER(BC, temp);\r | |
3002 | AF = (AF & ~0xfe) | rotateShiftTable[temp & 0xff];\r | |
3003 | break;\r | |
3004 | \r | |
3005 | case 0x41: /* OUT (C),B */\r | |
3006 | out(LOW_REGISTER(BC), HIGH_REGISTER(BC));\r | |
3007 | break;\r | |
3008 | \r | |
3009 | case 0x42: /* SBC HL,BC */\r | |
3010 | HL &= ADDRMASK;\r | |
3011 | BC &= ADDRMASK;\r | |
3012 | sum = HL - BC - TSTFLAG(C);\r | |
3013 | AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) | (((sum & ADDRMASK) == 0) << 6) |\r | |
3014 | cbits2Z80Table[((HL ^ BC ^ sum) >> 8) & 0x1ff];\r | |
3015 | HL = sum;\r | |
3016 | break;\r | |
3017 | \r | |
3018 | case 0x43: /* LD (nnnn),BC */\r | |
3019 | temp = GET_WORD(PC);\r | |
3020 | PUT_WORD(temp, BC);\r | |
3021 | PC += 2;\r | |
3022 | break;\r | |
3023 | \r | |
3024 | case 0x44: /* NEG */\r | |
3025 | \r | |
3026 | case 0x4C: /* NEG, unofficial */\r | |
3027 | \r | |
3028 | case 0x54: /* NEG, unofficial */\r | |
3029 | \r | |
3030 | case 0x5C: /* NEG, unofficial */\r | |
3031 | \r | |
3032 | case 0x64: /* NEG, unofficial */\r | |
3033 | \r | |
3034 | case 0x6C: /* NEG, unofficial */\r | |
3035 | \r | |
3036 | case 0x74: /* NEG, unofficial */\r | |
3037 | \r | |
3038 | case 0x7C: /* NEG, unofficial */\r | |
3039 | temp = HIGH_REGISTER(AF);\r | |
3040 | AF = ((~(AF & 0xff00) + 1) & 0xff00); /* AF = (-(AF & 0xff00) & 0xff00); */\r | |
3041 | AF |= ((AF >> 8) & 0xa8) | (((AF & 0xff00) == 0) << 6) | negTable[temp];\r | |
3042 | break;\r | |
3043 | \r | |
3044 | case 0x45: /* RETN */\r | |
3045 | \r | |
3046 | case 0x55: /* RETN, unofficial */\r | |
3047 | \r | |
3048 | case 0x5D: /* RETN, unofficial */\r | |
3049 | \r | |
3050 | case 0x65: /* RETN, unofficial */\r | |
3051 | \r | |
3052 | case 0x6D: /* RETN, unofficial */\r | |
3053 | \r | |
3054 | case 0x75: /* RETN, unofficial */\r | |
3055 | \r | |
3056 | case 0x7D: /* RETN, unofficial */\r | |
3057 | IFF_S |= IFF_S >> 1;\r | |
3058 | POP(PC);\r | |
3059 | break;\r | |
3060 | \r | |
3061 | case 0x46: /* IM 0 */\r | |
3062 | /* interrupt mode 0 */\r | |
3063 | break;\r | |
3064 | \r | |
3065 | case 0x47: /* LD I,A */\r | |
3066 | IR_S = (IR_S & 0xff) | (AF & ~0xff);\r | |
3067 | break;\r | |
3068 | \r | |
3069 | case 0x48: /* IN C,(C) */\r | |
3070 | temp = in(LOW_REGISTER(BC));\r | |
3071 | SET_LOW_REGISTER(BC, temp);\r | |
3072 | AF = (AF & ~0xfe) | rotateShiftTable[temp & 0xff];\r | |
3073 | break;\r | |
3074 | \r | |
3075 | case 0x49: /* OUT (C),C */\r | |
3076 | out(LOW_REGISTER(BC), LOW_REGISTER(BC));\r | |
3077 | break;\r | |
3078 | \r | |
3079 | case 0x4a: /* ADC HL,BC */\r | |
3080 | HL &= ADDRMASK;\r | |
3081 | BC &= ADDRMASK;\r | |
3082 | sum = HL + BC + TSTFLAG(C);\r | |
3083 | AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) | (((sum & ADDRMASK) == 0) << 6) |\r | |
3084 | cbitsZ80Table[(HL ^ BC ^ sum) >> 8];\r | |
3085 | HL = sum;\r | |
3086 | break;\r | |
3087 | \r | |
3088 | case 0x4b: /* LD BC,(nnnn) */\r | |
3089 | temp = GET_WORD(PC);\r | |
3090 | BC = GET_WORD(temp);\r | |
3091 | PC += 2;\r | |
3092 | break;\r | |
3093 | \r | |
3094 | case 0x4d: /* RETI */\r | |
3095 | IFF_S |= IFF_S >> 1;\r | |
3096 | POP(PC);\r | |
3097 | break;\r | |
3098 | \r | |
3099 | case 0x4f: /* LD R,A */\r | |
3100 | IR_S = (IR_S & ~0xff) | ((AF >> 8) & 0xff);\r | |
3101 | break;\r | |
3102 | \r | |
3103 | case 0x50: /* IN D,(C) */\r | |
3104 | temp = in(LOW_REGISTER(BC));\r | |
3105 | SET_HIGH_REGISTER(DE, temp);\r | |
3106 | AF = (AF & ~0xfe) | rotateShiftTable[temp & 0xff];\r | |
3107 | break;\r | |
3108 | \r | |
3109 | case 0x51: /* OUT (C),D */\r | |
3110 | out(LOW_REGISTER(BC), HIGH_REGISTER(DE));\r | |
3111 | break;\r | |
3112 | \r | |
3113 | case 0x52: /* SBC HL,DE */\r | |
3114 | HL &= ADDRMASK;\r | |
3115 | DE &= ADDRMASK;\r | |
3116 | sum = HL - DE - TSTFLAG(C);\r | |
3117 | AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) | (((sum & ADDRMASK) == 0) << 6) |\r | |
3118 | cbits2Z80Table[((HL ^ DE ^ sum) >> 8) & 0x1ff];\r | |
3119 | HL = sum;\r | |
3120 | break;\r | |
3121 | \r | |
3122 | case 0x53: /* LD (nnnn),DE */\r | |
3123 | temp = GET_WORD(PC);\r | |
3124 | PUT_WORD(temp, DE);\r | |
3125 | PC += 2;\r | |
3126 | break;\r | |
3127 | \r | |
3128 | case 0x56: /* IM 1 */\r | |
3129 | /* interrupt mode 1 */\r | |
3130 | break;\r | |
3131 | \r | |
3132 | case 0x57: /* LD A,I */\r | |
3133 | AF = (AF & 0x29) | (IR_S & ~0xff) | ((IR_S >> 8) & 0x80) | (((IR_S & ~0xff) == 0) << 6) | ((IFF_S & 2) << 1);\r | |
3134 | break;\r | |
3135 | \r | |
3136 | case 0x58: /* IN E,(C) */\r | |
3137 | temp = in(LOW_REGISTER(BC));\r | |
3138 | SET_LOW_REGISTER(DE, temp);\r | |
3139 | AF = (AF & ~0xfe) | rotateShiftTable[temp & 0xff];\r | |
3140 | break;\r | |
3141 | \r | |
3142 | case 0x59: /* OUT (C),E */\r | |
3143 | out(LOW_REGISTER(BC), LOW_REGISTER(DE));\r | |
3144 | break;\r | |
3145 | \r | |
3146 | case 0x5a: /* ADC HL,DE */\r | |
3147 | HL &= ADDRMASK;\r | |
3148 | DE &= ADDRMASK;\r | |
3149 | sum = HL + DE + TSTFLAG(C);\r | |
3150 | AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) | (((sum & ADDRMASK) == 0) << 6) |\r | |
3151 | cbitsZ80Table[(HL ^ DE ^ sum) >> 8];\r | |
3152 | HL = sum;\r | |
3153 | break;\r | |
3154 | \r | |
3155 | case 0x5b: /* LD DE,(nnnn) */\r | |
3156 | temp = GET_WORD(PC);\r | |
3157 | DE = GET_WORD(temp);\r | |
3158 | PC += 2;\r | |
3159 | break;\r | |
3160 | \r | |
3161 | case 0x5e: /* IM 2 */\r | |
3162 | /* interrupt mode 2 */\r | |
3163 | break;\r | |
3164 | \r | |
3165 | case 0x5f: /* LD A,R */\r | |
3166 | AF = (AF & 0x29) | ((IR_S & 0xff) << 8) | (IR_S & 0x80) |\r | |
3167 | (((IR_S & 0xff) == 0) << 6) | ((IFF_S & 2) << 1);\r | |
3168 | break;\r | |
3169 | \r | |
3170 | case 0x60: /* IN H,(C) */\r | |
3171 | temp = in(LOW_REGISTER(BC));\r | |
3172 | SET_HIGH_REGISTER(HL, temp);\r | |
3173 | AF = (AF & ~0xfe) | rotateShiftTable[temp & 0xff];\r | |
3174 | break;\r | |
3175 | \r | |
3176 | case 0x61: /* OUT (C),H */\r | |
3177 | out(LOW_REGISTER(BC), HIGH_REGISTER(HL));\r | |
3178 | break;\r | |
3179 | \r | |
3180 | case 0x62: /* SBC HL,HL */\r | |
3181 | HL &= ADDRMASK;\r | |
3182 | sum = HL - HL - TSTFLAG(C);\r | |
3183 | AF = (AF & ~0xff) | (((sum & ADDRMASK) == 0) << 6) |\r | |
3184 | cbits2Z80DupTable[(sum >> 8) & 0x1ff];\r | |
3185 | HL = sum;\r | |
3186 | break;\r | |
3187 | \r | |
3188 | case 0x63: /* LD (nnnn),HL */\r | |
3189 | temp = GET_WORD(PC);\r | |
3190 | PUT_WORD(temp, HL);\r | |
3191 | PC += 2;\r | |
3192 | break;\r | |
3193 | \r | |
3194 | case 0x67: /* RRD */\r | |
3195 | temp = GET_BYTE(HL);\r | |
3196 | acu = HIGH_REGISTER(AF);\r | |
3197 | PUT_BYTE(HL, HIGH_DIGIT(temp) | (LOW_DIGIT(acu) << 4));\r | |
3198 | AF = rrdrldTable[(acu & 0xf0) | LOW_DIGIT(temp)] | (AF & 1);\r | |
3199 | break;\r | |
3200 | \r | |
3201 | case 0x68: /* IN L,(C) */\r | |
3202 | temp = in(LOW_REGISTER(BC));\r | |
3203 | SET_LOW_REGISTER(HL, temp);\r | |
3204 | AF = (AF & ~0xfe) | rotateShiftTable[temp & 0xff];\r | |
3205 | break;\r | |
3206 | \r | |
3207 | case 0x69: /* OUT (C),L */\r | |
3208 | out(LOW_REGISTER(BC), LOW_REGISTER(HL));\r | |
3209 | break;\r | |
3210 | \r | |
3211 | case 0x6a: /* ADC HL,HL */\r | |
3212 | HL &= ADDRMASK;\r | |
3213 | sum = HL + HL + TSTFLAG(C);\r | |
3214 | AF = (AF & ~0xff) | (((sum & ADDRMASK) == 0) << 6) |\r | |
3215 | cbitsZ80DupTable[sum >> 8];\r | |
3216 | HL = sum;\r | |
3217 | break;\r | |
3218 | \r | |
3219 | case 0x6b: /* LD HL,(nnnn) */\r | |
3220 | temp = GET_WORD(PC);\r | |
3221 | HL = GET_WORD(temp);\r | |
3222 | PC += 2;\r | |
3223 | break;\r | |
3224 | \r | |
3225 | case 0x6f: /* RLD */\r | |
3226 | temp = GET_BYTE(HL);\r | |
3227 | acu = HIGH_REGISTER(AF);\r | |
3228 | PUT_BYTE(HL, (LOW_DIGIT(temp) << 4) | LOW_DIGIT(acu));\r | |
3229 | AF = rrdrldTable[(acu & 0xf0) | HIGH_DIGIT(temp)] | (AF & 1);\r | |
3230 | break;\r | |
3231 | \r | |
3232 | case 0x70: /* IN (C) */\r | |
3233 | temp = in(LOW_REGISTER(BC));\r | |
3234 | SET_LOW_REGISTER(temp, temp);\r | |
3235 | AF = (AF & ~0xfe) | rotateShiftTable[temp & 0xff];\r | |
3236 | break;\r | |
3237 | \r | |
3238 | case 0x71: /* OUT (C),0 */\r | |
3239 | out(LOW_REGISTER(BC), 0);\r | |
3240 | break;\r | |
3241 | \r | |
3242 | case 0x72: /* SBC HL,SP */\r | |
3243 | HL &= ADDRMASK;\r | |
3244 | SP &= ADDRMASK;\r | |
3245 | sum = HL - SP - TSTFLAG(C);\r | |
3246 | AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) | (((sum & ADDRMASK) == 0) << 6) |\r | |
3247 | cbits2Z80Table[((HL ^ SP ^ sum) >> 8) & 0x1ff];\r | |
3248 | HL = sum;\r | |
3249 | break;\r | |
3250 | \r | |
3251 | case 0x73: /* LD (nnnn),SP */\r | |
3252 | temp = GET_WORD(PC);\r | |
3253 | PUT_WORD(temp, SP);\r | |
3254 | PC += 2;\r | |
3255 | break;\r | |
3256 | \r | |
3257 | case 0x78: /* IN A,(C) */\r | |
3258 | temp = in(LOW_REGISTER(BC));\r | |
3259 | SET_HIGH_REGISTER(AF, temp);\r | |
3260 | AF = (AF & ~0xfe) | rotateShiftTable[temp & 0xff];\r | |
3261 | break;\r | |
3262 | \r | |
3263 | case 0x79: /* OUT (C),A */\r | |
3264 | out(LOW_REGISTER(BC), HIGH_REGISTER(AF));\r | |
3265 | break;\r | |
3266 | \r | |
3267 | case 0x7a: /* ADC HL,SP */\r | |
3268 | HL &= ADDRMASK;\r | |
3269 | SP &= ADDRMASK;\r | |
3270 | sum = HL + SP + TSTFLAG(C);\r | |
3271 | AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) | (((sum & ADDRMASK) == 0) << 6) |\r | |
3272 | cbitsZ80Table[(HL ^ SP ^ sum) >> 8];\r | |
3273 | HL = sum;\r | |
3274 | break;\r | |
3275 | \r | |
3276 | case 0x7b: /* LD SP,(nnnn) */\r | |
3277 | temp = GET_WORD(PC);\r | |
3278 | SP = GET_WORD(temp);\r | |
3279 | PC += 2;\r | |
3280 | break;\r | |
3281 | \r | |
3282 | case 0xa0: /* LDI */\r | |
3283 | acu = RAM_PP(HL);\r | |
3284 | PUT_BYTE_PP(DE, acu);\r | |
3285 | acu += HIGH_REGISTER(AF);\r | |
3286 | AF = (AF & ~0x3e) | (acu & 8) | ((acu & 2) << 4) |\r | |
3287 | (((--BC & ADDRMASK) != 0) << 2);\r | |
3288 | break;\r | |
3289 | \r | |
3290 | case 0xa1: /* CPI */\r | |
3291 | acu = HIGH_REGISTER(AF);\r | |
3292 | temp = RAM_PP(HL);\r | |
3293 | sum = acu - temp;\r | |
3294 | cbits = acu ^ temp ^ sum;\r | |
3295 | AF = (AF & ~0xfe) | (sum & 0x80) | (!(sum & 0xff) << 6) |\r | |
3296 | (((sum - ((cbits & 16) >> 4)) & 2) << 4) | (cbits & 16) |\r | |
3297 | ((sum - ((cbits >> 4) & 1)) & 8) |\r | |
3298 | ((--BC & ADDRMASK) != 0) << 2 | 2;\r | |
3299 | if ((sum & 15) == 8 && (cbits & 16) != 0) AF &= ~8;\r | |
3300 | break;\r | |
3301 | \r | |
3302 | /* SF, ZF, YF, XF flags are affected by decreasing register B, as in DEC B.\r | |
3303 | NF flag A is copy of bit 7 of the value read from or written to an I/O port.\r | |
3304 | INI/INIR/IND/INDR use the C flag in stead of the L register. There is a\r | |
3305 | catch though, because not the value of C is used, but C + 1 if it's INI/INIR or\r | |
3306 | C - 1 if it's IND/INDR. So, first of all INI/INIR:\r | |
3307 | HF and CF Both set if ((HL) + ((C + 1) & 255) > 255)\r | |
3308 | PF The parity of (((HL) + ((C + 1) & 255)) & 7) xor B) */\r | |
3309 | case 0xa2: /* INI */\r | |
3310 | acu = in(LOW_REGISTER(BC));\r | |
3311 | PUT_BYTE(HL, acu);\r | |
3312 | ++HL;\r | |
3313 | temp = HIGH_REGISTER(BC);\r | |
3314 | BC -= 0x100;\r | |
3315 | INOUTFLAGS_NONZERO((LOW_REGISTER(BC) + 1) & 0xff);\r | |
3316 | break;\r | |
3317 | \r | |
3318 | /* SF, ZF, YF, XF flags are affected by decreasing register B, as in DEC B.\r | |
3319 | NF flag A is copy of bit 7 of the value read from or written to an I/O port.\r | |
3320 | And now the for OUTI/OTIR/OUTD/OTDR instructions. Take state of the L\r | |
3321 | after the increment or decrement of HL; add the value written to the I/O port\r | |
3322 | to; call that k for now. If k > 255, then the CF and HF flags are set. The PF\r | |
3323 | flags is set like the parity of k bitwise and'ed with 7, bitwise xor'ed with B.\r | |
3324 | HF and CF Both set if ((HL) + L > 255)\r | |
3325 | PF The parity of ((((HL) + L) & 7) xor B) */\r | |
3326 | case 0xa3: /* OUTI */\r | |
3327 | acu = GET_BYTE(HL);\r | |
3328 | out(LOW_REGISTER(BC), acu);\r | |
3329 | ++HL;\r | |
3330 | temp = HIGH_REGISTER(BC);\r | |
3331 | BC -= 0x100;\r | |
3332 | INOUTFLAGS_NONZERO(LOW_REGISTER(HL));\r | |
3333 | break;\r | |
3334 | \r | |
3335 | case 0xa8: /* LDD */\r | |
3336 | acu = RAM_MM(HL);\r | |
3337 | PUT_BYTE_MM(DE, acu);\r | |
3338 | acu += HIGH_REGISTER(AF);\r | |
3339 | AF = (AF & ~0x3e) | (acu & 8) | ((acu & 2) << 4) |\r | |
3340 | (((--BC & ADDRMASK) != 0) << 2);\r | |
3341 | break;\r | |
3342 | \r | |
3343 | case 0xa9: /* CPD */\r | |
3344 | acu = HIGH_REGISTER(AF);\r | |
3345 | temp = RAM_MM(HL);\r | |
3346 | sum = acu - temp;\r | |
3347 | cbits = acu ^ temp ^ sum;\r | |
3348 | AF = (AF & ~0xfe) | (sum & 0x80) | (!(sum & 0xff) << 6) |\r | |
3349 | (((sum - ((cbits & 16) >> 4)) & 2) << 4) | (cbits & 16) |\r | |
3350 | ((sum - ((cbits >> 4) & 1)) & 8) |\r | |
3351 | ((--BC & ADDRMASK) != 0) << 2 | 2;\r | |
3352 | if ((sum & 15) == 8 && (cbits & 16) != 0) AF &= ~8;\r | |
3353 | break;\r | |
3354 | \r | |
3355 | /* SF, ZF, YF, XF flags are affected by decreasing register B, as in DEC B.\r | |
3356 | NF flag A is copy of bit 7 of the value read from or written to an I/O port.\r | |
3357 | INI/INIR/IND/INDR use the C flag in stead of the L register. There is a\r | |
3358 | catch though, because not the value of C is used, but C + 1 if it's INI/INIR or\r | |
3359 | C - 1 if it's IND/INDR. And last IND/INDR:\r | |
3360 | HF and CF Both set if ((HL) + ((C - 1) & 255) > 255)\r | |
3361 | PF The parity of (((HL) + ((C - 1) & 255)) & 7) xor B) */\r | |
3362 | case 0xaa: /* IND */\r | |
3363 | acu = in(LOW_REGISTER(BC));\r | |
3364 | PUT_BYTE(HL, acu);\r | |
3365 | --HL;\r | |
3366 | temp = HIGH_REGISTER(BC);\r | |
3367 | BC -= 0x100;\r | |
3368 | INOUTFLAGS_NONZERO((LOW_REGISTER(BC) - 1) & 0xff);\r | |
3369 | break;\r | |
3370 | \r | |
3371 | case 0xab: /* OUTD */\r | |
3372 | acu = GET_BYTE(HL);\r | |
3373 | out(LOW_REGISTER(BC), acu);\r | |
3374 | --HL;\r | |
3375 | temp = HIGH_REGISTER(BC);\r | |
3376 | BC -= 0x100;\r | |
3377 | INOUTFLAGS_NONZERO(LOW_REGISTER(HL));\r | |
3378 | break;\r | |
3379 | \r | |
3380 | case 0xb0: /* LDIR */\r | |
3381 | acu = HIGH_REGISTER(AF);\r | |
3382 | BC &= ADDRMASK;\r | |
3383 | if (BC == 0) BC = 0x10000;\r | |
3384 | do {\r | |
3385 | acu = RAM_PP(HL);\r | |
3386 | PUT_BYTE_PP(DE, acu);\r | |
3387 | } while (--BC);\r | |
3388 | acu += HIGH_REGISTER(AF);\r | |
3389 | AF = (AF & ~0x3e) | (acu & 8) | ((acu & 2) << 4);\r | |
3390 | break;\r | |
3391 | \r | |
3392 | case 0xb1: /* CPIR */\r | |
3393 | acu = HIGH_REGISTER(AF);\r | |
3394 | BC &= ADDRMASK;\r | |
3395 | if (BC == 0) BC = 0x10000;\r | |
3396 | do {\r | |
3397 | temp = RAM_PP(HL);\r | |
3398 | op = --BC != 0;\r | |
3399 | sum = acu - temp;\r | |
3400 | } while (op && sum != 0);\r | |
3401 | cbits = acu ^ temp ^ sum;\r | |
3402 | AF = (AF & ~0xfe) | (sum & 0x80) | (!(sum & 0xff) << 6) |\r | |
3403 | (((sum - ((cbits & 16) >> 4)) & 2) << 4) |\r | |
3404 | (cbits & 16) | ((sum - ((cbits >> 4) & 1)) & 8) |\r | |
3405 | op << 2 | 2;\r | |
3406 | if ((sum & 15) == 8 && (cbits & 16) != 0) AF &= ~8;\r | |
3407 | break;\r | |
3408 | \r | |
3409 | case 0xb2: /* INIR */\r | |
3410 | temp = HIGH_REGISTER(BC);\r | |
3411 | if (temp == 0) temp = 0x100;\r | |
3412 | do {\r | |
3413 | acu = in(LOW_REGISTER(BC));\r | |
3414 | PUT_BYTE(HL, acu);\r | |
3415 | ++HL;\r | |
3416 | } while (--temp);\r | |
3417 | temp = HIGH_REGISTER(BC);\r | |
3418 | SET_HIGH_REGISTER(BC, 0);\r | |
3419 | INOUTFLAGS_ZERO((LOW_REGISTER(BC) + 1) & 0xff);\r | |
3420 | break;\r | |
3421 | \r | |
3422 | case 0xb3: /* OTIR */\r | |
3423 | temp = HIGH_REGISTER(BC);\r | |
3424 | if (temp == 0) temp = 0x100;\r | |
3425 | do {\r | |
3426 | acu = GET_BYTE(HL);\r | |
3427 | out(LOW_REGISTER(BC), acu);\r | |
3428 | ++HL;\r | |
3429 | } while (--temp);\r | |
3430 | temp = HIGH_REGISTER(BC);\r | |
3431 | SET_HIGH_REGISTER(BC, 0);\r | |
3432 | INOUTFLAGS_ZERO(LOW_REGISTER(HL));\r | |
3433 | break;\r | |
3434 | \r | |
3435 | case 0xb8: /* LDDR */\r | |
3436 | BC &= ADDRMASK;\r | |
3437 | if (BC == 0) BC = 0x10000;\r | |
3438 | do {\r | |
3439 | acu = RAM_MM(HL);\r | |
3440 | PUT_BYTE_MM(DE, acu);\r | |
3441 | } while (--BC);\r | |
3442 | acu += HIGH_REGISTER(AF);\r | |
3443 | AF = (AF & ~0x3e) | (acu & 8) | ((acu & 2) << 4);\r | |
3444 | break;\r | |
3445 | \r | |
3446 | case 0xb9: /* CPDR */\r | |
3447 | acu = HIGH_REGISTER(AF);\r | |
3448 | BC &= ADDRMASK;\r | |
3449 | if (BC == 0) BC = 0x10000;\r | |
3450 | do {\r | |
3451 | temp = RAM_MM(HL);\r | |
3452 | op = --BC != 0;\r | |
3453 | sum = acu - temp;\r | |
3454 | } while (op && sum != 0);\r | |
3455 | cbits = acu ^ temp ^ sum;\r | |
3456 | AF = (AF & ~0xfe) | (sum & 0x80) | (!(sum & 0xff) << 6) |\r | |
3457 | (((sum - ((cbits & 16) >> 4)) & 2) << 4) |\r | |
3458 | (cbits & 16) | ((sum - ((cbits >> 4) & 1)) & 8) |\r | |
3459 | op << 2 | 2;\r | |
3460 | if ((sum & 15) == 8 && (cbits & 16) != 0) AF &= ~8;\r | |
3461 | break;\r | |
3462 | \r | |
3463 | case 0xba: /* INDR */\r | |
3464 | temp = HIGH_REGISTER(BC);\r | |
3465 | if (temp == 0) temp = 0x100;\r | |
3466 | do {\r | |
3467 | acu = in(LOW_REGISTER(BC));\r | |
3468 | PUT_BYTE(HL, acu);\r | |
3469 | --HL;\r | |
3470 | } while (--temp);\r | |
3471 | temp = HIGH_REGISTER(BC);\r | |
3472 | SET_HIGH_REGISTER(BC, 0);\r | |
3473 | INOUTFLAGS_ZERO((LOW_REGISTER(BC) - 1) & 0xff);\r | |
3474 | break;\r | |
3475 | \r | |
3476 | case 0xbb: /* OTDR */\r | |
3477 | temp = HIGH_REGISTER(BC);\r | |
3478 | if (temp == 0) temp = 0x100;\r | |
3479 | do {\r | |
3480 | acu = GET_BYTE(HL);\r | |
3481 | out(LOW_REGISTER(BC), acu);\r | |
3482 | --HL;\r | |
3483 | } while (--temp);\r | |
3484 | temp = HIGH_REGISTER(BC);\r | |
3485 | SET_HIGH_REGISTER(BC, 0);\r | |
3486 | INOUTFLAGS_ZERO(LOW_REGISTER(HL));\r | |
3487 | break;\r | |
3488 | \r | |
3489 | default: /* ignore ED and following byte */\r | |
3490 | CHECK_CPU_Z80;\r | |
3491 | }\r | |
3492 | break;\r | |
3493 | \r | |
3494 | case 0xee: /* XOR nn */\r | |
3495 | AF = xororTable[((AF >> 8) ^ RAM_PP(PC)) & 0xff];\r | |
3496 | break;\r | |
3497 | \r | |
3498 | case 0xef: /* RST 28H */\r | |
3499 | PUSH(PC);\r | |
3500 | PC = 0x28;\r | |
3501 | break;\r | |
3502 | \r | |
3503 | case 0xf0: /* RET P */\r | |
3504 | if (!(TSTFLAG(S))) POP(PC);\r | |
3505 | break;\r | |
3506 | \r | |
3507 | case 0xf1: /* POP AF */\r | |
3508 | POP(AF);\r | |
3509 | break;\r | |
3510 | \r | |
3511 | case 0xf2: /* JP P,nnnn */\r | |
3512 | JPC(!TSTFLAG(S));\r | |
3513 | break;\r | |
3514 | \r | |
3515 | case 0xf3: /* DI */\r | |
3516 | IFF_S = 0;\r | |
3517 | break;\r | |
3518 | \r | |
3519 | case 0xf4: /* CALL P,nnnn */\r | |
3520 | CALLC(!TSTFLAG(S));\r | |
3521 | break;\r | |
3522 | \r | |
3523 | case 0xf5: /* PUSH AF */\r | |
3524 | PUSH(AF);\r | |
3525 | break;\r | |
3526 | \r | |
3527 | case 0xf6: /* OR nn */\r | |
3528 | AF = xororTable[((AF >> 8) | RAM_PP(PC)) & 0xff];\r | |
3529 | break;\r | |
3530 | \r | |
3531 | case 0xf7: /* RST 30H */\r | |
3532 | PUSH(PC);\r | |
3533 | PC = 0x30;\r | |
3534 | break;\r | |
3535 | \r | |
3536 | case 0xf8: /* RET M */\r | |
3537 | if (TSTFLAG(S)) POP(PC);\r | |
3538 | break;\r | |
3539 | \r | |
3540 | case 0xf9: /* LD SP,HL */\r | |
3541 | SP = HL;\r | |
3542 | break;\r | |
3543 | \r | |
3544 | case 0xfa: /* JP M,nnnn */\r | |
3545 | JPC(TSTFLAG(S));\r | |
3546 | break;\r | |
3547 | \r | |
3548 | case 0xfb: /* EI */\r | |
3549 | IFF_S = 3;\r | |
3550 | break;\r | |
3551 | \r | |
3552 | case 0xfc: /* CALL M,nnnn */\r | |
3553 | CALLC(TSTFLAG(S));\r | |
3554 | break;\r | |
3555 | \r | |
3556 | case 0xfd: /* FD prefix */\r | |
3557 | CHECK_CPU_8080;\r | |
3558 | switch (op = RAM_PP(PC)) {\r | |
3559 | \r | |
3560 | case 0x09: /* ADD IY,BC */\r | |
3561 | IY &= ADDRMASK;\r | |
3562 | BC &= ADDRMASK;\r | |
3563 | sum = IY + BC;\r | |
3564 | AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) | cbitsTable[(IY ^ BC ^ sum) >> 8];\r | |
3565 | IY = sum;\r | |
3566 | break;\r | |
3567 | \r | |
3568 | case 0x19: /* ADD IY,DE */\r | |
3569 | IY &= ADDRMASK;\r | |
3570 | DE &= ADDRMASK;\r | |
3571 | sum = IY + DE;\r | |
3572 | AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) | cbitsTable[(IY ^ DE ^ sum) >> 8];\r | |
3573 | IY = sum;\r | |
3574 | break;\r | |
3575 | \r | |
3576 | case 0x21: /* LD IY,nnnn */\r | |
3577 | IY = GET_WORD(PC);\r | |
3578 | PC += 2;\r | |
3579 | break;\r | |
3580 | \r | |
3581 | case 0x22: /* LD (nnnn),IY */\r | |
3582 | temp = GET_WORD(PC);\r | |
3583 | PUT_WORD(temp, IY);\r | |
3584 | PC += 2;\r | |
3585 | break;\r | |
3586 | \r | |
3587 | case 0x23: /* INC IY */\r | |
3588 | ++IY;\r | |
3589 | break;\r | |
3590 | \r | |
3591 | case 0x24: /* INC IYH */\r | |
3592 | IY += 0x100;\r | |
3593 | AF = (AF & ~0xfe) | incZ80Table[HIGH_REGISTER(IY)];\r | |
3594 | break;\r | |
3595 | \r | |
3596 | case 0x25: /* DEC IYH */\r | |
3597 | IY -= 0x100;\r | |
3598 | AF = (AF & ~0xfe) | decZ80Table[HIGH_REGISTER(IY)];\r | |
3599 | break;\r | |
3600 | \r | |
3601 | case 0x26: /* LD IYH,nn */\r | |
3602 | SET_HIGH_REGISTER(IY, RAM_PP(PC));\r | |
3603 | break;\r | |
3604 | \r | |
3605 | case 0x29: /* ADD IY,IY */\r | |
3606 | IY &= ADDRMASK;\r | |
3607 | sum = IY + IY;\r | |
3608 | AF = (AF & ~0x3b) | cbitsDup16Table[sum >> 8];\r | |
3609 | IY = sum;\r | |
3610 | break;\r | |
3611 | \r | |
3612 | case 0x2a: /* LD IY,(nnnn) */\r | |
3613 | temp = GET_WORD(PC);\r | |
3614 | IY = GET_WORD(temp);\r | |
3615 | PC += 2;\r | |
3616 | break;\r | |
3617 | \r | |
3618 | case 0x2b: /* DEC IY */\r | |
3619 | --IY;\r | |
3620 | break;\r | |
3621 | \r | |
3622 | case 0x2c: /* INC IYL */\r | |
3623 | temp = LOW_REGISTER(IY) + 1;\r | |
3624 | SET_LOW_REGISTER(IY, temp);\r | |
3625 | AF = (AF & ~0xfe) | incZ80Table[temp];\r | |
3626 | break;\r | |
3627 | \r | |
3628 | case 0x2d: /* DEC IYL */\r | |
3629 | temp = LOW_REGISTER(IY) - 1;\r | |
3630 | SET_LOW_REGISTER(IY, temp);\r | |
3631 | AF = (AF & ~0xfe) | decZ80Table[temp & 0xff];\r | |
3632 | break;\r | |
3633 | \r | |
3634 | case 0x2e: /* LD IYL,nn */\r | |
3635 | SET_LOW_REGISTER(IY, RAM_PP(PC));\r | |
3636 | break;\r | |
3637 | \r | |
3638 | case 0x34: /* INC (IY+dd) */\r | |
3639 | adr = IY + (int8) RAM_PP(PC);\r | |
3640 | temp = GET_BYTE(adr) + 1;\r | |
3641 | PUT_BYTE(adr, temp);\r | |
3642 | AF = (AF & ~0xfe) | incZ80Table[temp];\r | |
3643 | break;\r | |
3644 | \r | |
3645 | case 0x35: /* DEC (IY+dd) */\r | |
3646 | adr = IY + (int8) RAM_PP(PC);\r | |
3647 | temp = GET_BYTE(adr) - 1;\r | |
3648 | PUT_BYTE(adr, temp);\r | |
3649 | AF = (AF & ~0xfe) | decZ80Table[temp & 0xff];\r | |
3650 | break;\r | |
3651 | \r | |
3652 | case 0x36: /* LD (IY+dd),nn */\r | |
3653 | adr = IY + (int8) RAM_PP(PC);\r | |
3654 | PUT_BYTE(adr, RAM_PP(PC));\r | |
3655 | break;\r | |
3656 | \r | |
3657 | case 0x39: /* ADD IY,SP */\r | |
3658 | IY &= ADDRMASK;\r | |
3659 | SP &= ADDRMASK;\r | |
3660 | sum = IY + SP;\r | |
3661 | AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) | cbitsTable[(IY ^ SP ^ sum) >> 8];\r | |
3662 | IY = sum;\r | |
3663 | break;\r | |
3664 | \r | |
3665 | case 0x44: /* LD B,IYH */\r | |
3666 | SET_HIGH_REGISTER(BC, HIGH_REGISTER(IY));\r | |
3667 | break;\r | |
3668 | \r | |
3669 | case 0x45: /* LD B,IYL */\r | |
3670 | SET_HIGH_REGISTER(BC, LOW_REGISTER(IY));\r | |
3671 | break;\r | |
3672 | \r | |
3673 | case 0x46: /* LD B,(IY+dd) */\r | |
3674 | adr = IY + (int8) RAM_PP(PC);\r | |
3675 | SET_HIGH_REGISTER(BC, GET_BYTE(adr));\r | |
3676 | break;\r | |
3677 | \r | |
3678 | case 0x4c: /* LD C,IYH */\r | |
3679 | SET_LOW_REGISTER(BC, HIGH_REGISTER(IY));\r | |
3680 | break;\r | |
3681 | \r | |
3682 | case 0x4d: /* LD C,IYL */\r | |
3683 | SET_LOW_REGISTER(BC, LOW_REGISTER(IY));\r | |
3684 | break;\r | |
3685 | \r | |
3686 | case 0x4e: /* LD C,(IY+dd) */\r | |
3687 | adr = IY + (int8) RAM_PP(PC);\r | |
3688 | SET_LOW_REGISTER(BC, GET_BYTE(adr));\r | |
3689 | break;\r | |
3690 | \r | |
3691 | case 0x54: /* LD D,IYH */\r | |
3692 | SET_HIGH_REGISTER(DE, HIGH_REGISTER(IY));\r | |
3693 | break;\r | |
3694 | \r | |
3695 | case 0x55: /* LD D,IYL */\r | |
3696 | SET_HIGH_REGISTER(DE, LOW_REGISTER(IY));\r | |
3697 | break;\r | |
3698 | \r | |
3699 | case 0x56: /* LD D,(IY+dd) */\r | |
3700 | adr = IY + (int8) RAM_PP(PC);\r | |
3701 | SET_HIGH_REGISTER(DE, GET_BYTE(adr));\r | |
3702 | break;\r | |
3703 | \r | |
3704 | case 0x5c: /* LD E,IYH */\r | |
3705 | SET_LOW_REGISTER(DE, HIGH_REGISTER(IY));\r | |
3706 | break;\r | |
3707 | \r | |
3708 | case 0x5d: /* LD E,IYL */\r | |
3709 | SET_LOW_REGISTER(DE, LOW_REGISTER(IY));\r | |
3710 | break;\r | |
3711 | \r | |
3712 | case 0x5e: /* LD E,(IY+dd) */\r | |
3713 | adr = IY + (int8) RAM_PP(PC);\r | |
3714 | SET_LOW_REGISTER(DE, GET_BYTE(adr));\r | |
3715 | break;\r | |
3716 | \r | |
3717 | case 0x60: /* LD IYH,B */\r | |
3718 | SET_HIGH_REGISTER(IY, HIGH_REGISTER(BC));\r | |
3719 | break;\r | |
3720 | \r | |
3721 | case 0x61: /* LD IYH,C */\r | |
3722 | SET_HIGH_REGISTER(IY, LOW_REGISTER(BC));\r | |
3723 | break;\r | |
3724 | \r | |
3725 | case 0x62: /* LD IYH,D */\r | |
3726 | SET_HIGH_REGISTER(IY, HIGH_REGISTER(DE));\r | |
3727 | break;\r | |
3728 | \r | |
3729 | case 0x63: /* LD IYH,E */\r | |
3730 | SET_HIGH_REGISTER(IY, LOW_REGISTER(DE));\r | |
3731 | break;\r | |
3732 | \r | |
3733 | case 0x64: /* LD IYH,IYH */\r | |
3734 | break;\r | |
3735 | \r | |
3736 | case 0x65: /* LD IYH,IYL */\r | |
3737 | SET_HIGH_REGISTER(IY, LOW_REGISTER(IY));\r | |
3738 | break;\r | |
3739 | \r | |
3740 | case 0x66: /* LD H,(IY+dd) */\r | |
3741 | adr = IY + (int8) RAM_PP(PC);\r | |
3742 | SET_HIGH_REGISTER(HL, GET_BYTE(adr));\r | |
3743 | break;\r | |
3744 | \r | |
3745 | case 0x67: /* LD IYH,A */\r | |
3746 | SET_HIGH_REGISTER(IY, HIGH_REGISTER(AF));\r | |
3747 | break;\r | |
3748 | \r | |
3749 | case 0x68: /* LD IYL,B */\r | |
3750 | SET_LOW_REGISTER(IY, HIGH_REGISTER(BC));\r | |
3751 | break;\r | |
3752 | \r | |
3753 | case 0x69: /* LD IYL,C */\r | |
3754 | SET_LOW_REGISTER(IY, LOW_REGISTER(BC));\r | |
3755 | break;\r | |
3756 | \r | |
3757 | case 0x6a: /* LD IYL,D */\r | |
3758 | SET_LOW_REGISTER(IY, HIGH_REGISTER(DE));\r | |
3759 | break;\r | |
3760 | \r | |
3761 | case 0x6b: /* LD IYL,E */\r | |
3762 | SET_LOW_REGISTER(IY, LOW_REGISTER(DE));\r | |
3763 | break;\r | |
3764 | \r | |
3765 | case 0x6c: /* LD IYL,IYH */\r | |
3766 | SET_LOW_REGISTER(IY, HIGH_REGISTER(IY));\r | |
3767 | break;\r | |
3768 | \r | |
3769 | case 0x6d: /* LD IYL,IYL */\r | |
3770 | break;\r | |
3771 | \r | |
3772 | case 0x6e: /* LD L,(IY+dd) */\r | |
3773 | adr = IY + (int8) RAM_PP(PC);\r | |
3774 | SET_LOW_REGISTER(HL, GET_BYTE(adr));\r | |
3775 | break;\r | |
3776 | \r | |
3777 | case 0x6f: /* LD IYL,A */\r | |
3778 | SET_LOW_REGISTER(IY, HIGH_REGISTER(AF));\r | |
3779 | break;\r | |
3780 | \r | |
3781 | case 0x70: /* LD (IY+dd),B */\r | |
3782 | adr = IY + (int8) RAM_PP(PC);\r | |
3783 | PUT_BYTE(adr, HIGH_REGISTER(BC));\r | |
3784 | break;\r | |
3785 | \r | |
3786 | case 0x71: /* LD (IY+dd),C */\r | |
3787 | adr = IY + (int8) RAM_PP(PC);\r | |
3788 | PUT_BYTE(adr, LOW_REGISTER(BC));\r | |
3789 | break;\r | |
3790 | \r | |
3791 | case 0x72: /* LD (IY+dd),D */\r | |
3792 | adr = IY + (int8) RAM_PP(PC);\r | |
3793 | PUT_BYTE(adr, HIGH_REGISTER(DE));\r | |
3794 | break;\r | |
3795 | \r | |
3796 | case 0x73: /* LD (IY+dd),E */\r | |
3797 | adr = IY + (int8) RAM_PP(PC);\r | |
3798 | PUT_BYTE(adr, LOW_REGISTER(DE));\r | |
3799 | break;\r | |
3800 | \r | |
3801 | case 0x74: /* LD (IY+dd),H */\r | |
3802 | adr = IY + (int8) RAM_PP(PC);\r | |
3803 | PUT_BYTE(adr, HIGH_REGISTER(HL));\r | |
3804 | break;\r | |
3805 | \r | |
3806 | case 0x75: /* LD (IY+dd),L */\r | |
3807 | adr = IY + (int8) RAM_PP(PC);\r | |
3808 | PUT_BYTE(adr, LOW_REGISTER(HL));\r | |
3809 | break;\r | |
3810 | \r | |
3811 | case 0x77: /* LD (IY+dd),A */\r | |
3812 | adr = IY + (int8) RAM_PP(PC);\r | |
3813 | PUT_BYTE(adr, HIGH_REGISTER(AF));\r | |
3814 | break;\r | |
3815 | \r | |
3816 | case 0x7c: /* LD A,IYH */\r | |
3817 | SET_HIGH_REGISTER(AF, HIGH_REGISTER(IY));\r | |
3818 | break;\r | |
3819 | \r | |
3820 | case 0x7d: /* LD A,IYL */\r | |
3821 | SET_HIGH_REGISTER(AF, LOW_REGISTER(IY));\r | |
3822 | break;\r | |
3823 | \r | |
3824 | case 0x7e: /* LD A,(IY+dd) */\r | |
3825 | adr = IY + (int8) RAM_PP(PC);\r | |
3826 | SET_HIGH_REGISTER(AF, GET_BYTE(adr));\r | |
3827 | break;\r | |
3828 | \r | |
3829 | case 0x84: /* ADD A,IYH */\r | |
3830 | temp = HIGH_REGISTER(IY);\r | |
3831 | acu = HIGH_REGISTER(AF);\r | |
3832 | sum = acu + temp;\r | |
3833 | AF = addTable[sum] | cbitsZ80Table[acu ^ temp ^ sum];\r | |
3834 | break;\r | |
3835 | \r | |
3836 | case 0x85: /* ADD A,IYL */\r | |
3837 | temp = LOW_REGISTER(IY);\r | |
3838 | acu = HIGH_REGISTER(AF);\r | |
3839 | sum = acu + temp;\r | |
3840 | AF = addTable[sum] | cbitsZ80Table[acu ^ temp ^ sum];\r | |
3841 | break;\r | |
3842 | \r | |
3843 | case 0x86: /* ADD A,(IY+dd) */\r | |
3844 | adr = IY + (int8) RAM_PP(PC);\r | |
3845 | temp = GET_BYTE(adr);\r | |
3846 | acu = HIGH_REGISTER(AF);\r | |
3847 | sum = acu + temp;\r | |
3848 | AF = addTable[sum] | cbitsZ80Table[acu ^ temp ^ sum];\r | |
3849 | break;\r | |
3850 | \r | |
3851 | case 0x8c: /* ADC A,IYH */\r | |
3852 | temp = HIGH_REGISTER(IY);\r | |
3853 | acu = HIGH_REGISTER(AF);\r | |
3854 | sum = acu + temp + TSTFLAG(C);\r | |
3855 | AF = addTable[sum] | cbitsZ80Table[acu ^ temp ^ sum];\r | |
3856 | break;\r | |
3857 | \r | |
3858 | case 0x8d: /* ADC A,IYL */\r | |
3859 | temp = LOW_REGISTER(IY);\r | |
3860 | acu = HIGH_REGISTER(AF);\r | |
3861 | sum = acu + temp + TSTFLAG(C);\r | |
3862 | AF = addTable[sum] | cbitsZ80Table[acu ^ temp ^ sum];\r | |
3863 | break;\r | |
3864 | \r | |
3865 | case 0x8e: /* ADC A,(IY+dd) */\r | |
3866 | adr = IY + (int8) RAM_PP(PC);\r | |
3867 | temp = GET_BYTE(adr);\r | |
3868 | acu = HIGH_REGISTER(AF);\r | |
3869 | sum = acu + temp + TSTFLAG(C);\r | |
3870 | AF = addTable[sum] | cbitsZ80Table[acu ^ temp ^ sum];\r | |
3871 | break;\r | |
3872 | \r | |
3873 | case 0x96: /* SUB (IY+dd) */\r | |
3874 | adr = IY + (int8) RAM_PP(PC);\r | |
3875 | temp = GET_BYTE(adr);\r | |
3876 | acu = HIGH_REGISTER(AF);\r | |
3877 | sum = acu - temp;\r | |
3878 | AF = addTable[sum & 0xff] | cbits2Z80Table[(acu ^ temp ^ sum) & 0x1ff];\r | |
3879 | break;\r | |
3880 | \r | |
3881 | case 0x94: /* SUB IYH */\r | |
3882 | SETFLAG(C, 0);/* fall through, a bit less efficient but smaller code */\r | |
3883 | \r | |
3884 | case 0x9c: /* SBC A,IYH */\r | |
3885 | temp = HIGH_REGISTER(IY);\r | |
3886 | acu = HIGH_REGISTER(AF);\r | |
3887 | sum = acu - temp - TSTFLAG(C);\r | |
3888 | AF = addTable[sum & 0xff] | cbits2Z80Table[(acu ^ temp ^ sum) & 0x1ff];\r | |
3889 | break;\r | |
3890 | \r | |
3891 | case 0x95: /* SUB IYL */\r | |
3892 | SETFLAG(C, 0);/* fall through, a bit less efficient but smaller code */\r | |
3893 | \r | |
3894 | case 0x9d: /* SBC A,IYL */\r | |
3895 | temp = LOW_REGISTER(IY);\r | |
3896 | acu = HIGH_REGISTER(AF);\r | |
3897 | sum = acu - temp - TSTFLAG(C);\r | |
3898 | AF = addTable[sum & 0xff] | cbits2Z80Table[(acu ^ temp ^ sum) & 0x1ff];\r | |
3899 | break;\r | |
3900 | \r | |
3901 | case 0x9e: /* SBC A,(IY+dd) */\r | |
3902 | adr = IY + (int8) RAM_PP(PC);\r | |
3903 | temp = GET_BYTE(adr);\r | |
3904 | acu = HIGH_REGISTER(AF);\r | |
3905 | sum = acu - temp - TSTFLAG(C);\r | |
3906 | AF = addTable[sum & 0xff] | cbits2Z80Table[(acu ^ temp ^ sum) & 0x1ff];\r | |
3907 | break;\r | |
3908 | \r | |
3909 | case 0xa4: /* AND IYH */\r | |
3910 | AF = andTable[((AF & IY) >> 8) & 0xff];\r | |
3911 | break;\r | |
3912 | \r | |
3913 | case 0xa5: /* AND IYL */\r | |
3914 | AF = andTable[((AF >> 8) & IY) & 0xff];\r | |
3915 | break;\r | |
3916 | \r | |
3917 | case 0xa6: /* AND (IY+dd) */\r | |
3918 | adr = IY + (int8) RAM_PP(PC);\r | |
3919 | AF = andTable[((AF >> 8) & GET_BYTE(adr)) & 0xff];\r | |
3920 | break;\r | |
3921 | \r | |
3922 | case 0xac: /* XOR IYH */\r | |
3923 | AF = xororTable[((AF ^ IY) >> 8) & 0xff];\r | |
3924 | break;\r | |
3925 | \r | |
3926 | case 0xad: /* XOR IYL */\r | |
3927 | AF = xororTable[((AF >> 8) ^ IY) & 0xff];\r | |
3928 | break;\r | |
3929 | \r | |
3930 | case 0xae: /* XOR (IY+dd) */\r | |
3931 | adr = IY + (int8) RAM_PP(PC);\r | |
3932 | AF = xororTable[((AF >> 8) ^ GET_BYTE(adr)) & 0xff];\r | |
3933 | break;\r | |
3934 | \r | |
3935 | case 0xb4: /* OR IYH */\r | |
3936 | AF = xororTable[((AF | IY) >> 8) & 0xff];\r | |
3937 | break;\r | |
3938 | \r | |
3939 | case 0xb5: /* OR IYL */\r | |
3940 | AF = xororTable[((AF >> 8) | IY) & 0xff];\r | |
3941 | break;\r | |
3942 | \r | |
3943 | case 0xb6: /* OR (IY+dd) */\r | |
3944 | adr = IY + (int8) RAM_PP(PC);\r | |
3945 | AF = xororTable[((AF >> 8) | GET_BYTE(adr)) & 0xff];\r | |
3946 | break;\r | |
3947 | \r | |
3948 | case 0xbc: /* CP IYH */\r | |
3949 | temp = HIGH_REGISTER(IY);\r | |
3950 | AF = (AF & ~0x28) | (temp & 0x28);\r | |
3951 | acu = HIGH_REGISTER(AF);\r | |
3952 | sum = acu - temp;\r | |
3953 | AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |\r | |
3954 | cbits2Z80Table[(acu ^ temp ^ sum) & 0x1ff];\r | |
3955 | break;\r | |
3956 | \r | |
3957 | case 0xbd: /* CP IYL */\r | |
3958 | temp = LOW_REGISTER(IY);\r | |
3959 | AF = (AF & ~0x28) | (temp & 0x28);\r | |
3960 | acu = HIGH_REGISTER(AF);\r | |
3961 | sum = acu - temp;\r | |
3962 | AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |\r | |
3963 | cbits2Z80Table[(acu ^ temp ^ sum) & 0x1ff];\r | |
3964 | break;\r | |
3965 | \r | |
3966 | case 0xbe: /* CP (IY+dd) */\r | |
3967 | adr = IY + (int8) RAM_PP(PC);\r | |
3968 | temp = GET_BYTE(adr);\r | |
3969 | AF = (AF & ~0x28) | (temp & 0x28);\r | |
3970 | acu = HIGH_REGISTER(AF);\r | |
3971 | sum = acu - temp;\r | |
3972 | AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |\r | |
3973 | cbits2Z80Table[(acu ^ temp ^ sum) & 0x1ff];\r | |
3974 | break;\r | |
3975 | \r | |
3976 | case 0xcb: /* CB prefix */\r | |
3977 | adr = IY + (int8) RAM_PP(PC);\r | |
3978 | switch ((op = GET_BYTE(PC)) & 7) {\r | |
3979 | \r | |
3980 | case 0:\r | |
3981 | ++PC;\r | |
3982 | acu = HIGH_REGISTER(BC);\r | |
3983 | break;\r | |
3984 | \r | |
3985 | case 1:\r | |
3986 | ++PC;\r | |
3987 | acu = LOW_REGISTER(BC);\r | |
3988 | break;\r | |
3989 | \r | |
3990 | case 2:\r | |
3991 | ++PC;\r | |
3992 | acu = HIGH_REGISTER(DE);\r | |
3993 | break;\r | |
3994 | \r | |
3995 | case 3:\r | |
3996 | ++PC;\r | |
3997 | acu = LOW_REGISTER(DE);\r | |
3998 | break;\r | |
3999 | \r | |
4000 | case 4:\r | |
4001 | ++PC;\r | |
4002 | acu = HIGH_REGISTER(HL);\r | |
4003 | break;\r | |
4004 | \r | |
4005 | case 5:\r | |
4006 | ++PC;\r | |
4007 | acu = LOW_REGISTER(HL);\r | |
4008 | break;\r | |
4009 | \r | |
4010 | case 6:\r | |
4011 | ++PC;\r | |
4012 | acu = GET_BYTE(adr);\r | |
4013 | break;\r | |
4014 | \r | |
4015 | case 7:\r | |
4016 | ++PC;\r | |
4017 | acu = HIGH_REGISTER(AF);\r | |
4018 | break;\r | |
4019 | }\r | |
4020 | switch (op & 0xc0) {\r | |
4021 | \r | |
4022 | case 0x00: /* shift/rotate */\r | |
4023 | switch (op & 0x38) {\r | |
4024 | \r | |
4025 | case 0x00:/* RLC */\r | |
4026 | temp = (acu << 1) | (acu >> 7);\r | |
4027 | cbits = temp & 1;\r | |
4028 | goto cbshflg3;\r | |
4029 | \r | |
4030 | case 0x08:/* RRC */\r | |
4031 | temp = (acu >> 1) | (acu << 7);\r | |
4032 | cbits = temp & 0x80;\r | |
4033 | goto cbshflg3;\r | |
4034 | \r | |
4035 | case 0x10:/* RL */\r | |
4036 | temp = (acu << 1) | TSTFLAG(C);\r | |
4037 | cbits = acu & 0x80;\r | |
4038 | goto cbshflg3;\r | |
4039 | \r | |
4040 | case 0x18:/* RR */\r | |
4041 | temp = (acu >> 1) | (TSTFLAG(C) << 7);\r | |
4042 | cbits = acu & 1;\r | |
4043 | goto cbshflg3;\r | |
4044 | \r | |
4045 | case 0x20:/* SLA */\r | |
4046 | temp = acu << 1;\r | |
4047 | cbits = acu & 0x80;\r | |
4048 | goto cbshflg3;\r | |
4049 | \r | |
4050 | case 0x28:/* SRA */\r | |
4051 | temp = (acu >> 1) | (acu & 0x80);\r | |
4052 | cbits = acu & 1;\r | |
4053 | goto cbshflg3;\r | |
4054 | \r | |
4055 | case 0x30:/* SLIA */\r | |
4056 | temp = (acu << 1) | 1;\r | |
4057 | cbits = acu & 0x80;\r | |
4058 | goto cbshflg3;\r | |
4059 | \r | |
4060 | case 0x38:/* SRL */\r | |
4061 | temp = acu >> 1;\r | |
4062 | cbits = acu & 1;\r | |
4063 | cbshflg3:\r | |
4064 | AF = (AF & ~0xff) | rotateShiftTable[temp & 0xff] | !!cbits;\r | |
4065 | }\r | |
4066 | break;\r | |
4067 | \r | |
4068 | case 0x40: /* BIT */\r | |
4069 | if (acu & (1 << ((op >> 3) & 7)))\r | |
4070 | AF = (AF & ~0xfe) | 0x10 | (((op & 0x38) == 0x38) << 7);\r | |
4071 | else AF = (AF & ~0xfe) | 0x54;\r | |
4072 | if ((op & 7) != 6) AF |= (acu & 0x28);\r | |
4073 | temp = acu;\r | |
4074 | break;\r | |
4075 | \r | |
4076 | case 0x80: /* RES */\r | |
4077 | temp = acu & ~(1 << ((op >> 3) & 7));\r | |
4078 | break;\r | |
4079 | \r | |
4080 | case 0xc0: /* SET */\r | |
4081 | temp = acu | (1 << ((op >> 3) & 7));\r | |
4082 | break;\r | |
4083 | }\r | |
4084 | switch (op & 7) {\r | |
4085 | \r | |
4086 | case 0:\r | |
4087 | SET_HIGH_REGISTER(BC, temp);\r | |
4088 | break;\r | |
4089 | \r | |
4090 | case 1:\r | |
4091 | SET_LOW_REGISTER(BC, temp);\r | |
4092 | break;\r | |
4093 | \r | |
4094 | case 2:\r | |
4095 | SET_HIGH_REGISTER(DE, temp);\r | |
4096 | break;\r | |
4097 | \r | |
4098 | case 3:\r | |
4099 | SET_LOW_REGISTER(DE, temp);\r | |
4100 | break;\r | |
4101 | \r | |
4102 | case 4:\r | |
4103 | SET_HIGH_REGISTER(HL, temp);\r | |
4104 | break;\r | |
4105 | \r | |
4106 | case 5:\r | |
4107 | SET_LOW_REGISTER(HL, temp);\r | |
4108 | break;\r | |
4109 | \r | |
4110 | case 6:\r | |
4111 | PUT_BYTE(adr, temp);\r | |
4112 | break;\r | |
4113 | \r | |
4114 | case 7:\r | |
4115 | SET_HIGH_REGISTER(AF, temp);\r | |
4116 | break;\r | |
4117 | }\r | |
4118 | break;\r | |
4119 | \r | |
4120 | case 0xe1: /* POP IY */\r | |
4121 | POP(IY);\r | |
4122 | break;\r | |
4123 | \r | |
4124 | case 0xe3: /* EX (SP),IY */\r | |
4125 | temp = IY;\r | |
4126 | POP(IY);\r | |
4127 | PUSH(temp);\r | |
4128 | break;\r | |
4129 | \r | |
4130 | case 0xe5: /* PUSH IY */\r | |
4131 | PUSH(IY);\r | |
4132 | break;\r | |
4133 | \r | |
4134 | case 0xe9: /* JP (IY) */\r | |
4135 | PC = IY;\r | |
4136 | break;\r | |
4137 | \r | |
4138 | case 0xf9: /* LD SP,IY */\r | |
4139 | SP = IY;\r | |
4140 | break;\r | |
4141 | \r | |
4142 | default: /* ignore FD */\r | |
4143 | CHECK_CPU_Z80;\r | |
4144 | PC--;\r | |
4145 | }\r | |
4146 | break;\r | |
4147 | \r | |
4148 | case 0xfe: /* CP nn */\r | |
4149 | temp = RAM_PP(PC);\r | |
4150 | AF = (AF & ~0x28) | (temp & 0x28);\r | |
4151 | acu = HIGH_REGISTER(AF);\r | |
4152 | sum = acu - temp;\r | |
4153 | cbits = acu ^ temp ^ sum;\r | |
4154 | AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |\r | |
4155 | (SET_PV) | cbits2Table[cbits & 0x1ff];\r | |
4156 | break;\r | |
4157 | \r | |
4158 | case 0xff: /* RST 38H */\r | |
4159 | PUSH(PC);\r | |
4160 | PC = 0x38;\r | |
4161 | }\r | |
4162 | }\r | |
4163 | end_decode:\r | |
4164 | \r | |
4165 | /* simulation halted */\r | |
4166 | PC_S = (reason == STOP_OPCODE) ? PCX : PC;\r | |
4167 | AF_S = AF;\r | |
4168 | BC_S = BC;\r | |
4169 | DE_S = DE;\r | |
4170 | HL_S = HL;\r | |
4171 | IX_S = IX;\r | |
4172 | IY_S = IY;\r | |
4173 | SP_S = SP;\r | |
4174 | return reason;\r | |
4175 | }\r |