Import VirtualNascom 1.0
[virtual-nascom.git] / simz80.c
blobf975b796add76d0bb8a105be9f7447b2252793e6
1 /* Z80 instruction set simulator.
2 Copyright (C) 1995 Frank D. Cringle.
4 This file is part of yaze - yet another Z80 emulator.
6 Yaze is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 2 of the License, or (at your
9 option) any later version.
11 This program is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20 /* This file was generated from simz80.pl
21 with the following choice of options */
22 char *perl_params =
23 "combine=0,"
24 "optab=0,"
25 "cb_inline=0,"
26 "dfd_inline=0,"
27 "ed_inline=1";
29 #include "simz80.h"
31 static const unsigned char partab[256] = {
32 4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,
33 0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,
34 0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,
35 4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,
36 0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,
37 4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,
38 4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,
39 0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,
40 0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,
41 4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,
42 4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,
43 0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,
44 4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,
45 0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,
46 0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,
47 4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,
50 #define parity(x) partab[(x)&0xff]
52 #ifdef DEBUG
53 volatile int stopsim;
54 #endif
56 #define POP(x) do { \
57 FASTREG y = RAM(SP); SP++; \
58 x = y + (RAM(SP) << 8); SP++; \
59 } while (0)
61 #define PUSH(x) do { \
62 --SP; RAM(SP) = (x) >> 8; \
63 --SP; RAM(SP) = x; \
64 } while (0)
66 #define JPC(cond) PC = cond ? GetWORD(PC) : PC+2
68 #define CALLC(cond) { \
69 if (cond) { \
70 FASTREG adrr = GetWORD(PC); \
71 PUSH(PC+2); \
72 PC = adrr; \
73 } \
74 else \
75 PC += 2; \
78 /* load Z80 registers into (we hope) host registers */
79 #define LOAD_STATE() \
80 PC = pc; \
81 AF = af[af_sel]; \
82 BC = regs[regs_sel].bc; \
83 DE = regs[regs_sel].de; \
84 HL = regs[regs_sel].hl; \
85 SP = sp
87 /* load Z80 registers into (we hope) host registers */
88 #define DECLARE_STATE() \
89 FASTREG PC = pc; \
90 FASTREG AF = af[af_sel]; \
91 FASTREG BC = regs[regs_sel].bc; \
92 FASTREG DE = regs[regs_sel].de; \
93 FASTREG HL = regs[regs_sel].hl; \
94 FASTREG SP = sp
96 /* save Z80 registers back into memory */
97 #define SAVE_STATE() \
98 pc = PC; \
99 af[af_sel] = AF; \
100 regs[regs_sel].bc = BC; \
101 regs[regs_sel].de = DE; \
102 regs[regs_sel].hl = HL; \
103 sp = SP
105 static void
106 cb_prefix(FASTREG adr)
108 DECLARE_STATE();
109 FASTWORK temp = 0, acu = 0, op, cbits;
111 switch ((op = GetBYTE(PC)) & 7) {
112 case 0: ++PC; acu = hreg(BC); break;
113 case 1: ++PC; acu = lreg(BC); break;
114 case 2: ++PC; acu = hreg(DE); break;
115 case 3: ++PC; acu = lreg(DE); break;
116 case 4: ++PC; acu = hreg(HL); break;
117 case 5: ++PC; acu = lreg(HL); break;
118 case 6: ++PC; acu = GetBYTE(adr); break;
119 case 7: ++PC; acu = hreg(AF); break;
121 switch (op & 0xc0) {
122 case 0x00: /* shift/rotate */
123 switch (op & 0x38) {
124 case 0x00: /* RLC */
125 temp = (acu << 1) | (acu >> 7);
126 cbits = temp & 1;
127 goto cbshflg1;
128 case 0x08: /* RRC */
129 temp = (acu >> 1) | (acu << 7);
130 cbits = temp & 0x80;
131 goto cbshflg1;
132 case 0x10: /* RL */
133 temp = (acu << 1) | TSTFLAG(C);
134 cbits = acu & 0x80;
135 goto cbshflg1;
136 case 0x18: /* RR */
137 temp = (acu >> 1) | (TSTFLAG(C) << 7);
138 cbits = acu & 1;
139 goto cbshflg1;
140 case 0x20: /* SLA */
141 temp = acu << 1;
142 cbits = acu & 0x80;
143 goto cbshflg1;
144 case 0x28: /* SRA */
145 temp = (acu >> 1) | (acu & 0x80);
146 cbits = acu & 1;
147 goto cbshflg1;
148 case 0x30: /* SLIA */
149 temp = (acu << 1) | 1;
150 cbits = acu & 0x80;
151 goto cbshflg1;
152 case 0x38: /* SRL */
153 temp = acu >> 1;
154 cbits = acu & 1;
155 cbshflg1:
156 AF = (AF & ~0xff) | (temp & 0xa8) |
157 (((temp & 0xff) == 0) << 6) |
158 parity(temp) | !!cbits;
160 break;
161 case 0x40: /* BIT */
162 if (acu & (1 << ((op >> 3) & 7)))
163 AF = (AF & ~0xfe) | 0x10 |
164 (((op & 0x38) == 0x38) << 7);
165 else
166 AF = (AF & ~0xfe) | 0x54;
167 if ((op&7) != 6)
168 AF |= (acu & 0x28);
169 temp = acu;
170 break;
171 case 0x80: /* RES */
172 temp = acu & ~(1 << ((op >> 3) & 7));
173 break;
174 case 0xc0: /* SET */
175 temp = acu | (1 << ((op >> 3) & 7));
176 break;
178 switch (op & 7) {
179 case 0: Sethreg(BC, temp); break;
180 case 1: Setlreg(BC, temp); break;
181 case 2: Sethreg(DE, temp); break;
182 case 3: Setlreg(DE, temp); break;
183 case 4: Sethreg(HL, temp); break;
184 case 5: Setlreg(HL, temp); break;
185 case 6: PutBYTE(adr, temp); break;
186 case 7: Sethreg(AF, temp); break;
188 SAVE_STATE();
191 static FASTREG
192 dfd_prefix(FASTREG IXY)
194 DECLARE_STATE();
195 FASTWORK temp, adr, acu, op, sum, cbits;
197 switch (++PC, op = GetBYTE(PC-1)) {
198 case 0x09: /* ADD IXY,BC */
199 IXY &= 0xffff;
200 BC &= 0xffff;
201 sum = IXY + BC;
202 cbits = (IXY ^ BC ^ sum) >> 8;
203 IXY = sum;
204 AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) |
205 (cbits & 0x10) | ((cbits >> 8) & 1);
206 break;
207 case 0x19: /* ADD IXY,DE */
208 IXY &= 0xffff;
209 DE &= 0xffff;
210 sum = IXY + DE;
211 cbits = (IXY ^ DE ^ sum) >> 8;
212 IXY = sum;
213 AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) |
214 (cbits & 0x10) | ((cbits >> 8) & 1);
215 break;
216 case 0x21: /* LD IXY,nnnn */
217 IXY = GetWORD(PC);
218 PC += 2;
219 break;
220 case 0x22: /* LD (nnnn),IXY */
221 temp = GetWORD(PC);
222 PutWORD(temp, IXY);
223 PC += 2;
224 break;
225 case 0x23: /* INC IXY */
226 ++IXY;
227 break;
228 case 0x24: /* INC IXYH */
229 IXY += 0x100;
230 temp = hreg(IXY);
231 AF = (AF & ~0xfe) | (temp & 0xa8) |
232 (((temp & 0xff) == 0) << 6) |
233 (((temp & 0xf) == 0) << 4) |
234 ((temp == 0x80) << 2);
235 break;
236 case 0x25: /* DEC IXYH */
237 IXY -= 0x100;
238 temp = hreg(IXY);
239 AF = (AF & ~0xfe) | (temp & 0xa8) |
240 (((temp & 0xff) == 0) << 6) |
241 (((temp & 0xf) == 0xf) << 4) |
242 ((temp == 0x7f) << 2) | 2;
243 break;
244 case 0x26: /* LD IXYH,nn */
245 Sethreg(IXY, GetBYTE(PC)); ++PC;
246 break;
247 case 0x29: /* ADD IXY,IXY */
248 IXY &= 0xffff;
249 sum = IXY + IXY;
250 cbits = (IXY ^ IXY ^ sum) >> 8;
251 IXY = sum;
252 AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) |
253 (cbits & 0x10) | ((cbits >> 8) & 1);
254 break;
255 case 0x2A: /* LD IXY,(nnnn) */
256 temp = GetWORD(PC);
257 IXY = GetWORD(temp);
258 PC += 2;
259 break;
260 case 0x2B: /* DEC IXY */
261 --IXY;
262 break;
263 case 0x2C: /* INC IXYL */
264 temp = lreg(IXY)+1;
265 Setlreg(IXY, temp);
266 AF = (AF & ~0xfe) | (temp & 0xa8) |
267 (((temp & 0xff) == 0) << 6) |
268 (((temp & 0xf) == 0) << 4) |
269 ((temp == 0x80) << 2);
270 break;
271 case 0x2D: /* DEC IXYL */
272 temp = lreg(IXY)-1;
273 Setlreg(IXY, temp);
274 AF = (AF & ~0xfe) | (temp & 0xa8) |
275 (((temp & 0xff) == 0) << 6) |
276 (((temp & 0xf) == 0xf) << 4) |
277 ((temp == 0x7f) << 2) | 2;
278 break;
279 case 0x2E: /* LD IXYL,nn */
280 Setlreg(IXY, GetBYTE(PC)); ++PC;
281 break;
282 case 0x34: /* INC (IXY+dd) */
283 adr = IXY + (signed char) GetBYTE(PC); ++PC;
284 temp = GetBYTE(adr)+1;
285 PutBYTE(adr, temp);
286 AF = (AF & ~0xfe) | (temp & 0xa8) |
287 (((temp & 0xff) == 0) << 6) |
288 (((temp & 0xf) == 0) << 4) |
289 ((temp == 0x80) << 2);
290 break;
291 case 0x35: /* DEC (IXY+dd) */
292 adr = IXY + (signed char) GetBYTE(PC); ++PC;
293 temp = GetBYTE(adr)-1;
294 PutBYTE(adr, temp);
295 AF = (AF & ~0xfe) | (temp & 0xa8) |
296 (((temp & 0xff) == 0) << 6) |
297 (((temp & 0xf) == 0xf) << 4) |
298 ((temp == 0x7f) << 2) | 2;
299 break;
300 case 0x36: /* LD (IXY+dd),nn */
301 adr = IXY + (signed char) GetBYTE(PC); ++PC;
302 PutBYTE(adr, GetBYTE(PC)); ++PC;
303 break;
304 case 0x39: /* ADD IXY,SP */
305 IXY &= 0xffff;
306 SP &= 0xffff;
307 sum = IXY + SP;
308 cbits = (IXY ^ SP ^ sum) >> 8;
309 IXY = sum;
310 AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) |
311 (cbits & 0x10) | ((cbits >> 8) & 1);
312 break;
313 case 0x44: /* LD B,IXYH */
314 Sethreg(BC, hreg(IXY));
315 break;
316 case 0x45: /* LD B,IXYL */
317 Sethreg(BC, lreg(IXY));
318 break;
319 case 0x46: /* LD B,(IXY+dd) */
320 adr = IXY + (signed char) GetBYTE(PC); ++PC;
321 Sethreg(BC, GetBYTE(adr));
322 break;
323 case 0x4C: /* LD C,IXYH */
324 Setlreg(BC, hreg(IXY));
325 break;
326 case 0x4D: /* LD C,IXYL */
327 Setlreg(BC, lreg(IXY));
328 break;
329 case 0x4E: /* LD C,(IXY+dd) */
330 adr = IXY + (signed char) GetBYTE(PC); ++PC;
331 Setlreg(BC, GetBYTE(adr));
332 break;
333 case 0x54: /* LD D,IXYH */
334 Sethreg(DE, hreg(IXY));
335 break;
336 case 0x55: /* LD D,IXYL */
337 Sethreg(DE, lreg(IXY));
338 break;
339 case 0x56: /* LD D,(IXY+dd) */
340 adr = IXY + (signed char) GetBYTE(PC); ++PC;
341 Sethreg(DE, GetBYTE(adr));
342 break;
343 case 0x5C: /* LD E,H */
344 Setlreg(DE, hreg(IXY));
345 break;
346 case 0x5D: /* LD E,L */
347 Setlreg(DE, lreg(IXY));
348 break;
349 case 0x5E: /* LD E,(IXY+dd) */
350 adr = IXY + (signed char) GetBYTE(PC); ++PC;
351 Setlreg(DE, GetBYTE(adr));
352 break;
353 case 0x60: /* LD IXYH,B */
354 Sethreg(IXY, hreg(BC));
355 break;
356 case 0x61: /* LD IXYH,C */
357 Sethreg(IXY, lreg(BC));
358 break;
359 case 0x62: /* LD IXYH,D */
360 Sethreg(IXY, hreg(DE));
361 break;
362 case 0x63: /* LD IXYH,E */
363 Sethreg(IXY, lreg(DE));
364 break;
365 case 0x64: /* LD IXYH,IXYH */
366 /* nop */
367 break;
368 case 0x65: /* LD IXYH,IXYL */
369 Sethreg(IXY, lreg(IXY));
370 break;
371 case 0x66: /* LD H,(IXY+dd) */
372 adr = IXY + (signed char) GetBYTE(PC); ++PC;
373 Sethreg(HL, GetBYTE(adr));
374 break;
375 case 0x67: /* LD IXYH,A */
376 Sethreg(IXY, hreg(AF));
377 break;
378 case 0x68: /* LD IXYL,B */
379 Setlreg(IXY, hreg(BC));
380 break;
381 case 0x69: /* LD IXYL,C */
382 Setlreg(IXY, lreg(BC));
383 break;
384 case 0x6A: /* LD IXYL,D */
385 Setlreg(IXY, hreg(DE));
386 break;
387 case 0x6B: /* LD IXYL,E */
388 Setlreg(IXY, lreg(DE));
389 break;
390 case 0x6C: /* LD IXYL,IXYH */
391 Setlreg(IXY, hreg(IXY));
392 break;
393 case 0x6D: /* LD IXYL,IXYL */
394 /* nop */
395 break;
396 case 0x6E: /* LD L,(IXY+dd) */
397 adr = IXY + (signed char) GetBYTE(PC); ++PC;
398 Setlreg(HL, GetBYTE(adr));
399 break;
400 case 0x6F: /* LD IXYL,A */
401 Setlreg(IXY, hreg(AF));
402 break;
403 case 0x70: /* LD (IXY+dd),B */
404 adr = IXY + (signed char) GetBYTE(PC); ++PC;
405 PutBYTE(adr, hreg(BC));
406 break;
407 case 0x71: /* LD (IXY+dd),C */
408 adr = IXY + (signed char) GetBYTE(PC); ++PC;
409 PutBYTE(adr, lreg(BC));
410 break;
411 case 0x72: /* LD (IXY+dd),D */
412 adr = IXY + (signed char) GetBYTE(PC); ++PC;
413 PutBYTE(adr, hreg(DE));
414 break;
415 case 0x73: /* LD (IXY+dd),E */
416 adr = IXY + (signed char) GetBYTE(PC); ++PC;
417 PutBYTE(adr, lreg(DE));
418 break;
419 case 0x74: /* LD (IXY+dd),H */
420 adr = IXY + (signed char) GetBYTE(PC); ++PC;
421 PutBYTE(adr, hreg(HL));
422 break;
423 case 0x75: /* LD (IXY+dd),L */
424 adr = IXY + (signed char) GetBYTE(PC); ++PC;
425 PutBYTE(adr, lreg(HL));
426 break;
427 case 0x77: /* LD (IXY+dd),A */
428 adr = IXY + (signed char) GetBYTE(PC); ++PC;
429 PutBYTE(adr, hreg(AF));
430 break;
431 case 0x7C: /* LD A,IXYH */
432 Sethreg(AF, hreg(IXY));
433 break;
434 case 0x7D: /* LD A,IXYL */
435 Sethreg(AF, lreg(IXY));
436 break;
437 case 0x7E: /* LD A,(IXY+dd) */
438 adr = IXY + (signed char) GetBYTE(PC); ++PC;
439 Sethreg(AF, GetBYTE(adr));
440 break;
441 case 0x84: /* ADD A,IXYH */
442 temp = hreg(IXY);
443 acu = hreg(AF);
444 sum = acu + temp;
445 cbits = acu ^ temp ^ sum;
446 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
447 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
448 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
449 ((cbits >> 8) & 1);
450 break;
451 case 0x85: /* ADD A,IXYL */
452 temp = lreg(IXY);
453 acu = hreg(AF);
454 sum = acu + temp;
455 cbits = acu ^ temp ^ sum;
456 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
457 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
458 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
459 ((cbits >> 8) & 1);
460 break;
461 case 0x86: /* ADD A,(IXY+dd) */
462 adr = IXY + (signed char) GetBYTE(PC); ++PC;
463 temp = GetBYTE(adr);
464 acu = hreg(AF);
465 sum = acu + temp;
466 cbits = acu ^ temp ^ sum;
467 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
468 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
469 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
470 ((cbits >> 8) & 1);
471 break;
472 case 0x8C: /* ADC A,IXYH */
473 temp = hreg(IXY);
474 acu = hreg(AF);
475 sum = acu + temp + TSTFLAG(C);
476 cbits = acu ^ temp ^ sum;
477 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
478 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
479 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
480 ((cbits >> 8) & 1);
481 break;
482 case 0x8D: /* ADC A,IXYL */
483 temp = lreg(IXY);
484 acu = hreg(AF);
485 sum = acu + temp + TSTFLAG(C);
486 cbits = acu ^ temp ^ sum;
487 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
488 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
489 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
490 ((cbits >> 8) & 1);
491 break;
492 case 0x8E: /* ADC A,(IXY+dd) */
493 adr = IXY + (signed char) GetBYTE(PC); ++PC;
494 temp = GetBYTE(adr);
495 acu = hreg(AF);
496 sum = acu + temp + TSTFLAG(C);
497 cbits = acu ^ temp ^ sum;
498 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
499 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
500 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
501 ((cbits >> 8) & 1);
502 break;
503 case 0x94: /* SUB IXYH */
504 temp = hreg(IXY);
505 acu = hreg(AF);
506 sum = acu - temp;
507 cbits = acu ^ temp ^ sum;
508 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
509 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
510 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
511 ((cbits >> 8) & 1);
512 break;
513 case 0x95: /* SUB IXYL */
514 temp = lreg(IXY);
515 acu = hreg(AF);
516 sum = acu - temp;
517 cbits = acu ^ temp ^ sum;
518 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
519 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
520 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
521 ((cbits >> 8) & 1);
522 break;
523 case 0x96: /* SUB (IXY+dd) */
524 adr = IXY + (signed char) GetBYTE(PC); ++PC;
525 temp = GetBYTE(adr);
526 acu = hreg(AF);
527 sum = acu - temp;
528 cbits = acu ^ temp ^ sum;
529 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
530 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
531 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
532 ((cbits >> 8) & 1);
533 break;
534 case 0x9C: /* SBC A,IXYH */
535 temp = hreg(IXY);
536 acu = hreg(AF);
537 sum = acu - temp - TSTFLAG(C);
538 cbits = acu ^ temp ^ sum;
539 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
540 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
541 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
542 ((cbits >> 8) & 1);
543 break;
544 case 0x9D: /* SBC A,IXYL */
545 temp = lreg(IXY);
546 acu = hreg(AF);
547 sum = acu - temp - TSTFLAG(C);
548 cbits = acu ^ temp ^ sum;
549 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
550 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
551 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
552 ((cbits >> 8) & 1);
553 break;
554 case 0x9E: /* SBC A,(IXY+dd) */
555 adr = IXY + (signed char) GetBYTE(PC); ++PC;
556 temp = GetBYTE(adr);
557 acu = hreg(AF);
558 sum = acu - temp - TSTFLAG(C);
559 cbits = acu ^ temp ^ sum;
560 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
561 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
562 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
563 ((cbits >> 8) & 1);
564 break;
565 case 0xA4: /* AND IXYH */
566 sum = ((AF & (IXY)) >> 8) & 0xff;
567 AF = (sum << 8) | (sum & 0xa8) |
568 ((sum == 0) << 6) | 0x10 | partab[sum];
569 break;
570 case 0xA5: /* AND IXYL */
571 sum = ((AF >> 8) & IXY) & 0xff;
572 AF = (sum << 8) | (sum & 0xa8) | 0x10 |
573 ((sum == 0) << 6) | partab[sum];
574 break;
575 case 0xA6: /* AND (IXY+dd) */
576 adr = IXY + (signed char) GetBYTE(PC); ++PC;
577 sum = ((AF >> 8) & GetBYTE(adr)) & 0xff;
578 AF = (sum << 8) | (sum & 0xa8) | 0x10 |
579 ((sum == 0) << 6) | partab[sum];
580 break;
581 case 0xAC: /* XOR IXYH */
582 sum = ((AF ^ (IXY)) >> 8) & 0xff;
583 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
584 break;
585 case 0xAD: /* XOR IXYL */
586 sum = ((AF >> 8) ^ IXY) & 0xff;
587 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
588 break;
589 case 0xAE: /* XOR (IXY+dd) */
590 adr = IXY + (signed char) GetBYTE(PC); ++PC;
591 sum = ((AF >> 8) ^ GetBYTE(adr)) & 0xff;
592 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
593 break;
594 case 0xB4: /* OR IXYH */
595 sum = ((AF | (IXY)) >> 8) & 0xff;
596 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
597 break;
598 case 0xB5: /* OR IXYL */
599 sum = ((AF >> 8) | IXY) & 0xff;
600 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
601 break;
602 case 0xB6: /* OR (IXY+dd) */
603 adr = IXY + (signed char) GetBYTE(PC); ++PC;
604 sum = ((AF >> 8) | GetBYTE(adr)) & 0xff;
605 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
606 break;
607 case 0xBC: /* CP IXYH */
608 temp = hreg(IXY);
609 AF = (AF & ~0x28) | (temp & 0x28);
610 acu = hreg(AF);
611 sum = acu - temp;
612 cbits = acu ^ temp ^ sum;
613 AF = (AF & ~0xff) | (sum & 0x80) |
614 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
615 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
616 (cbits & 0x10) | ((cbits >> 8) & 1);
617 break;
618 case 0xBD: /* CP IXYL */
619 temp = lreg(IXY);
620 AF = (AF & ~0x28) | (temp & 0x28);
621 acu = hreg(AF);
622 sum = acu - temp;
623 cbits = acu ^ temp ^ sum;
624 AF = (AF & ~0xff) | (sum & 0x80) |
625 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
626 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
627 (cbits & 0x10) | ((cbits >> 8) & 1);
628 break;
629 case 0xBE: /* CP (IXY+dd) */
630 adr = IXY + (signed char) GetBYTE(PC); ++PC;
631 temp = GetBYTE(adr);
632 AF = (AF & ~0x28) | (temp & 0x28);
633 acu = hreg(AF);
634 sum = acu - temp;
635 cbits = acu ^ temp ^ sum;
636 AF = (AF & ~0xff) | (sum & 0x80) |
637 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
638 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
639 (cbits & 0x10) | ((cbits >> 8) & 1);
640 break;
641 case 0xCB: /* CB prefix */
642 adr = IXY + (signed char) GetBYTE(PC); ++PC;
643 SAVE_STATE();
644 cb_prefix(adr);
645 LOAD_STATE();
646 break;
647 case 0xE1: /* POP IXY */
648 POP(IXY);
649 break;
650 case 0xE3: /* EX (SP),IXY */
651 temp = IXY; POP(IXY); PUSH(temp);
652 break;
653 case 0xE5: /* PUSH IXY */
654 PUSH(IXY);
655 break;
656 case 0xE9: /* JP (IXY) */
657 PC = IXY;
658 break;
659 case 0xF9: /* LD SP,IXY */
660 SP = IXY;
661 break;
662 default: PC--; /* ignore DD */
664 SAVE_STATE();
665 return(IXY);
668 FASTWORK
669 simz80(FASTREG PC, int count, void (*fnc)())
671 FASTREG AF = af[af_sel];
672 FASTREG BC = regs[regs_sel].bc;
673 FASTREG DE = regs[regs_sel].de;
674 FASTREG HL = regs[regs_sel].hl;
675 FASTREG SP = sp;
676 FASTWORK temp, acu, sum, cbits;
677 FASTWORK op;
678 int n = count;
679 #ifdef DEBUG
680 while (!stopsim) {
681 #else
682 while (1) {
683 #endif
684 if (--n == 0) {
685 n = count;
686 (*fnc)();
689 switch(++PC,RAM(PC-1)) {
690 case 0x00: /* NOP */
691 break;
692 case 0x01: /* LD BC,nnnn */
693 BC = GetWORD(PC);
694 PC += 2;
695 break;
696 case 0x02: /* LD (BC),A */
697 PutBYTE(BC, hreg(AF));
698 break;
699 case 0x03: /* INC BC */
700 ++BC;
701 break;
702 case 0x04: /* INC B */
703 BC += 0x100;
704 temp = hreg(BC);
705 AF = (AF & ~0xfe) | (temp & 0xa8) |
706 (((temp & 0xff) == 0) << 6) |
707 (((temp & 0xf) == 0) << 4) |
708 ((temp == 0x80) << 2);
709 break;
710 case 0x05: /* DEC B */
711 BC -= 0x100;
712 temp = hreg(BC);
713 AF = (AF & ~0xfe) | (temp & 0xa8) |
714 (((temp & 0xff) == 0) << 6) |
715 (((temp & 0xf) == 0xf) << 4) |
716 ((temp == 0x7f) << 2) | 2;
717 break;
718 case 0x06: /* LD B,nn */
719 Sethreg(BC, GetBYTE(PC)); ++PC;
720 break;
721 case 0x07: /* RLCA */
722 AF = ((AF >> 7) & 0x0128) | ((AF << 1) & ~0x1ff) |
723 (AF & 0xc4) | ((AF >> 15) & 1);
724 break;
725 case 0x08: /* EX AF,AF' */
726 af[af_sel] = AF;
727 af_sel = 1 - af_sel;
728 AF = af[af_sel];
729 break;
730 case 0x09: /* ADD HL,BC */
731 HL &= 0xffff;
732 BC &= 0xffff;
733 sum = HL + BC;
734 cbits = (HL ^ BC ^ sum) >> 8;
735 HL = sum;
736 AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) |
737 (cbits & 0x10) | ((cbits >> 8) & 1);
738 break;
739 case 0x0A: /* LD A,(BC) */
740 Sethreg(AF, GetBYTE(BC));
741 break;
742 case 0x0B: /* DEC BC */
743 --BC;
744 break;
745 case 0x0C: /* INC C */
746 temp = lreg(BC)+1;
747 Setlreg(BC, temp);
748 AF = (AF & ~0xfe) | (temp & 0xa8) |
749 (((temp & 0xff) == 0) << 6) |
750 (((temp & 0xf) == 0) << 4) |
751 ((temp == 0x80) << 2);
752 break;
753 case 0x0D: /* DEC C */
754 temp = lreg(BC)-1;
755 Setlreg(BC, temp);
756 AF = (AF & ~0xfe) | (temp & 0xa8) |
757 (((temp & 0xff) == 0) << 6) |
758 (((temp & 0xf) == 0xf) << 4) |
759 ((temp == 0x7f) << 2) | 2;
760 break;
761 case 0x0E: /* LD C,nn */
762 Setlreg(BC, GetBYTE(PC)); ++PC;
763 break;
764 case 0x0F: /* RRCA */
765 temp = hreg(AF);
766 sum = temp >> 1;
767 AF = ((temp & 1) << 15) | (sum << 8) |
768 (sum & 0x28) | (AF & 0xc4) | (temp & 1);
769 break;
770 case 0x10: /* DJNZ dd */
771 PC += ((BC -= 0x100) & 0xff00) ? (signed char) GetBYTE(PC) + 1 : 1;
772 break;
773 case 0x11: /* LD DE,nnnn */
774 DE = GetWORD(PC);
775 PC += 2;
776 break;
777 case 0x12: /* LD (DE),A */
778 PutBYTE(DE, hreg(AF));
779 break;
780 case 0x13: /* INC DE */
781 ++DE;
782 break;
783 case 0x14: /* INC D */
784 DE += 0x100;
785 temp = hreg(DE);
786 AF = (AF & ~0xfe) | (temp & 0xa8) |
787 (((temp & 0xff) == 0) << 6) |
788 (((temp & 0xf) == 0) << 4) |
789 ((temp == 0x80) << 2);
790 break;
791 case 0x15: /* DEC D */
792 DE -= 0x100;
793 temp = hreg(DE);
794 AF = (AF & ~0xfe) | (temp & 0xa8) |
795 (((temp & 0xff) == 0) << 6) |
796 (((temp & 0xf) == 0xf) << 4) |
797 ((temp == 0x7f) << 2) | 2;
798 break;
799 case 0x16: /* LD D,nn */
800 Sethreg(DE, GetBYTE(PC)); ++PC;
801 break;
802 case 0x17: /* RLA */
803 AF = ((AF << 8) & 0x0100) | ((AF >> 7) & 0x28) | ((AF << 1) & ~0x01ff) |
804 (AF & 0xc4) | ((AF >> 15) & 1);
805 break;
806 case 0x18: /* JR dd */
807 PC += (1) ? (signed char) GetBYTE(PC) + 1 : 1;
808 break;
809 case 0x19: /* ADD HL,DE */
810 HL &= 0xffff;
811 DE &= 0xffff;
812 sum = HL + DE;
813 cbits = (HL ^ DE ^ sum) >> 8;
814 HL = sum;
815 AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) |
816 (cbits & 0x10) | ((cbits >> 8) & 1);
817 break;
818 case 0x1A: /* LD A,(DE) */
819 Sethreg(AF, GetBYTE(DE));
820 break;
821 case 0x1B: /* DEC DE */
822 --DE;
823 break;
824 case 0x1C: /* INC E */
825 temp = lreg(DE)+1;
826 Setlreg(DE, temp);
827 AF = (AF & ~0xfe) | (temp & 0xa8) |
828 (((temp & 0xff) == 0) << 6) |
829 (((temp & 0xf) == 0) << 4) |
830 ((temp == 0x80) << 2);
831 break;
832 case 0x1D: /* DEC E */
833 temp = lreg(DE)-1;
834 Setlreg(DE, temp);
835 AF = (AF & ~0xfe) | (temp & 0xa8) |
836 (((temp & 0xff) == 0) << 6) |
837 (((temp & 0xf) == 0xf) << 4) |
838 ((temp == 0x7f) << 2) | 2;
839 break;
840 case 0x1E: /* LD E,nn */
841 Setlreg(DE, GetBYTE(PC)); ++PC;
842 break;
843 case 0x1F: /* RRA */
844 temp = hreg(AF);
845 sum = temp >> 1;
846 AF = ((AF & 1) << 15) | (sum << 8) |
847 (sum & 0x28) | (AF & 0xc4) | (temp & 1);
848 break;
849 case 0x20: /* JR NZ,dd */
850 PC += (!TSTFLAG(Z)) ? (signed char) GetBYTE(PC) + 1 : 1;
851 break;
852 case 0x21: /* LD HL,nnnn */
853 HL = GetWORD(PC);
854 PC += 2;
855 break;
856 case 0x22: /* LD (nnnn),HL */
857 temp = GetWORD(PC);
858 PutWORD(temp, HL);
859 PC += 2;
860 break;
861 case 0x23: /* INC HL */
862 ++HL;
863 break;
864 case 0x24: /* INC H */
865 HL += 0x100;
866 temp = hreg(HL);
867 AF = (AF & ~0xfe) | (temp & 0xa8) |
868 (((temp & 0xff) == 0) << 6) |
869 (((temp & 0xf) == 0) << 4) |
870 ((temp == 0x80) << 2);
871 break;
872 case 0x25: /* DEC H */
873 HL -= 0x100;
874 temp = hreg(HL);
875 AF = (AF & ~0xfe) | (temp & 0xa8) |
876 (((temp & 0xff) == 0) << 6) |
877 (((temp & 0xf) == 0xf) << 4) |
878 ((temp == 0x7f) << 2) | 2;
879 break;
880 case 0x26: /* LD H,nn */
881 Sethreg(HL, GetBYTE(PC)); ++PC;
882 break;
883 case 0x27: /* DAA */
884 acu = hreg(AF);
885 temp = ldig(acu);
886 cbits = TSTFLAG(C);
887 if (TSTFLAG(N)) { /* last operation was a subtract */
888 int hd = cbits || acu > 0x99;
889 if (TSTFLAG(H) || (temp > 9)) { /* adjust low digit */
890 if (temp > 5)
891 SETFLAG(H, 0);
892 acu -= 6;
893 acu &= 0xff;
895 if (hd) /* adjust high digit */
896 acu -= 0x160;
898 else { /* last operation was an add */
899 if (TSTFLAG(H) || (temp > 9)) { /* adjust low digit */
900 SETFLAG(H, (temp > 9));
901 acu += 6;
903 if (cbits || ((acu & 0x1f0) > 0x90)) /* adjust high digit */
904 acu += 0x60;
906 cbits |= (acu >> 8) & 1;
907 acu &= 0xff;
908 AF = (acu << 8) | (acu & 0xa8) | ((acu == 0) << 6) |
909 (AF & 0x12) | partab[acu] | cbits;
910 break;
911 case 0x28: /* JR Z,dd */
912 PC += (TSTFLAG(Z)) ? (signed char) GetBYTE(PC) + 1 : 1;
913 break;
914 case 0x29: /* ADD HL,HL */
915 HL &= 0xffff;
916 sum = HL + HL;
917 cbits = (HL ^ HL ^ sum) >> 8;
918 HL = sum;
919 AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) |
920 (cbits & 0x10) | ((cbits >> 8) & 1);
921 break;
922 case 0x2A: /* LD HL,(nnnn) */
923 temp = GetWORD(PC);
924 HL = GetWORD(temp);
925 PC += 2;
926 break;
927 case 0x2B: /* DEC HL */
928 --HL;
929 break;
930 case 0x2C: /* INC L */
931 temp = lreg(HL)+1;
932 Setlreg(HL, temp);
933 AF = (AF & ~0xfe) | (temp & 0xa8) |
934 (((temp & 0xff) == 0) << 6) |
935 (((temp & 0xf) == 0) << 4) |
936 ((temp == 0x80) << 2);
937 break;
938 case 0x2D: /* DEC L */
939 temp = lreg(HL)-1;
940 Setlreg(HL, temp);
941 AF = (AF & ~0xfe) | (temp & 0xa8) |
942 (((temp & 0xff) == 0) << 6) |
943 (((temp & 0xf) == 0xf) << 4) |
944 ((temp == 0x7f) << 2) | 2;
945 break;
946 case 0x2E: /* LD L,nn */
947 Setlreg(HL, GetBYTE(PC)); ++PC;
948 break;
949 case 0x2F: /* CPL */
950 AF = (~AF & ~0xff) | (AF & 0xc5) | ((~AF >> 8) & 0x28) | 0x12;
951 break;
952 case 0x30: /* JR NC,dd */
953 PC += (!TSTFLAG(C)) ? (signed char) GetBYTE(PC) + 1 : 1;
954 break;
955 case 0x31: /* LD SP,nnnn */
956 SP = GetWORD(PC);
957 PC += 2;
958 break;
959 case 0x32: /* LD (nnnn),A */
960 temp = GetWORD(PC);
961 PutBYTE(temp, hreg(AF));
962 PC += 2;
963 break;
964 case 0x33: /* INC SP */
965 ++SP;
966 break;
967 case 0x34: /* INC (HL) */
968 temp = GetBYTE(HL)+1;
969 PutBYTE(HL, temp);
970 AF = (AF & ~0xfe) | (temp & 0xa8) |
971 (((temp & 0xff) == 0) << 6) |
972 (((temp & 0xf) == 0) << 4) |
973 ((temp == 0x80) << 2);
974 break;
975 case 0x35: /* DEC (HL) */
976 temp = GetBYTE(HL)-1;
977 PutBYTE(HL, temp);
978 AF = (AF & ~0xfe) | (temp & 0xa8) |
979 (((temp & 0xff) == 0) << 6) |
980 (((temp & 0xf) == 0xf) << 4) |
981 ((temp == 0x7f) << 2) | 2;
982 break;
983 case 0x36: /* LD (HL),nn */
984 PutBYTE(HL, GetBYTE(PC)); ++PC;
985 break;
986 case 0x37: /* SCF */
987 AF = (AF&~0x3b)|((AF>>8)&0x28)|1;
988 break;
989 case 0x38: /* JR C,dd */
990 PC += (TSTFLAG(C)) ? (signed char) GetBYTE(PC) + 1 : 1;
991 break;
992 case 0x39: /* ADD HL,SP */
993 HL &= 0xffff;
994 SP &= 0xffff;
995 sum = HL + SP;
996 cbits = (HL ^ SP ^ sum) >> 8;
997 HL = sum;
998 AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) |
999 (cbits & 0x10) | ((cbits >> 8) & 1);
1000 break;
1001 case 0x3A: /* LD A,(nnnn) */
1002 temp = GetWORD(PC);
1003 Sethreg(AF, GetBYTE(temp));
1004 PC += 2;
1005 break;
1006 case 0x3B: /* DEC SP */
1007 --SP;
1008 break;
1009 case 0x3C: /* INC A */
1010 AF += 0x100;
1011 temp = hreg(AF);
1012 AF = (AF & ~0xfe) | (temp & 0xa8) |
1013 (((temp & 0xff) == 0) << 6) |
1014 (((temp & 0xf) == 0) << 4) |
1015 ((temp == 0x80) << 2);
1016 break;
1017 case 0x3D: /* DEC A */
1018 AF -= 0x100;
1019 temp = hreg(AF);
1020 AF = (AF & ~0xfe) | (temp & 0xa8) |
1021 (((temp & 0xff) == 0) << 6) |
1022 (((temp & 0xf) == 0xf) << 4) |
1023 ((temp == 0x7f) << 2) | 2;
1024 break;
1025 case 0x3E: /* LD A,nn */
1026 Sethreg(AF, GetBYTE(PC)); ++PC;
1027 break;
1028 case 0x3F: /* CCF */
1029 AF = (AF&~0x3b)|((AF>>8)&0x28)|((AF&1)<<4)|(~AF&1);
1030 break;
1031 case 0x40: /* LD B,B */
1032 /* nop */
1033 break;
1034 case 0x41: /* LD B,C */
1035 BC = (BC & 255) | ((BC & 255) << 8);
1036 break;
1037 case 0x42: /* LD B,D */
1038 BC = (BC & 255) | (DE & ~255);
1039 break;
1040 case 0x43: /* LD B,E */
1041 BC = (BC & 255) | ((DE & 255) << 8);
1042 break;
1043 case 0x44: /* LD B,H */
1044 BC = (BC & 255) | (HL & ~255);
1045 break;
1046 case 0x45: /* LD B,L */
1047 BC = (BC & 255) | ((HL & 255) << 8);
1048 break;
1049 case 0x46: /* LD B,(HL) */
1050 Sethreg(BC, GetBYTE(HL));
1051 break;
1052 case 0x47: /* LD B,A */
1053 BC = (BC & 255) | (AF & ~255);
1054 break;
1055 case 0x48: /* LD C,B */
1056 BC = (BC & ~255) | ((BC >> 8) & 255);
1057 break;
1058 case 0x49: /* LD C,C */
1059 /* nop */
1060 break;
1061 case 0x4A: /* LD C,D */
1062 BC = (BC & ~255) | ((DE >> 8) & 255);
1063 break;
1064 case 0x4B: /* LD C,E */
1065 BC = (BC & ~255) | (DE & 255);
1066 break;
1067 case 0x4C: /* LD C,H */
1068 BC = (BC & ~255) | ((HL >> 8) & 255);
1069 break;
1070 case 0x4D: /* LD C,L */
1071 BC = (BC & ~255) | (HL & 255);
1072 break;
1073 case 0x4E: /* LD C,(HL) */
1074 Setlreg(BC, GetBYTE(HL));
1075 break;
1076 case 0x4F: /* LD C,A */
1077 BC = (BC & ~255) | ((AF >> 8) & 255);
1078 break;
1079 case 0x50: /* LD D,B */
1080 DE = (DE & 255) | (BC & ~255);
1081 break;
1082 case 0x51: /* LD D,C */
1083 DE = (DE & 255) | ((BC & 255) << 8);
1084 break;
1085 case 0x52: /* LD D,D */
1086 /* nop */
1087 break;
1088 case 0x53: /* LD D,E */
1089 DE = (DE & 255) | ((DE & 255) << 8);
1090 break;
1091 case 0x54: /* LD D,H */
1092 DE = (DE & 255) | (HL & ~255);
1093 break;
1094 case 0x55: /* LD D,L */
1095 DE = (DE & 255) | ((HL & 255) << 8);
1096 break;
1097 case 0x56: /* LD D,(HL) */
1098 Sethreg(DE, GetBYTE(HL));
1099 break;
1100 case 0x57: /* LD D,A */
1101 DE = (DE & 255) | (AF & ~255);
1102 break;
1103 case 0x58: /* LD E,B */
1104 DE = (DE & ~255) | ((BC >> 8) & 255);
1105 break;
1106 case 0x59: /* LD E,C */
1107 DE = (DE & ~255) | (BC & 255);
1108 break;
1109 case 0x5A: /* LD E,D */
1110 DE = (DE & ~255) | ((DE >> 8) & 255);
1111 break;
1112 case 0x5B: /* LD E,E */
1113 /* nop */
1114 break;
1115 case 0x5C: /* LD E,H */
1116 DE = (DE & ~255) | ((HL >> 8) & 255);
1117 break;
1118 case 0x5D: /* LD E,L */
1119 DE = (DE & ~255) | (HL & 255);
1120 break;
1121 case 0x5E: /* LD E,(HL) */
1122 Setlreg(DE, GetBYTE(HL));
1123 break;
1124 case 0x5F: /* LD E,A */
1125 DE = (DE & ~255) | ((AF >> 8) & 255);
1126 break;
1127 case 0x60: /* LD H,B */
1128 HL = (HL & 255) | (BC & ~255);
1129 break;
1130 case 0x61: /* LD H,C */
1131 HL = (HL & 255) | ((BC & 255) << 8);
1132 break;
1133 case 0x62: /* LD H,D */
1134 HL = (HL & 255) | (DE & ~255);
1135 break;
1136 case 0x63: /* LD H,E */
1137 HL = (HL & 255) | ((DE & 255) << 8);
1138 break;
1139 case 0x64: /* LD H,H */
1140 /* nop */
1141 break;
1142 case 0x65: /* LD H,L */
1143 HL = (HL & 255) | ((HL & 255) << 8);
1144 break;
1145 case 0x66: /* LD H,(HL) */
1146 Sethreg(HL, GetBYTE(HL));
1147 break;
1148 case 0x67: /* LD H,A */
1149 HL = (HL & 255) | (AF & ~255);
1150 break;
1151 case 0x68: /* LD L,B */
1152 HL = (HL & ~255) | ((BC >> 8) & 255);
1153 break;
1154 case 0x69: /* LD L,C */
1155 HL = (HL & ~255) | (BC & 255);
1156 break;
1157 case 0x6A: /* LD L,D */
1158 HL = (HL & ~255) | ((DE >> 8) & 255);
1159 break;
1160 case 0x6B: /* LD L,E */
1161 HL = (HL & ~255) | (DE & 255);
1162 break;
1163 case 0x6C: /* LD L,H */
1164 HL = (HL & ~255) | ((HL >> 8) & 255);
1165 break;
1166 case 0x6D: /* LD L,L */
1167 /* nop */
1168 break;
1169 case 0x6E: /* LD L,(HL) */
1170 Setlreg(HL, GetBYTE(HL));
1171 break;
1172 case 0x6F: /* LD L,A */
1173 HL = (HL & ~255) | ((AF >> 8) & 255);
1174 break;
1175 case 0x70: /* LD (HL),B */
1176 PutBYTE(HL, hreg(BC));
1177 break;
1178 case 0x71: /* LD (HL),C */
1179 PutBYTE(HL, lreg(BC));
1180 break;
1181 case 0x72: /* LD (HL),D */
1182 PutBYTE(HL, hreg(DE));
1183 break;
1184 case 0x73: /* LD (HL),E */
1185 PutBYTE(HL, lreg(DE));
1186 break;
1187 case 0x74: /* LD (HL),H */
1188 PutBYTE(HL, hreg(HL));
1189 break;
1190 case 0x75: /* LD (HL),L */
1191 PutBYTE(HL, lreg(HL));
1192 break;
1193 case 0x76: /* HALT */
1194 SAVE_STATE();
1195 return PC&0xffff;
1196 case 0x77: /* LD (HL),A */
1197 PutBYTE(HL, hreg(AF));
1198 break;
1199 case 0x78: /* LD A,B */
1200 AF = (AF & 255) | (BC & ~255);
1201 break;
1202 case 0x79: /* LD A,C */
1203 AF = (AF & 255) | ((BC & 255) << 8);
1204 break;
1205 case 0x7A: /* LD A,D */
1206 AF = (AF & 255) | (DE & ~255);
1207 break;
1208 case 0x7B: /* LD A,E */
1209 AF = (AF & 255) | ((DE & 255) << 8);
1210 break;
1211 case 0x7C: /* LD A,H */
1212 AF = (AF & 255) | (HL & ~255);
1213 break;
1214 case 0x7D: /* LD A,L */
1215 AF = (AF & 255) | ((HL & 255) << 8);
1216 break;
1217 case 0x7E: /* LD A,(HL) */
1218 Sethreg(AF, GetBYTE(HL));
1219 break;
1220 case 0x7F: /* LD A,A */
1221 /* nop */
1222 break;
1223 case 0x80: /* ADD A,B */
1224 temp = hreg(BC);
1225 acu = hreg(AF);
1226 sum = acu + temp;
1227 cbits = acu ^ temp ^ sum;
1228 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1229 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1230 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1231 ((cbits >> 8) & 1);
1232 break;
1233 case 0x81: /* ADD A,C */
1234 temp = lreg(BC);
1235 acu = hreg(AF);
1236 sum = acu + temp;
1237 cbits = acu ^ temp ^ sum;
1238 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1239 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1240 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1241 ((cbits >> 8) & 1);
1242 break;
1243 case 0x82: /* ADD A,D */
1244 temp = hreg(DE);
1245 acu = hreg(AF);
1246 sum = acu + temp;
1247 cbits = acu ^ temp ^ sum;
1248 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1249 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1250 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1251 ((cbits >> 8) & 1);
1252 break;
1253 case 0x83: /* ADD A,E */
1254 temp = lreg(DE);
1255 acu = hreg(AF);
1256 sum = acu + temp;
1257 cbits = acu ^ temp ^ sum;
1258 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1259 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1260 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1261 ((cbits >> 8) & 1);
1262 break;
1263 case 0x84: /* ADD A,H */
1264 temp = hreg(HL);
1265 acu = hreg(AF);
1266 sum = acu + temp;
1267 cbits = acu ^ temp ^ sum;
1268 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1269 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1270 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1271 ((cbits >> 8) & 1);
1272 break;
1273 case 0x85: /* ADD A,L */
1274 temp = lreg(HL);
1275 acu = hreg(AF);
1276 sum = acu + temp;
1277 cbits = acu ^ temp ^ sum;
1278 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1279 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1280 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1281 ((cbits >> 8) & 1);
1282 break;
1283 case 0x86: /* ADD A,(HL) */
1284 temp = GetBYTE(HL);
1285 acu = hreg(AF);
1286 sum = acu + temp;
1287 cbits = acu ^ temp ^ sum;
1288 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1289 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1290 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1291 ((cbits >> 8) & 1);
1292 break;
1293 case 0x87: /* ADD A,A */
1294 temp = hreg(AF);
1295 acu = hreg(AF);
1296 sum = acu + temp;
1297 cbits = acu ^ temp ^ sum;
1298 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1299 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1300 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1301 ((cbits >> 8) & 1);
1302 break;
1303 case 0x88: /* ADC A,B */
1304 temp = hreg(BC);
1305 acu = hreg(AF);
1306 sum = acu + temp + TSTFLAG(C);
1307 cbits = acu ^ temp ^ sum;
1308 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1309 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1310 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1311 ((cbits >> 8) & 1);
1312 break;
1313 case 0x89: /* ADC A,C */
1314 temp = lreg(BC);
1315 acu = hreg(AF);
1316 sum = acu + temp + TSTFLAG(C);
1317 cbits = acu ^ temp ^ sum;
1318 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1319 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1320 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1321 ((cbits >> 8) & 1);
1322 break;
1323 case 0x8A: /* ADC A,D */
1324 temp = hreg(DE);
1325 acu = hreg(AF);
1326 sum = acu + temp + TSTFLAG(C);
1327 cbits = acu ^ temp ^ sum;
1328 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1329 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1330 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1331 ((cbits >> 8) & 1);
1332 break;
1333 case 0x8B: /* ADC A,E */
1334 temp = lreg(DE);
1335 acu = hreg(AF);
1336 sum = acu + temp + TSTFLAG(C);
1337 cbits = acu ^ temp ^ sum;
1338 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1339 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1340 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1341 ((cbits >> 8) & 1);
1342 break;
1343 case 0x8C: /* ADC A,H */
1344 temp = hreg(HL);
1345 acu = hreg(AF);
1346 sum = acu + temp + TSTFLAG(C);
1347 cbits = acu ^ temp ^ sum;
1348 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1349 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1350 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1351 ((cbits >> 8) & 1);
1352 break;
1353 case 0x8D: /* ADC A,L */
1354 temp = lreg(HL);
1355 acu = hreg(AF);
1356 sum = acu + temp + TSTFLAG(C);
1357 cbits = acu ^ temp ^ sum;
1358 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1359 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1360 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1361 ((cbits >> 8) & 1);
1362 break;
1363 case 0x8E: /* ADC A,(HL) */
1364 temp = GetBYTE(HL);
1365 acu = hreg(AF);
1366 sum = acu + temp + TSTFLAG(C);
1367 cbits = acu ^ temp ^ sum;
1368 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1369 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1370 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1371 ((cbits >> 8) & 1);
1372 break;
1373 case 0x8F: /* ADC A,A */
1374 temp = hreg(AF);
1375 acu = hreg(AF);
1376 sum = acu + temp + TSTFLAG(C);
1377 cbits = acu ^ temp ^ sum;
1378 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1379 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1380 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1381 ((cbits >> 8) & 1);
1382 break;
1383 case 0x90: /* SUB B */
1384 temp = hreg(BC);
1385 acu = hreg(AF);
1386 sum = acu - temp;
1387 cbits = acu ^ temp ^ sum;
1388 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1389 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1390 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1391 ((cbits >> 8) & 1);
1392 break;
1393 case 0x91: /* SUB C */
1394 temp = lreg(BC);
1395 acu = hreg(AF);
1396 sum = acu - temp;
1397 cbits = acu ^ temp ^ sum;
1398 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1399 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1400 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1401 ((cbits >> 8) & 1);
1402 break;
1403 case 0x92: /* SUB D */
1404 temp = hreg(DE);
1405 acu = hreg(AF);
1406 sum = acu - temp;
1407 cbits = acu ^ temp ^ sum;
1408 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1409 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1410 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1411 ((cbits >> 8) & 1);
1412 break;
1413 case 0x93: /* SUB E */
1414 temp = lreg(DE);
1415 acu = hreg(AF);
1416 sum = acu - temp;
1417 cbits = acu ^ temp ^ sum;
1418 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1419 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1420 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1421 ((cbits >> 8) & 1);
1422 break;
1423 case 0x94: /* SUB H */
1424 temp = hreg(HL);
1425 acu = hreg(AF);
1426 sum = acu - temp;
1427 cbits = acu ^ temp ^ sum;
1428 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1429 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1430 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1431 ((cbits >> 8) & 1);
1432 break;
1433 case 0x95: /* SUB L */
1434 temp = lreg(HL);
1435 acu = hreg(AF);
1436 sum = acu - temp;
1437 cbits = acu ^ temp ^ sum;
1438 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1439 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1440 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1441 ((cbits >> 8) & 1);
1442 break;
1443 case 0x96: /* SUB (HL) */
1444 temp = GetBYTE(HL);
1445 acu = hreg(AF);
1446 sum = acu - temp;
1447 cbits = acu ^ temp ^ sum;
1448 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1449 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1450 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1451 ((cbits >> 8) & 1);
1452 break;
1453 case 0x97: /* SUB A */
1454 temp = hreg(AF);
1455 acu = hreg(AF);
1456 sum = acu - temp;
1457 cbits = acu ^ temp ^ sum;
1458 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1459 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1460 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1461 ((cbits >> 8) & 1);
1462 break;
1463 case 0x98: /* SBC A,B */
1464 temp = hreg(BC);
1465 acu = hreg(AF);
1466 sum = acu - temp - TSTFLAG(C);
1467 cbits = acu ^ temp ^ sum;
1468 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1469 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1470 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1471 ((cbits >> 8) & 1);
1472 break;
1473 case 0x99: /* SBC A,C */
1474 temp = lreg(BC);
1475 acu = hreg(AF);
1476 sum = acu - temp - TSTFLAG(C);
1477 cbits = acu ^ temp ^ sum;
1478 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1479 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1480 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1481 ((cbits >> 8) & 1);
1482 break;
1483 case 0x9A: /* SBC A,D */
1484 temp = hreg(DE);
1485 acu = hreg(AF);
1486 sum = acu - temp - TSTFLAG(C);
1487 cbits = acu ^ temp ^ sum;
1488 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1489 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1490 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1491 ((cbits >> 8) & 1);
1492 break;
1493 case 0x9B: /* SBC A,E */
1494 temp = lreg(DE);
1495 acu = hreg(AF);
1496 sum = acu - temp - TSTFLAG(C);
1497 cbits = acu ^ temp ^ sum;
1498 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1499 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1500 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1501 ((cbits >> 8) & 1);
1502 break;
1503 case 0x9C: /* SBC A,H */
1504 temp = hreg(HL);
1505 acu = hreg(AF);
1506 sum = acu - temp - TSTFLAG(C);
1507 cbits = acu ^ temp ^ sum;
1508 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1509 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1510 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1511 ((cbits >> 8) & 1);
1512 break;
1513 case 0x9D: /* SBC A,L */
1514 temp = lreg(HL);
1515 acu = hreg(AF);
1516 sum = acu - temp - TSTFLAG(C);
1517 cbits = acu ^ temp ^ sum;
1518 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1519 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1520 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1521 ((cbits >> 8) & 1);
1522 break;
1523 case 0x9E: /* SBC A,(HL) */
1524 temp = GetBYTE(HL);
1525 acu = hreg(AF);
1526 sum = acu - temp - TSTFLAG(C);
1527 cbits = acu ^ temp ^ sum;
1528 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1529 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1530 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1531 ((cbits >> 8) & 1);
1532 break;
1533 case 0x9F: /* SBC A,A */
1534 temp = hreg(AF);
1535 acu = hreg(AF);
1536 sum = acu - temp - TSTFLAG(C);
1537 cbits = acu ^ temp ^ sum;
1538 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1539 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1540 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1541 ((cbits >> 8) & 1);
1542 break;
1543 case 0xA0: /* AND B */
1544 sum = ((AF & (BC)) >> 8) & 0xff;
1545 AF = (sum << 8) | (sum & 0xa8) |
1546 ((sum == 0) << 6) | 0x10 | partab[sum];
1547 break;
1548 case 0xA1: /* AND C */
1549 sum = ((AF >> 8) & BC) & 0xff;
1550 AF = (sum << 8) | (sum & 0xa8) | 0x10 |
1551 ((sum == 0) << 6) | partab[sum];
1552 break;
1553 case 0xA2: /* AND D */
1554 sum = ((AF & (DE)) >> 8) & 0xff;
1555 AF = (sum << 8) | (sum & 0xa8) |
1556 ((sum == 0) << 6) | 0x10 | partab[sum];
1557 break;
1558 case 0xA3: /* AND E */
1559 sum = ((AF >> 8) & DE) & 0xff;
1560 AF = (sum << 8) | (sum & 0xa8) | 0x10 |
1561 ((sum == 0) << 6) | partab[sum];
1562 break;
1563 case 0xA4: /* AND H */
1564 sum = ((AF & (HL)) >> 8) & 0xff;
1565 AF = (sum << 8) | (sum & 0xa8) |
1566 ((sum == 0) << 6) | 0x10 | partab[sum];
1567 break;
1568 case 0xA5: /* AND L */
1569 sum = ((AF >> 8) & HL) & 0xff;
1570 AF = (sum << 8) | (sum & 0xa8) | 0x10 |
1571 ((sum == 0) << 6) | partab[sum];
1572 break;
1573 case 0xA6: /* AND (HL) */
1574 sum = ((AF >> 8) & GetBYTE(HL)) & 0xff;
1575 AF = (sum << 8) | (sum & 0xa8) | 0x10 |
1576 ((sum == 0) << 6) | partab[sum];
1577 break;
1578 case 0xA7: /* AND A */
1579 sum = ((AF & (AF)) >> 8) & 0xff;
1580 AF = (sum << 8) | (sum & 0xa8) |
1581 ((sum == 0) << 6) | 0x10 | partab[sum];
1582 break;
1583 case 0xA8: /* XOR B */
1584 sum = ((AF ^ (BC)) >> 8) & 0xff;
1585 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1586 break;
1587 case 0xA9: /* XOR C */
1588 sum = ((AF >> 8) ^ BC) & 0xff;
1589 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1590 break;
1591 case 0xAA: /* XOR D */
1592 sum = ((AF ^ (DE)) >> 8) & 0xff;
1593 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1594 break;
1595 case 0xAB: /* XOR E */
1596 sum = ((AF >> 8) ^ DE) & 0xff;
1597 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1598 break;
1599 case 0xAC: /* XOR H */
1600 sum = ((AF ^ (HL)) >> 8) & 0xff;
1601 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1602 break;
1603 case 0xAD: /* XOR L */
1604 sum = ((AF >> 8) ^ HL) & 0xff;
1605 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1606 break;
1607 case 0xAE: /* XOR (HL) */
1608 sum = ((AF >> 8) ^ GetBYTE(HL)) & 0xff;
1609 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1610 break;
1611 case 0xAF: /* XOR A */
1612 sum = ((AF ^ (AF)) >> 8) & 0xff;
1613 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1614 break;
1615 case 0xB0: /* OR B */
1616 sum = ((AF | (BC)) >> 8) & 0xff;
1617 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1618 break;
1619 case 0xB1: /* OR C */
1620 sum = ((AF >> 8) | BC) & 0xff;
1621 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1622 break;
1623 case 0xB2: /* OR D */
1624 sum = ((AF | (DE)) >> 8) & 0xff;
1625 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1626 break;
1627 case 0xB3: /* OR E */
1628 sum = ((AF >> 8) | DE) & 0xff;
1629 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1630 break;
1631 case 0xB4: /* OR H */
1632 sum = ((AF | (HL)) >> 8) & 0xff;
1633 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1634 break;
1635 case 0xB5: /* OR L */
1636 sum = ((AF >> 8) | HL) & 0xff;
1637 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1638 break;
1639 case 0xB6: /* OR (HL) */
1640 sum = ((AF >> 8) | GetBYTE(HL)) & 0xff;
1641 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1642 break;
1643 case 0xB7: /* OR A */
1644 sum = ((AF | (AF)) >> 8) & 0xff;
1645 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1646 break;
1647 case 0xB8: /* CP B */
1648 temp = hreg(BC);
1649 AF = (AF & ~0x28) | (temp & 0x28);
1650 acu = hreg(AF);
1651 sum = acu - temp;
1652 cbits = acu ^ temp ^ sum;
1653 AF = (AF & ~0xff) | (sum & 0x80) |
1654 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
1655 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1656 (cbits & 0x10) | ((cbits >> 8) & 1);
1657 break;
1658 case 0xB9: /* CP C */
1659 temp = lreg(BC);
1660 AF = (AF & ~0x28) | (temp & 0x28);
1661 acu = hreg(AF);
1662 sum = acu - temp;
1663 cbits = acu ^ temp ^ sum;
1664 AF = (AF & ~0xff) | (sum & 0x80) |
1665 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
1666 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1667 (cbits & 0x10) | ((cbits >> 8) & 1);
1668 break;
1669 case 0xBA: /* CP D */
1670 temp = hreg(DE);
1671 AF = (AF & ~0x28) | (temp & 0x28);
1672 acu = hreg(AF);
1673 sum = acu - temp;
1674 cbits = acu ^ temp ^ sum;
1675 AF = (AF & ~0xff) | (sum & 0x80) |
1676 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
1677 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1678 (cbits & 0x10) | ((cbits >> 8) & 1);
1679 break;
1680 case 0xBB: /* CP E */
1681 temp = lreg(DE);
1682 AF = (AF & ~0x28) | (temp & 0x28);
1683 acu = hreg(AF);
1684 sum = acu - temp;
1685 cbits = acu ^ temp ^ sum;
1686 AF = (AF & ~0xff) | (sum & 0x80) |
1687 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
1688 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1689 (cbits & 0x10) | ((cbits >> 8) & 1);
1690 break;
1691 case 0xBC: /* CP H */
1692 temp = hreg(HL);
1693 AF = (AF & ~0x28) | (temp & 0x28);
1694 acu = hreg(AF);
1695 sum = acu - temp;
1696 cbits = acu ^ temp ^ sum;
1697 AF = (AF & ~0xff) | (sum & 0x80) |
1698 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
1699 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1700 (cbits & 0x10) | ((cbits >> 8) & 1);
1701 break;
1702 case 0xBD: /* CP L */
1703 temp = lreg(HL);
1704 AF = (AF & ~0x28) | (temp & 0x28);
1705 acu = hreg(AF);
1706 sum = acu - temp;
1707 cbits = acu ^ temp ^ sum;
1708 AF = (AF & ~0xff) | (sum & 0x80) |
1709 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
1710 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1711 (cbits & 0x10) | ((cbits >> 8) & 1);
1712 break;
1713 case 0xBE: /* CP (HL) */
1714 temp = GetBYTE(HL);
1715 AF = (AF & ~0x28) | (temp & 0x28);
1716 acu = hreg(AF);
1717 sum = acu - temp;
1718 cbits = acu ^ temp ^ sum;
1719 AF = (AF & ~0xff) | (sum & 0x80) |
1720 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
1721 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1722 (cbits & 0x10) | ((cbits >> 8) & 1);
1723 break;
1724 case 0xBF: /* CP A */
1725 temp = hreg(AF);
1726 AF = (AF & ~0x28) | (temp & 0x28);
1727 acu = hreg(AF);
1728 sum = acu - temp;
1729 cbits = acu ^ temp ^ sum;
1730 AF = (AF & ~0xff) | (sum & 0x80) |
1731 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
1732 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1733 (cbits & 0x10) | ((cbits >> 8) & 1);
1734 break;
1735 case 0xC0: /* RET NZ */
1736 if (!TSTFLAG(Z)) POP(PC);
1737 break;
1738 case 0xC1: /* POP BC */
1739 POP(BC);
1740 break;
1741 case 0xC2: /* JP NZ,nnnn */
1742 JPC(!TSTFLAG(Z));
1743 break;
1744 case 0xC3: /* JP nnnn */
1745 JPC(1);
1746 break;
1747 case 0xC4: /* CALL NZ,nnnn */
1748 CALLC(!TSTFLAG(Z));
1749 break;
1750 case 0xC5: /* PUSH BC */
1751 PUSH(BC);
1752 break;
1753 case 0xC6: /* ADD A,nn */
1754 temp = GetBYTE(PC);
1755 acu = hreg(AF);
1756 sum = acu + temp;
1757 cbits = acu ^ temp ^ sum;
1758 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1759 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1760 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1761 ((cbits >> 8) & 1);
1762 ++PC;
1763 break;
1764 case 0xC7: /* RST 0 */
1765 PUSH(PC); PC = 0;
1766 break;
1767 case 0xC8: /* RET Z */
1768 if (TSTFLAG(Z)) POP(PC);
1769 break;
1770 case 0xC9: /* RET */
1771 POP(PC);
1772 break;
1773 case 0xCA: /* JP Z,nnnn */
1774 JPC(TSTFLAG(Z));
1775 break;
1776 case 0xCB: /* CB prefix */
1777 SAVE_STATE();
1778 cb_prefix(HL);
1779 LOAD_STATE();
1780 break;
1781 case 0xCC: /* CALL Z,nnnn */
1782 CALLC(TSTFLAG(Z));
1783 break;
1784 case 0xCD: /* CALL nnnn */
1785 CALLC(1);
1786 break;
1787 case 0xCE: /* ADC A,nn */
1788 temp = GetBYTE(PC);
1789 acu = hreg(AF);
1790 sum = acu + temp + TSTFLAG(C);
1791 cbits = acu ^ temp ^ sum;
1792 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1793 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1794 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1795 ((cbits >> 8) & 1);
1796 ++PC;
1797 break;
1798 case 0xCF: /* RST 8 */
1799 PUSH(PC); PC = 8;
1800 break;
1801 case 0xD0: /* RET NC */
1802 if (!TSTFLAG(C)) POP(PC);
1803 break;
1804 case 0xD1: /* POP DE */
1805 POP(DE);
1806 break;
1807 case 0xD2: /* JP NC,nnnn */
1808 JPC(!TSTFLAG(C));
1809 break;
1810 case 0xD3: /* OUT (nn),A */
1811 Output(GetBYTE(PC), hreg(AF)); ++PC;
1812 break;
1813 case 0xD4: /* CALL NC,nnnn */
1814 CALLC(!TSTFLAG(C));
1815 break;
1816 case 0xD5: /* PUSH DE */
1817 PUSH(DE);
1818 break;
1819 case 0xD6: /* SUB nn */
1820 temp = GetBYTE(PC);
1821 acu = hreg(AF);
1822 sum = acu - temp;
1823 cbits = acu ^ temp ^ sum;
1824 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1825 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1826 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1827 ((cbits >> 8) & 1);
1828 ++PC;
1829 break;
1830 case 0xD7: /* RST 10H */
1831 PUSH(PC); PC = 0x10;
1832 break;
1833 case 0xD8: /* RET C */
1834 if (TSTFLAG(C)) POP(PC);
1835 break;
1836 case 0xD9: /* EXX */
1837 regs[regs_sel].bc = BC;
1838 regs[regs_sel].de = DE;
1839 regs[regs_sel].hl = HL;
1840 regs_sel = 1 - regs_sel;
1841 BC = regs[regs_sel].bc;
1842 DE = regs[regs_sel].de;
1843 HL = regs[regs_sel].hl;
1844 break;
1845 case 0xDA: /* JP C,nnnn */
1846 JPC(TSTFLAG(C));
1847 break;
1848 case 0xDB: /* IN A,(nn) */
1849 Sethreg(AF, Input(GetBYTE(PC))); ++PC;
1850 break;
1851 case 0xDC: /* CALL C,nnnn */
1852 CALLC(TSTFLAG(C));
1853 break;
1854 case 0xDD: /* DD prefix */
1855 SAVE_STATE();
1856 ix = dfd_prefix(ix);
1857 LOAD_STATE();
1858 break;
1859 case 0xDE: /* SBC A,nn */
1860 temp = GetBYTE(PC);
1861 acu = hreg(AF);
1862 sum = acu - temp - TSTFLAG(C);
1863 cbits = acu ^ temp ^ sum;
1864 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1865 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1866 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1867 ((cbits >> 8) & 1);
1868 ++PC;
1869 break;
1870 case 0xDF: /* RST 18H */
1871 PUSH(PC); PC = 0x18;
1872 break;
1873 case 0xE0: /* RET PO */
1874 if (!TSTFLAG(P)) POP(PC);
1875 break;
1876 case 0xE1: /* POP HL */
1877 POP(HL);
1878 break;
1879 case 0xE2: /* JP PO,nnnn */
1880 JPC(!TSTFLAG(P));
1881 break;
1882 case 0xE3: /* EX (SP),HL */
1883 temp = HL; POP(HL); PUSH(temp);
1884 break;
1885 case 0xE4: /* CALL PO,nnnn */
1886 CALLC(!TSTFLAG(P));
1887 break;
1888 case 0xE5: /* PUSH HL */
1889 PUSH(HL);
1890 break;
1891 case 0xE6: /* AND nn */
1892 sum = ((AF >> 8) & GetBYTE(PC)) & 0xff;
1893 AF = (sum << 8) | (sum & 0xa8) | 0x10 |
1894 ((sum == 0) << 6) | partab[sum];
1895 ++PC;
1896 break;
1897 case 0xE7: /* RST 20H */
1898 PUSH(PC); PC = 0x20;
1899 break;
1900 case 0xE8: /* RET PE */
1901 if (TSTFLAG(P)) POP(PC);
1902 break;
1903 case 0xE9: /* JP (HL) */
1904 PC = HL;
1905 break;
1906 case 0xEA: /* JP PE,nnnn */
1907 JPC(TSTFLAG(P));
1908 break;
1909 case 0xEB: /* EX DE,HL */
1910 temp = HL; HL = DE; DE = temp;
1911 break;
1912 case 0xEC: /* CALL PE,nnnn */
1913 CALLC(TSTFLAG(P));
1914 break;
1915 case 0xED: /* ED prefix */
1916 switch (++PC, op = GetBYTE(PC-1)) {
1917 case 0x40: /* IN B,(C) */
1918 temp = Input(lreg(BC));
1919 Sethreg(BC, temp);
1920 AF = (AF & ~0xfe) | (temp & 0xa8) |
1921 (((temp & 0xff) == 0) << 6) |
1922 parity(temp);
1923 break;
1924 case 0x41: /* OUT (C),B */
1925 Output(lreg(BC), BC);
1926 break;
1927 case 0x42: /* SBC HL,BC */
1928 HL &= 0xffff;
1929 BC &= 0xffff;
1930 sum = HL - BC - TSTFLAG(C);
1931 cbits = (HL ^ BC ^ sum) >> 8;
1932 HL = sum;
1933 AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) |
1934 (((sum & 0xffff) == 0) << 6) |
1935 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1936 (cbits & 0x10) | 2 | ((cbits >> 8) & 1);
1937 break;
1938 case 0x43: /* LD (nnnn),BC */
1939 temp = GetWORD(PC);
1940 PutWORD(temp, BC);
1941 PC += 2;
1942 break;
1943 case 0x44: /* NEG */
1944 temp = hreg(AF);
1945 AF = (-(AF & 0xff00) & 0xff00);
1946 AF |= ((AF >> 8) & 0xa8) | (((AF & 0xff00) == 0) << 6) |
1947 (((temp & 0x0f) != 0) << 4) | ((temp == 0x80) << 2) |
1948 2 | (temp != 0);
1949 break;
1950 case 0x45: /* RETN */
1951 IFF |= IFF >> 1;
1952 POP(PC);
1953 break;
1954 case 0x46: /* IM 0 */
1955 /* interrupt mode 0 */
1956 break;
1957 case 0x47: /* LD I,A */
1958 ir = (ir & 255) | (AF & ~255);
1959 break;
1960 case 0x48: /* IN C,(C) */
1961 temp = Input(lreg(BC));
1962 Setlreg(BC, temp);
1963 AF = (AF & ~0xfe) | (temp & 0xa8) |
1964 (((temp & 0xff) == 0) << 6) |
1965 parity(temp);
1966 break;
1967 case 0x49: /* OUT (C),C */
1968 Output(lreg(BC), BC);
1969 break;
1970 case 0x4A: /* ADC HL,BC */
1971 HL &= 0xffff;
1972 BC &= 0xffff;
1973 sum = HL + BC + TSTFLAG(C);
1974 cbits = (HL ^ BC ^ sum) >> 8;
1975 HL = sum;
1976 AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) |
1977 (((sum & 0xffff) == 0) << 6) |
1978 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1979 (cbits & 0x10) | ((cbits >> 8) & 1);
1980 break;
1981 case 0x4B: /* LD BC,(nnnn) */
1982 temp = GetWORD(PC);
1983 BC = GetWORD(temp);
1984 PC += 2;
1985 break;
1986 case 0x4D: /* RETI */
1987 IFF |= IFF >> 1;
1988 POP(PC);
1989 break;
1990 case 0x4F: /* LD R,A */
1991 ir = (ir & ~255) | ((AF >> 8) & 255);
1992 break;
1993 case 0x50: /* IN D,(C) */
1994 temp = Input(lreg(BC));
1995 Sethreg(DE, temp);
1996 AF = (AF & ~0xfe) | (temp & 0xa8) |
1997 (((temp & 0xff) == 0) << 6) |
1998 parity(temp);
1999 break;
2000 case 0x51: /* OUT (C),D */
2001 Output(lreg(BC), DE);
2002 break;
2003 case 0x52: /* SBC HL,DE */
2004 HL &= 0xffff;
2005 DE &= 0xffff;
2006 sum = HL - DE - TSTFLAG(C);
2007 cbits = (HL ^ DE ^ sum) >> 8;
2008 HL = sum;
2009 AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) |
2010 (((sum & 0xffff) == 0) << 6) |
2011 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
2012 (cbits & 0x10) | 2 | ((cbits >> 8) & 1);
2013 break;
2014 case 0x53: /* LD (nnnn),DE */
2015 temp = GetWORD(PC);
2016 PutWORD(temp, DE);
2017 PC += 2;
2018 break;
2019 case 0x56: /* IM 1 */
2020 /* interrupt mode 1 */
2021 break;
2022 case 0x57: /* LD A,I */
2023 AF = (AF & 0x29) | (ir & ~255) | ((ir >> 8) & 0x80) | (((ir & ~255) == 0) << 6) | ((IFF & 2) << 1);
2024 break;
2025 case 0x58: /* IN E,(C) */
2026 temp = Input(lreg(BC));
2027 Setlreg(DE, temp);
2028 AF = (AF & ~0xfe) | (temp & 0xa8) |
2029 (((temp & 0xff) == 0) << 6) |
2030 parity(temp);
2031 break;
2032 case 0x59: /* OUT (C),E */
2033 Output(lreg(BC), DE);
2034 break;
2035 case 0x5A: /* ADC HL,DE */
2036 HL &= 0xffff;
2037 DE &= 0xffff;
2038 sum = HL + DE + TSTFLAG(C);
2039 cbits = (HL ^ DE ^ sum) >> 8;
2040 HL = sum;
2041 AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) |
2042 (((sum & 0xffff) == 0) << 6) |
2043 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
2044 (cbits & 0x10) | ((cbits >> 8) & 1);
2045 break;
2046 case 0x5B: /* LD DE,(nnnn) */
2047 temp = GetWORD(PC);
2048 DE = GetWORD(temp);
2049 PC += 2;
2050 break;
2051 case 0x5E: /* IM 2 */
2052 /* interrupt mode 2 */
2053 break;
2054 case 0x5F: /* LD A,R */
2055 AF = (AF & 0x29) | ((ir & 255) << 8) | (ir & 0x80) | (((ir & 255) == 0) << 6) | ((IFF & 2) << 1);
2056 break;
2057 case 0x60: /* IN H,(C) */
2058 temp = Input(lreg(BC));
2059 Sethreg(HL, temp);
2060 AF = (AF & ~0xfe) | (temp & 0xa8) |
2061 (((temp & 0xff) == 0) << 6) |
2062 parity(temp);
2063 break;
2064 case 0x61: /* OUT (C),H */
2065 Output(lreg(BC), HL);
2066 break;
2067 case 0x62: /* SBC HL,HL */
2068 HL &= 0xffff;
2069 sum = HL - HL - TSTFLAG(C);
2070 cbits = (HL ^ HL ^ sum) >> 8;
2071 HL = sum;
2072 AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) |
2073 (((sum & 0xffff) == 0) << 6) |
2074 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
2075 (cbits & 0x10) | 2 | ((cbits >> 8) & 1);
2076 break;
2077 case 0x63: /* LD (nnnn),HL */
2078 temp = GetWORD(PC);
2079 PutWORD(temp, HL);
2080 PC += 2;
2081 break;
2082 case 0x67: /* RRD */
2083 temp = GetBYTE(HL);
2084 acu = hreg(AF);
2085 PutBYTE(HL, hdig(temp) | (ldig(acu) << 4));
2086 acu = (acu & 0xf0) | ldig(temp);
2087 AF = (acu << 8) | (acu & 0xa8) | (((acu & 0xff) == 0) << 6) |
2088 partab[acu] | (AF & 1);
2089 break;
2090 case 0x68: /* IN L,(C) */
2091 temp = Input(lreg(BC));
2092 Setlreg(HL, temp);
2093 AF = (AF & ~0xfe) | (temp & 0xa8) |
2094 (((temp & 0xff) == 0) << 6) |
2095 parity(temp);
2096 break;
2097 case 0x69: /* OUT (C),L */
2098 Output(lreg(BC), HL);
2099 break;
2100 case 0x6A: /* ADC HL,HL */
2101 HL &= 0xffff;
2102 sum = HL + HL + TSTFLAG(C);
2103 cbits = (HL ^ HL ^ sum) >> 8;
2104 HL = sum;
2105 AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) |
2106 (((sum & 0xffff) == 0) << 6) |
2107 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
2108 (cbits & 0x10) | ((cbits >> 8) & 1);
2109 break;
2110 case 0x6B: /* LD HL,(nnnn) */
2111 temp = GetWORD(PC);
2112 HL = GetWORD(temp);
2113 PC += 2;
2114 break;
2115 case 0x6F: /* RLD */
2116 temp = GetBYTE(HL);
2117 acu = hreg(AF);
2118 PutBYTE(HL, (ldig(temp) << 4) | ldig(acu));
2119 acu = (acu & 0xf0) | hdig(temp);
2120 AF = (acu << 8) | (acu & 0xa8) | (((acu & 0xff) == 0) << 6) |
2121 partab[acu] | (AF & 1);
2122 break;
2123 case 0x70: /* IN (C) */
2124 temp = Input(lreg(BC));
2125 Setlreg(temp, temp);
2126 AF = (AF & ~0xfe) | (temp & 0xa8) |
2127 (((temp & 0xff) == 0) << 6) |
2128 parity(temp);
2129 break;
2130 case 0x71: /* OUT (C),0 */
2131 Output(lreg(BC), 0);
2132 break;
2133 case 0x72: /* SBC HL,SP */
2134 HL &= 0xffff;
2135 SP &= 0xffff;
2136 sum = HL - SP - TSTFLAG(C);
2137 cbits = (HL ^ SP ^ sum) >> 8;
2138 HL = sum;
2139 AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) |
2140 (((sum & 0xffff) == 0) << 6) |
2141 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
2142 (cbits & 0x10) | 2 | ((cbits >> 8) & 1);
2143 break;
2144 case 0x73: /* LD (nnnn),SP */
2145 temp = GetWORD(PC);
2146 PutWORD(temp, SP);
2147 PC += 2;
2148 break;
2149 case 0x78: /* IN A,(C) */
2150 temp = Input(lreg(BC));
2151 Sethreg(AF, temp);
2152 AF = (AF & ~0xfe) | (temp & 0xa8) |
2153 (((temp & 0xff) == 0) << 6) |
2154 parity(temp);
2155 break;
2156 case 0x79: /* OUT (C),A */
2157 Output(lreg(BC), AF);
2158 break;
2159 case 0x7A: /* ADC HL,SP */
2160 HL &= 0xffff;
2161 SP &= 0xffff;
2162 sum = HL + SP + TSTFLAG(C);
2163 cbits = (HL ^ SP ^ sum) >> 8;
2164 HL = sum;
2165 AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) |
2166 (((sum & 0xffff) == 0) << 6) |
2167 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
2168 (cbits & 0x10) | ((cbits >> 8) & 1);
2169 break;
2170 case 0x7B: /* LD SP,(nnnn) */
2171 temp = GetWORD(PC);
2172 SP = GetWORD(temp);
2173 PC += 2;
2174 break;
2175 case 0xA0: /* LDI */
2176 acu = GetBYTE(HL); ++HL;
2177 PutBYTE(DE, acu); ++DE;
2178 acu += hreg(AF);
2179 AF = (AF & ~0x3e) | (acu & 8) | ((acu & 2) << 4) |
2180 (((--BC & 0xffff) != 0) << 2);
2181 break;
2182 case 0xA1: /* CPI */
2183 acu = hreg(AF);
2184 temp = GetBYTE(HL); ++HL;
2185 sum = acu - temp;
2186 cbits = acu ^ temp ^ sum;
2187 AF = (AF & ~0xfe) | (sum & 0x80) | (!(sum & 0xff) << 6) |
2188 (((sum - ((cbits&16)>>4))&2) << 4) | (cbits & 16) |
2189 ((sum - ((cbits >> 4) & 1)) & 8) |
2190 ((--BC & 0xffff) != 0) << 2 | 2;
2191 if ((sum & 15) == 8 && (cbits & 16) != 0)
2192 AF &= ~8;
2193 break;
2194 case 0xA2: /* INI */
2195 PutBYTE(HL, Input(lreg(BC))); ++HL;
2196 SETFLAG(N, 1);
2197 SETFLAG(P, (--BC & 0xffff) != 0);
2198 break;
2199 case 0xA3: /* OUTI */
2200 Output(lreg(BC), GetBYTE(HL)); ++HL;
2201 SETFLAG(N, 1);
2202 Sethreg(BC, lreg(BC) - 1);
2203 SETFLAG(Z, lreg(BC) == 0);
2204 break;
2205 case 0xA8: /* LDD */
2206 acu = GetBYTE(HL); --HL;
2207 PutBYTE(DE, acu); --DE;
2208 acu += hreg(AF);
2209 AF = (AF & ~0x3e) | (acu & 8) | ((acu & 2) << 4) |
2210 (((--BC & 0xffff) != 0) << 2);
2211 break;
2212 case 0xA9: /* CPD */
2213 acu = hreg(AF);
2214 temp = GetBYTE(HL); --HL;
2215 sum = acu - temp;
2216 cbits = acu ^ temp ^ sum;
2217 AF = (AF & ~0xfe) | (sum & 0x80) | (!(sum & 0xff) << 6) |
2218 (((sum - ((cbits&16)>>4))&2) << 4) | (cbits & 16) |
2219 ((sum - ((cbits >> 4) & 1)) & 8) |
2220 ((--BC & 0xffff) != 0) << 2 | 2;
2221 if ((sum & 15) == 8 && (cbits & 16) != 0)
2222 AF &= ~8;
2223 break;
2224 case 0xAA: /* IND */
2225 PutBYTE(HL, Input(lreg(BC))); --HL;
2226 SETFLAG(N, 1);
2227 Sethreg(BC, lreg(BC) - 1);
2228 SETFLAG(Z, lreg(BC) == 0);
2229 break;
2230 case 0xAB: /* OUTD */
2231 Output(lreg(BC), GetBYTE(HL)); --HL;
2232 SETFLAG(N, 1);
2233 Sethreg(BC, lreg(BC) - 1);
2234 SETFLAG(Z, lreg(BC) == 0);
2235 break;
2236 case 0xB0: /* LDIR */
2237 acu = hreg(AF);
2238 BC &= 0xffff;
2239 do {
2240 acu = GetBYTE(HL); ++HL;
2241 PutBYTE(DE, acu); ++DE;
2242 } while (--BC);
2243 acu += hreg(AF);
2244 AF = (AF & ~0x3e) | (acu & 8) | ((acu & 2) << 4);
2245 break;
2246 case 0xB1: /* CPIR */
2247 acu = hreg(AF);
2248 BC &= 0xffff;
2249 do {
2250 temp = GetBYTE(HL); ++HL;
2251 op = --BC != 0;
2252 sum = acu - temp;
2253 } while (op && sum != 0);
2254 cbits = acu ^ temp ^ sum;
2255 AF = (AF & ~0xfe) | (sum & 0x80) | (!(sum & 0xff) << 6) |
2256 (((sum - ((cbits&16)>>4))&2) << 4) |
2257 (cbits & 16) | ((sum - ((cbits >> 4) & 1)) & 8) |
2258 op << 2 | 2;
2259 if ((sum & 15) == 8 && (cbits & 16) != 0)
2260 AF &= ~8;
2261 break;
2262 case 0xB2: /* INIR */
2263 temp = hreg(BC);
2264 do {
2265 PutBYTE(HL, Input(lreg(BC))); ++HL;
2266 } while (--temp);
2267 Sethreg(BC, 0);
2268 SETFLAG(N, 1);
2269 SETFLAG(Z, 1);
2270 break;
2271 case 0xB3: /* OTIR */
2272 temp = hreg(BC);
2273 do {
2274 Output(lreg(BC), GetBYTE(HL)); ++HL;
2275 } while (--temp);
2276 Sethreg(BC, 0);
2277 SETFLAG(N, 1);
2278 SETFLAG(Z, 1);
2279 break;
2280 case 0xB8: /* LDDR */
2281 BC &= 0xffff;
2282 do {
2283 acu = GetBYTE(HL); --HL;
2284 PutBYTE(DE, acu); --DE;
2285 } while (--BC);
2286 acu += hreg(AF);
2287 AF = (AF & ~0x3e) | (acu & 8) | ((acu & 2) << 4);
2288 break;
2289 case 0xB9: /* CPDR */
2290 acu = hreg(AF);
2291 BC &= 0xffff;
2292 do {
2293 temp = GetBYTE(HL); --HL;
2294 op = --BC != 0;
2295 sum = acu - temp;
2296 } while (op && sum != 0);
2297 cbits = acu ^ temp ^ sum;
2298 AF = (AF & ~0xfe) | (sum & 0x80) | (!(sum & 0xff) << 6) |
2299 (((sum - ((cbits&16)>>4))&2) << 4) |
2300 (cbits & 16) | ((sum - ((cbits >> 4) & 1)) & 8) |
2301 op << 2 | 2;
2302 if ((sum & 15) == 8 && (cbits & 16) != 0)
2303 AF &= ~8;
2304 break;
2305 case 0xBA: /* INDR */
2306 temp = hreg(BC);
2307 do {
2308 PutBYTE(HL, Input(lreg(BC))); --HL;
2309 } while (--temp);
2310 Sethreg(BC, 0);
2311 SETFLAG(N, 1);
2312 SETFLAG(Z, 1);
2313 break;
2314 case 0xBB: /* OTDR */
2315 temp = hreg(BC);
2316 do {
2317 Output(lreg(BC), GetBYTE(HL)); --HL;
2318 } while (--temp);
2319 Sethreg(BC, 0);
2320 SETFLAG(N, 1);
2321 SETFLAG(Z, 1);
2322 break;
2323 default: if (0x40 <= op && op <= 0x7f) PC--; /* ignore ED */
2325 break;
2326 case 0xEE: /* XOR nn */
2327 sum = ((AF >> 8) ^ GetBYTE(PC)) & 0xff;
2328 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
2329 ++PC;
2330 break;
2331 case 0xEF: /* RST 28H */
2332 PUSH(PC); PC = 0x28;
2333 break;
2334 case 0xF0: /* RET P */
2335 if (!TSTFLAG(S)) POP(PC);
2336 break;
2337 case 0xF1: /* POP AF */
2338 POP(AF);
2339 break;
2340 case 0xF2: /* JP P,nnnn */
2341 JPC(!TSTFLAG(S));
2342 break;
2343 case 0xF3: /* DI */
2344 IFF = 0;
2345 break;
2346 case 0xF4: /* CALL P,nnnn */
2347 CALLC(!TSTFLAG(S));
2348 break;
2349 case 0xF5: /* PUSH AF */
2350 PUSH(AF);
2351 break;
2352 case 0xF6: /* OR nn */
2353 sum = ((AF >> 8) | GetBYTE(PC)) & 0xff;
2354 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
2355 ++PC;
2356 break;
2357 case 0xF7: /* RST 30H */
2358 PUSH(PC); PC = 0x30;
2359 break;
2360 case 0xF8: /* RET M */
2361 if (TSTFLAG(S)) POP(PC);
2362 break;
2363 case 0xF9: /* LD SP,HL */
2364 SP = HL;
2365 break;
2366 case 0xFA: /* JP M,nnnn */
2367 JPC(TSTFLAG(S));
2368 break;
2369 case 0xFB: /* EI */
2370 IFF = 3;
2371 break;
2372 case 0xFC: /* CALL M,nnnn */
2373 CALLC(TSTFLAG(S));
2374 break;
2375 case 0xFD: /* FD prefix */
2376 SAVE_STATE();
2377 iy = dfd_prefix(iy);
2378 LOAD_STATE();
2379 break;
2380 case 0xFE: /* CP nn */
2381 temp = GetBYTE(PC);
2382 AF = (AF & ~0x28) | (temp & 0x28);
2383 acu = hreg(AF);
2384 sum = acu - temp;
2385 cbits = acu ^ temp ^ sum;
2386 AF = (AF & ~0xff) | (sum & 0x80) |
2387 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
2388 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
2389 (cbits & 0x10) | ((cbits >> 8) & 1);
2390 ++PC;
2391 break;
2392 case 0xFF: /* RST 38H */
2393 PUSH(PC); PC = 0x38;
2396 /* make registers visible for debugging if interrupted */
2397 SAVE_STATE();
2398 return (PC&0xffff)|0x10000; /* flag non-bios stop */