Cleaned up a bit
[virtual-nascom.git] / simz80.c
blob97191c693c2d39cad91be6c636e77a3ef87b1c71
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, int (*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 (fnc && --n == 0) {
685 n = count;
686 if ((*fnc)())
687 PC = 0;
690 switch(++PC,RAM(PC-1)) {
691 case 0x00: /* NOP */
692 break;
693 case 0x01: /* LD BC,nnnn */
694 BC = GetWORD(PC);
695 PC += 2;
696 break;
697 case 0x02: /* LD (BC),A */
698 PutBYTE(BC, hreg(AF));
699 break;
700 case 0x03: /* INC BC */
701 ++BC;
702 break;
703 case 0x04: /* INC B */
704 BC += 0x100;
705 temp = hreg(BC);
706 AF = (AF & ~0xfe) | (temp & 0xa8) |
707 (((temp & 0xff) == 0) << 6) |
708 (((temp & 0xf) == 0) << 4) |
709 ((temp == 0x80) << 2);
710 break;
711 case 0x05: /* DEC B */
712 BC -= 0x100;
713 temp = hreg(BC);
714 AF = (AF & ~0xfe) | (temp & 0xa8) |
715 (((temp & 0xff) == 0) << 6) |
716 (((temp & 0xf) == 0xf) << 4) |
717 ((temp == 0x7f) << 2) | 2;
718 break;
719 case 0x06: /* LD B,nn */
720 Sethreg(BC, GetBYTE(PC)); ++PC;
721 break;
722 case 0x07: /* RLCA */
723 AF = ((AF >> 7) & 0x0128) | ((AF << 1) & ~0x1ff) |
724 (AF & 0xc4) | ((AF >> 15) & 1);
725 break;
726 case 0x08: /* EX AF,AF' */
727 af[af_sel] = AF;
728 af_sel = 1 - af_sel;
729 AF = af[af_sel];
730 break;
731 case 0x09: /* ADD HL,BC */
732 HL &= 0xffff;
733 BC &= 0xffff;
734 sum = HL + BC;
735 cbits = (HL ^ BC ^ sum) >> 8;
736 HL = sum;
737 AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) |
738 (cbits & 0x10) | ((cbits >> 8) & 1);
739 break;
740 case 0x0A: /* LD A,(BC) */
741 Sethreg(AF, GetBYTE(BC));
742 break;
743 case 0x0B: /* DEC BC */
744 --BC;
745 break;
746 case 0x0C: /* INC C */
747 temp = lreg(BC)+1;
748 Setlreg(BC, temp);
749 AF = (AF & ~0xfe) | (temp & 0xa8) |
750 (((temp & 0xff) == 0) << 6) |
751 (((temp & 0xf) == 0) << 4) |
752 ((temp == 0x80) << 2);
753 break;
754 case 0x0D: /* DEC C */
755 temp = lreg(BC)-1;
756 Setlreg(BC, temp);
757 AF = (AF & ~0xfe) | (temp & 0xa8) |
758 (((temp & 0xff) == 0) << 6) |
759 (((temp & 0xf) == 0xf) << 4) |
760 ((temp == 0x7f) << 2) | 2;
761 break;
762 case 0x0E: /* LD C,nn */
763 Setlreg(BC, GetBYTE(PC)); ++PC;
764 break;
765 case 0x0F: /* RRCA */
766 temp = hreg(AF);
767 sum = temp >> 1;
768 AF = ((temp & 1) << 15) | (sum << 8) |
769 (sum & 0x28) | (AF & 0xc4) | (temp & 1);
770 break;
771 case 0x10: /* DJNZ dd */
772 PC += ((BC -= 0x100) & 0xff00) ? (signed char) GetBYTE(PC) + 1 : 1;
773 break;
774 case 0x11: /* LD DE,nnnn */
775 DE = GetWORD(PC);
776 PC += 2;
777 break;
778 case 0x12: /* LD (DE),A */
779 PutBYTE(DE, hreg(AF));
780 break;
781 case 0x13: /* INC DE */
782 ++DE;
783 break;
784 case 0x14: /* INC D */
785 DE += 0x100;
786 temp = hreg(DE);
787 AF = (AF & ~0xfe) | (temp & 0xa8) |
788 (((temp & 0xff) == 0) << 6) |
789 (((temp & 0xf) == 0) << 4) |
790 ((temp == 0x80) << 2);
791 break;
792 case 0x15: /* DEC D */
793 DE -= 0x100;
794 temp = hreg(DE);
795 AF = (AF & ~0xfe) | (temp & 0xa8) |
796 (((temp & 0xff) == 0) << 6) |
797 (((temp & 0xf) == 0xf) << 4) |
798 ((temp == 0x7f) << 2) | 2;
799 break;
800 case 0x16: /* LD D,nn */
801 Sethreg(DE, GetBYTE(PC)); ++PC;
802 break;
803 case 0x17: /* RLA */
804 AF = ((AF << 8) & 0x0100) | ((AF >> 7) & 0x28) | ((AF << 1) & ~0x01ff) |
805 (AF & 0xc4) | ((AF >> 15) & 1);
806 break;
807 case 0x18: /* JR dd */
808 PC += (1) ? (signed char) GetBYTE(PC) + 1 : 1;
809 break;
810 case 0x19: /* ADD HL,DE */
811 HL &= 0xffff;
812 DE &= 0xffff;
813 sum = HL + DE;
814 cbits = (HL ^ DE ^ sum) >> 8;
815 HL = sum;
816 AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) |
817 (cbits & 0x10) | ((cbits >> 8) & 1);
818 break;
819 case 0x1A: /* LD A,(DE) */
820 Sethreg(AF, GetBYTE(DE));
821 break;
822 case 0x1B: /* DEC DE */
823 --DE;
824 break;
825 case 0x1C: /* INC E */
826 temp = lreg(DE)+1;
827 Setlreg(DE, temp);
828 AF = (AF & ~0xfe) | (temp & 0xa8) |
829 (((temp & 0xff) == 0) << 6) |
830 (((temp & 0xf) == 0) << 4) |
831 ((temp == 0x80) << 2);
832 break;
833 case 0x1D: /* DEC E */
834 temp = lreg(DE)-1;
835 Setlreg(DE, temp);
836 AF = (AF & ~0xfe) | (temp & 0xa8) |
837 (((temp & 0xff) == 0) << 6) |
838 (((temp & 0xf) == 0xf) << 4) |
839 ((temp == 0x7f) << 2) | 2;
840 break;
841 case 0x1E: /* LD E,nn */
842 Setlreg(DE, GetBYTE(PC)); ++PC;
843 break;
844 case 0x1F: /* RRA */
845 temp = hreg(AF);
846 sum = temp >> 1;
847 AF = ((AF & 1) << 15) | (sum << 8) |
848 (sum & 0x28) | (AF & 0xc4) | (temp & 1);
849 break;
850 case 0x20: /* JR NZ,dd */
851 PC += (!TSTFLAG(Z)) ? (signed char) GetBYTE(PC) + 1 : 1;
852 break;
853 case 0x21: /* LD HL,nnnn */
854 HL = GetWORD(PC);
855 PC += 2;
856 break;
857 case 0x22: /* LD (nnnn),HL */
858 temp = GetWORD(PC);
859 PutWORD(temp, HL);
860 PC += 2;
861 break;
862 case 0x23: /* INC HL */
863 ++HL;
864 break;
865 case 0x24: /* INC H */
866 HL += 0x100;
867 temp = hreg(HL);
868 AF = (AF & ~0xfe) | (temp & 0xa8) |
869 (((temp & 0xff) == 0) << 6) |
870 (((temp & 0xf) == 0) << 4) |
871 ((temp == 0x80) << 2);
872 break;
873 case 0x25: /* DEC H */
874 HL -= 0x100;
875 temp = hreg(HL);
876 AF = (AF & ~0xfe) | (temp & 0xa8) |
877 (((temp & 0xff) == 0) << 6) |
878 (((temp & 0xf) == 0xf) << 4) |
879 ((temp == 0x7f) << 2) | 2;
880 break;
881 case 0x26: /* LD H,nn */
882 Sethreg(HL, GetBYTE(PC)); ++PC;
883 break;
884 case 0x27: /* DAA */
885 acu = hreg(AF);
886 temp = ldig(acu);
887 cbits = TSTFLAG(C);
888 if (TSTFLAG(N)) { /* last operation was a subtract */
889 int hd = cbits || acu > 0x99;
890 if (TSTFLAG(H) || (temp > 9)) { /* adjust low digit */
891 if (temp > 5)
892 SETFLAG(H, 0);
893 acu -= 6;
894 acu &= 0xff;
896 if (hd) /* adjust high digit */
897 acu -= 0x160;
899 else { /* last operation was an add */
900 if (TSTFLAG(H) || (temp > 9)) { /* adjust low digit */
901 SETFLAG(H, (temp > 9));
902 acu += 6;
904 if (cbits || ((acu & 0x1f0) > 0x90)) /* adjust high digit */
905 acu += 0x60;
907 cbits |= (acu >> 8) & 1;
908 acu &= 0xff;
909 AF = (acu << 8) | (acu & 0xa8) | ((acu == 0) << 6) |
910 (AF & 0x12) | partab[acu] | cbits;
911 break;
912 case 0x28: /* JR Z,dd */
913 PC += (TSTFLAG(Z)) ? (signed char) GetBYTE(PC) + 1 : 1;
914 break;
915 case 0x29: /* ADD HL,HL */
916 HL &= 0xffff;
917 sum = HL + HL;
918 cbits = (HL ^ HL ^ sum) >> 8;
919 HL = sum;
920 AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) |
921 (cbits & 0x10) | ((cbits >> 8) & 1);
922 break;
923 case 0x2A: /* LD HL,(nnnn) */
924 temp = GetWORD(PC);
925 HL = GetWORD(temp);
926 PC += 2;
927 break;
928 case 0x2B: /* DEC HL */
929 --HL;
930 break;
931 case 0x2C: /* INC L */
932 temp = lreg(HL)+1;
933 Setlreg(HL, temp);
934 AF = (AF & ~0xfe) | (temp & 0xa8) |
935 (((temp & 0xff) == 0) << 6) |
936 (((temp & 0xf) == 0) << 4) |
937 ((temp == 0x80) << 2);
938 break;
939 case 0x2D: /* DEC L */
940 temp = lreg(HL)-1;
941 Setlreg(HL, temp);
942 AF = (AF & ~0xfe) | (temp & 0xa8) |
943 (((temp & 0xff) == 0) << 6) |
944 (((temp & 0xf) == 0xf) << 4) |
945 ((temp == 0x7f) << 2) | 2;
946 break;
947 case 0x2E: /* LD L,nn */
948 Setlreg(HL, GetBYTE(PC)); ++PC;
949 break;
950 case 0x2F: /* CPL */
951 AF = (~AF & ~0xff) | (AF & 0xc5) | ((~AF >> 8) & 0x28) | 0x12;
952 break;
953 case 0x30: /* JR NC,dd */
954 PC += (!TSTFLAG(C)) ? (signed char) GetBYTE(PC) + 1 : 1;
955 break;
956 case 0x31: /* LD SP,nnnn */
957 SP = GetWORD(PC);
958 PC += 2;
959 break;
960 case 0x32: /* LD (nnnn),A */
961 temp = GetWORD(PC);
962 PutBYTE(temp, hreg(AF));
963 PC += 2;
964 break;
965 case 0x33: /* INC SP */
966 ++SP;
967 break;
968 case 0x34: /* INC (HL) */
969 temp = GetBYTE(HL)+1;
970 PutBYTE(HL, temp);
971 AF = (AF & ~0xfe) | (temp & 0xa8) |
972 (((temp & 0xff) == 0) << 6) |
973 (((temp & 0xf) == 0) << 4) |
974 ((temp == 0x80) << 2);
975 break;
976 case 0x35: /* DEC (HL) */
977 temp = GetBYTE(HL)-1;
978 PutBYTE(HL, temp);
979 AF = (AF & ~0xfe) | (temp & 0xa8) |
980 (((temp & 0xff) == 0) << 6) |
981 (((temp & 0xf) == 0xf) << 4) |
982 ((temp == 0x7f) << 2) | 2;
983 break;
984 case 0x36: /* LD (HL),nn */
985 PutBYTE(HL, GetBYTE(PC)); ++PC;
986 break;
987 case 0x37: /* SCF */
988 AF = (AF&~0x3b)|((AF>>8)&0x28)|1;
989 break;
990 case 0x38: /* JR C,dd */
991 PC += (TSTFLAG(C)) ? (signed char) GetBYTE(PC) + 1 : 1;
992 break;
993 case 0x39: /* ADD HL,SP */
994 HL &= 0xffff;
995 SP &= 0xffff;
996 sum = HL + SP;
997 cbits = (HL ^ SP ^ sum) >> 8;
998 HL = sum;
999 AF = (AF & ~0x3b) | ((sum >> 8) & 0x28) |
1000 (cbits & 0x10) | ((cbits >> 8) & 1);
1001 break;
1002 case 0x3A: /* LD A,(nnnn) */
1003 temp = GetWORD(PC);
1004 Sethreg(AF, GetBYTE(temp));
1005 PC += 2;
1006 break;
1007 case 0x3B: /* DEC SP */
1008 --SP;
1009 break;
1010 case 0x3C: /* INC A */
1011 AF += 0x100;
1012 temp = hreg(AF);
1013 AF = (AF & ~0xfe) | (temp & 0xa8) |
1014 (((temp & 0xff) == 0) << 6) |
1015 (((temp & 0xf) == 0) << 4) |
1016 ((temp == 0x80) << 2);
1017 break;
1018 case 0x3D: /* DEC A */
1019 AF -= 0x100;
1020 temp = hreg(AF);
1021 AF = (AF & ~0xfe) | (temp & 0xa8) |
1022 (((temp & 0xff) == 0) << 6) |
1023 (((temp & 0xf) == 0xf) << 4) |
1024 ((temp == 0x7f) << 2) | 2;
1025 break;
1026 case 0x3E: /* LD A,nn */
1027 Sethreg(AF, GetBYTE(PC)); ++PC;
1028 break;
1029 case 0x3F: /* CCF */
1030 AF = (AF&~0x3b)|((AF>>8)&0x28)|((AF&1)<<4)|(~AF&1);
1031 break;
1032 case 0x40: /* LD B,B */
1033 /* nop */
1034 break;
1035 case 0x41: /* LD B,C */
1036 BC = (BC & 255) | ((BC & 255) << 8);
1037 break;
1038 case 0x42: /* LD B,D */
1039 BC = (BC & 255) | (DE & ~255);
1040 break;
1041 case 0x43: /* LD B,E */
1042 BC = (BC & 255) | ((DE & 255) << 8);
1043 break;
1044 case 0x44: /* LD B,H */
1045 BC = (BC & 255) | (HL & ~255);
1046 break;
1047 case 0x45: /* LD B,L */
1048 BC = (BC & 255) | ((HL & 255) << 8);
1049 break;
1050 case 0x46: /* LD B,(HL) */
1051 Sethreg(BC, GetBYTE(HL));
1052 break;
1053 case 0x47: /* LD B,A */
1054 BC = (BC & 255) | (AF & ~255);
1055 break;
1056 case 0x48: /* LD C,B */
1057 BC = (BC & ~255) | ((BC >> 8) & 255);
1058 break;
1059 case 0x49: /* LD C,C */
1060 /* nop */
1061 break;
1062 case 0x4A: /* LD C,D */
1063 BC = (BC & ~255) | ((DE >> 8) & 255);
1064 break;
1065 case 0x4B: /* LD C,E */
1066 BC = (BC & ~255) | (DE & 255);
1067 break;
1068 case 0x4C: /* LD C,H */
1069 BC = (BC & ~255) | ((HL >> 8) & 255);
1070 break;
1071 case 0x4D: /* LD C,L */
1072 BC = (BC & ~255) | (HL & 255);
1073 break;
1074 case 0x4E: /* LD C,(HL) */
1075 Setlreg(BC, GetBYTE(HL));
1076 break;
1077 case 0x4F: /* LD C,A */
1078 BC = (BC & ~255) | ((AF >> 8) & 255);
1079 break;
1080 case 0x50: /* LD D,B */
1081 DE = (DE & 255) | (BC & ~255);
1082 break;
1083 case 0x51: /* LD D,C */
1084 DE = (DE & 255) | ((BC & 255) << 8);
1085 break;
1086 case 0x52: /* LD D,D */
1087 /* nop */
1088 break;
1089 case 0x53: /* LD D,E */
1090 DE = (DE & 255) | ((DE & 255) << 8);
1091 break;
1092 case 0x54: /* LD D,H */
1093 DE = (DE & 255) | (HL & ~255);
1094 break;
1095 case 0x55: /* LD D,L */
1096 DE = (DE & 255) | ((HL & 255) << 8);
1097 break;
1098 case 0x56: /* LD D,(HL) */
1099 Sethreg(DE, GetBYTE(HL));
1100 break;
1101 case 0x57: /* LD D,A */
1102 DE = (DE & 255) | (AF & ~255);
1103 break;
1104 case 0x58: /* LD E,B */
1105 DE = (DE & ~255) | ((BC >> 8) & 255);
1106 break;
1107 case 0x59: /* LD E,C */
1108 DE = (DE & ~255) | (BC & 255);
1109 break;
1110 case 0x5A: /* LD E,D */
1111 DE = (DE & ~255) | ((DE >> 8) & 255);
1112 break;
1113 case 0x5B: /* LD E,E */
1114 /* nop */
1115 break;
1116 case 0x5C: /* LD E,H */
1117 DE = (DE & ~255) | ((HL >> 8) & 255);
1118 break;
1119 case 0x5D: /* LD E,L */
1120 DE = (DE & ~255) | (HL & 255);
1121 break;
1122 case 0x5E: /* LD E,(HL) */
1123 Setlreg(DE, GetBYTE(HL));
1124 break;
1125 case 0x5F: /* LD E,A */
1126 DE = (DE & ~255) | ((AF >> 8) & 255);
1127 break;
1128 case 0x60: /* LD H,B */
1129 HL = (HL & 255) | (BC & ~255);
1130 break;
1131 case 0x61: /* LD H,C */
1132 HL = (HL & 255) | ((BC & 255) << 8);
1133 break;
1134 case 0x62: /* LD H,D */
1135 HL = (HL & 255) | (DE & ~255);
1136 break;
1137 case 0x63: /* LD H,E */
1138 HL = (HL & 255) | ((DE & 255) << 8);
1139 break;
1140 case 0x64: /* LD H,H */
1141 /* nop */
1142 break;
1143 case 0x65: /* LD H,L */
1144 HL = (HL & 255) | ((HL & 255) << 8);
1145 break;
1146 case 0x66: /* LD H,(HL) */
1147 Sethreg(HL, GetBYTE(HL));
1148 break;
1149 case 0x67: /* LD H,A */
1150 HL = (HL & 255) | (AF & ~255);
1151 break;
1152 case 0x68: /* LD L,B */
1153 HL = (HL & ~255) | ((BC >> 8) & 255);
1154 break;
1155 case 0x69: /* LD L,C */
1156 HL = (HL & ~255) | (BC & 255);
1157 break;
1158 case 0x6A: /* LD L,D */
1159 HL = (HL & ~255) | ((DE >> 8) & 255);
1160 break;
1161 case 0x6B: /* LD L,E */
1162 HL = (HL & ~255) | (DE & 255);
1163 break;
1164 case 0x6C: /* LD L,H */
1165 HL = (HL & ~255) | ((HL >> 8) & 255);
1166 break;
1167 case 0x6D: /* LD L,L */
1168 /* nop */
1169 break;
1170 case 0x6E: /* LD L,(HL) */
1171 Setlreg(HL, GetBYTE(HL));
1172 break;
1173 case 0x6F: /* LD L,A */
1174 HL = (HL & ~255) | ((AF >> 8) & 255);
1175 break;
1176 case 0x70: /* LD (HL),B */
1177 PutBYTE(HL, hreg(BC));
1178 break;
1179 case 0x71: /* LD (HL),C */
1180 PutBYTE(HL, lreg(BC));
1181 break;
1182 case 0x72: /* LD (HL),D */
1183 PutBYTE(HL, hreg(DE));
1184 break;
1185 case 0x73: /* LD (HL),E */
1186 PutBYTE(HL, lreg(DE));
1187 break;
1188 case 0x74: /* LD (HL),H */
1189 PutBYTE(HL, hreg(HL));
1190 break;
1191 case 0x75: /* LD (HL),L */
1192 PutBYTE(HL, lreg(HL));
1193 break;
1194 case 0x76: /* HALT */
1195 SAVE_STATE();
1196 return PC&0xffff;
1197 case 0x77: /* LD (HL),A */
1198 PutBYTE(HL, hreg(AF));
1199 break;
1200 case 0x78: /* LD A,B */
1201 AF = (AF & 255) | (BC & ~255);
1202 break;
1203 case 0x79: /* LD A,C */
1204 AF = (AF & 255) | ((BC & 255) << 8);
1205 break;
1206 case 0x7A: /* LD A,D */
1207 AF = (AF & 255) | (DE & ~255);
1208 break;
1209 case 0x7B: /* LD A,E */
1210 AF = (AF & 255) | ((DE & 255) << 8);
1211 break;
1212 case 0x7C: /* LD A,H */
1213 AF = (AF & 255) | (HL & ~255);
1214 break;
1215 case 0x7D: /* LD A,L */
1216 AF = (AF & 255) | ((HL & 255) << 8);
1217 break;
1218 case 0x7E: /* LD A,(HL) */
1219 Sethreg(AF, GetBYTE(HL));
1220 break;
1221 case 0x7F: /* LD A,A */
1222 /* nop */
1223 break;
1224 case 0x80: /* ADD A,B */
1225 temp = hreg(BC);
1226 acu = hreg(AF);
1227 sum = acu + temp;
1228 cbits = acu ^ temp ^ sum;
1229 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1230 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1231 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1232 ((cbits >> 8) & 1);
1233 break;
1234 case 0x81: /* ADD A,C */
1235 temp = lreg(BC);
1236 acu = hreg(AF);
1237 sum = acu + temp;
1238 cbits = acu ^ temp ^ sum;
1239 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1240 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1241 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1242 ((cbits >> 8) & 1);
1243 break;
1244 case 0x82: /* ADD A,D */
1245 temp = hreg(DE);
1246 acu = hreg(AF);
1247 sum = acu + temp;
1248 cbits = acu ^ temp ^ sum;
1249 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1250 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1251 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1252 ((cbits >> 8) & 1);
1253 break;
1254 case 0x83: /* ADD A,E */
1255 temp = lreg(DE);
1256 acu = hreg(AF);
1257 sum = acu + temp;
1258 cbits = acu ^ temp ^ sum;
1259 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1260 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1261 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1262 ((cbits >> 8) & 1);
1263 break;
1264 case 0x84: /* ADD A,H */
1265 temp = hreg(HL);
1266 acu = hreg(AF);
1267 sum = acu + temp;
1268 cbits = acu ^ temp ^ sum;
1269 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1270 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1271 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1272 ((cbits >> 8) & 1);
1273 break;
1274 case 0x85: /* ADD A,L */
1275 temp = lreg(HL);
1276 acu = hreg(AF);
1277 sum = acu + temp;
1278 cbits = acu ^ temp ^ sum;
1279 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1280 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1281 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1282 ((cbits >> 8) & 1);
1283 break;
1284 case 0x86: /* ADD A,(HL) */
1285 temp = GetBYTE(HL);
1286 acu = hreg(AF);
1287 sum = acu + temp;
1288 cbits = acu ^ temp ^ sum;
1289 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1290 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1291 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1292 ((cbits >> 8) & 1);
1293 break;
1294 case 0x87: /* ADD A,A */
1295 temp = hreg(AF);
1296 acu = hreg(AF);
1297 sum = acu + temp;
1298 cbits = acu ^ temp ^ sum;
1299 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1300 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1301 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1302 ((cbits >> 8) & 1);
1303 break;
1304 case 0x88: /* ADC A,B */
1305 temp = hreg(BC);
1306 acu = hreg(AF);
1307 sum = acu + temp + TSTFLAG(C);
1308 cbits = acu ^ temp ^ sum;
1309 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1310 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1311 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1312 ((cbits >> 8) & 1);
1313 break;
1314 case 0x89: /* ADC A,C */
1315 temp = lreg(BC);
1316 acu = hreg(AF);
1317 sum = acu + temp + TSTFLAG(C);
1318 cbits = acu ^ temp ^ sum;
1319 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1320 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1321 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1322 ((cbits >> 8) & 1);
1323 break;
1324 case 0x8A: /* ADC A,D */
1325 temp = hreg(DE);
1326 acu = hreg(AF);
1327 sum = acu + temp + TSTFLAG(C);
1328 cbits = acu ^ temp ^ sum;
1329 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1330 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1331 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1332 ((cbits >> 8) & 1);
1333 break;
1334 case 0x8B: /* ADC A,E */
1335 temp = lreg(DE);
1336 acu = hreg(AF);
1337 sum = acu + temp + TSTFLAG(C);
1338 cbits = acu ^ temp ^ sum;
1339 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1340 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1341 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1342 ((cbits >> 8) & 1);
1343 break;
1344 case 0x8C: /* ADC A,H */
1345 temp = hreg(HL);
1346 acu = hreg(AF);
1347 sum = acu + temp + TSTFLAG(C);
1348 cbits = acu ^ temp ^ sum;
1349 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1350 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1351 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1352 ((cbits >> 8) & 1);
1353 break;
1354 case 0x8D: /* ADC A,L */
1355 temp = lreg(HL);
1356 acu = hreg(AF);
1357 sum = acu + temp + TSTFLAG(C);
1358 cbits = acu ^ temp ^ sum;
1359 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1360 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1361 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1362 ((cbits >> 8) & 1);
1363 break;
1364 case 0x8E: /* ADC A,(HL) */
1365 temp = GetBYTE(HL);
1366 acu = hreg(AF);
1367 sum = acu + temp + TSTFLAG(C);
1368 cbits = acu ^ temp ^ sum;
1369 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1370 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1371 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1372 ((cbits >> 8) & 1);
1373 break;
1374 case 0x8F: /* ADC A,A */
1375 temp = hreg(AF);
1376 acu = hreg(AF);
1377 sum = acu + temp + TSTFLAG(C);
1378 cbits = acu ^ temp ^ sum;
1379 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1380 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1381 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1382 ((cbits >> 8) & 1);
1383 break;
1384 case 0x90: /* SUB B */
1385 temp = hreg(BC);
1386 acu = hreg(AF);
1387 sum = acu - temp;
1388 cbits = acu ^ temp ^ sum;
1389 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1390 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1391 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1392 ((cbits >> 8) & 1);
1393 break;
1394 case 0x91: /* SUB C */
1395 temp = lreg(BC);
1396 acu = hreg(AF);
1397 sum = acu - temp;
1398 cbits = acu ^ temp ^ sum;
1399 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1400 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1401 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1402 ((cbits >> 8) & 1);
1403 break;
1404 case 0x92: /* SUB D */
1405 temp = hreg(DE);
1406 acu = hreg(AF);
1407 sum = acu - temp;
1408 cbits = acu ^ temp ^ sum;
1409 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1410 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1411 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1412 ((cbits >> 8) & 1);
1413 break;
1414 case 0x93: /* SUB E */
1415 temp = lreg(DE);
1416 acu = hreg(AF);
1417 sum = acu - temp;
1418 cbits = acu ^ temp ^ sum;
1419 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1420 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1421 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1422 ((cbits >> 8) & 1);
1423 break;
1424 case 0x94: /* SUB H */
1425 temp = hreg(HL);
1426 acu = hreg(AF);
1427 sum = acu - temp;
1428 cbits = acu ^ temp ^ sum;
1429 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1430 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1431 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1432 ((cbits >> 8) & 1);
1433 break;
1434 case 0x95: /* SUB L */
1435 temp = lreg(HL);
1436 acu = hreg(AF);
1437 sum = acu - temp;
1438 cbits = acu ^ temp ^ sum;
1439 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1440 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1441 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1442 ((cbits >> 8) & 1);
1443 break;
1444 case 0x96: /* SUB (HL) */
1445 temp = GetBYTE(HL);
1446 acu = hreg(AF);
1447 sum = acu - temp;
1448 cbits = acu ^ temp ^ sum;
1449 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1450 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1451 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1452 ((cbits >> 8) & 1);
1453 break;
1454 case 0x97: /* SUB A */
1455 temp = hreg(AF);
1456 acu = hreg(AF);
1457 sum = acu - temp;
1458 cbits = acu ^ temp ^ sum;
1459 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1460 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1461 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1462 ((cbits >> 8) & 1);
1463 break;
1464 case 0x98: /* SBC A,B */
1465 temp = hreg(BC);
1466 acu = hreg(AF);
1467 sum = acu - temp - TSTFLAG(C);
1468 cbits = acu ^ temp ^ sum;
1469 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1470 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1471 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1472 ((cbits >> 8) & 1);
1473 break;
1474 case 0x99: /* SBC A,C */
1475 temp = lreg(BC);
1476 acu = hreg(AF);
1477 sum = acu - temp - TSTFLAG(C);
1478 cbits = acu ^ temp ^ sum;
1479 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1480 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1481 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1482 ((cbits >> 8) & 1);
1483 break;
1484 case 0x9A: /* SBC A,D */
1485 temp = hreg(DE);
1486 acu = hreg(AF);
1487 sum = acu - temp - TSTFLAG(C);
1488 cbits = acu ^ temp ^ sum;
1489 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1490 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1491 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1492 ((cbits >> 8) & 1);
1493 break;
1494 case 0x9B: /* SBC A,E */
1495 temp = lreg(DE);
1496 acu = hreg(AF);
1497 sum = acu - temp - TSTFLAG(C);
1498 cbits = acu ^ temp ^ sum;
1499 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1500 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1501 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1502 ((cbits >> 8) & 1);
1503 break;
1504 case 0x9C: /* SBC A,H */
1505 temp = hreg(HL);
1506 acu = hreg(AF);
1507 sum = acu - temp - TSTFLAG(C);
1508 cbits = acu ^ temp ^ sum;
1509 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1510 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1511 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1512 ((cbits >> 8) & 1);
1513 break;
1514 case 0x9D: /* SBC A,L */
1515 temp = lreg(HL);
1516 acu = hreg(AF);
1517 sum = acu - temp - TSTFLAG(C);
1518 cbits = acu ^ temp ^ sum;
1519 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1520 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1521 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1522 ((cbits >> 8) & 1);
1523 break;
1524 case 0x9E: /* SBC A,(HL) */
1525 temp = GetBYTE(HL);
1526 acu = hreg(AF);
1527 sum = acu - temp - TSTFLAG(C);
1528 cbits = acu ^ temp ^ sum;
1529 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1530 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1531 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1532 ((cbits >> 8) & 1);
1533 break;
1534 case 0x9F: /* SBC A,A */
1535 temp = hreg(AF);
1536 acu = hreg(AF);
1537 sum = acu - temp - TSTFLAG(C);
1538 cbits = acu ^ temp ^ sum;
1539 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1540 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1541 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1542 ((cbits >> 8) & 1);
1543 break;
1544 case 0xA0: /* AND B */
1545 sum = ((AF & (BC)) >> 8) & 0xff;
1546 AF = (sum << 8) | (sum & 0xa8) |
1547 ((sum == 0) << 6) | 0x10 | partab[sum];
1548 break;
1549 case 0xA1: /* AND C */
1550 sum = ((AF >> 8) & BC) & 0xff;
1551 AF = (sum << 8) | (sum & 0xa8) | 0x10 |
1552 ((sum == 0) << 6) | partab[sum];
1553 break;
1554 case 0xA2: /* AND D */
1555 sum = ((AF & (DE)) >> 8) & 0xff;
1556 AF = (sum << 8) | (sum & 0xa8) |
1557 ((sum == 0) << 6) | 0x10 | partab[sum];
1558 break;
1559 case 0xA3: /* AND E */
1560 sum = ((AF >> 8) & DE) & 0xff;
1561 AF = (sum << 8) | (sum & 0xa8) | 0x10 |
1562 ((sum == 0) << 6) | partab[sum];
1563 break;
1564 case 0xA4: /* AND H */
1565 sum = ((AF & (HL)) >> 8) & 0xff;
1566 AF = (sum << 8) | (sum & 0xa8) |
1567 ((sum == 0) << 6) | 0x10 | partab[sum];
1568 break;
1569 case 0xA5: /* AND L */
1570 sum = ((AF >> 8) & HL) & 0xff;
1571 AF = (sum << 8) | (sum & 0xa8) | 0x10 |
1572 ((sum == 0) << 6) | partab[sum];
1573 break;
1574 case 0xA6: /* AND (HL) */
1575 sum = ((AF >> 8) & GetBYTE(HL)) & 0xff;
1576 AF = (sum << 8) | (sum & 0xa8) | 0x10 |
1577 ((sum == 0) << 6) | partab[sum];
1578 break;
1579 case 0xA7: /* AND A */
1580 sum = ((AF & (AF)) >> 8) & 0xff;
1581 AF = (sum << 8) | (sum & 0xa8) |
1582 ((sum == 0) << 6) | 0x10 | partab[sum];
1583 break;
1584 case 0xA8: /* XOR B */
1585 sum = ((AF ^ (BC)) >> 8) & 0xff;
1586 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1587 break;
1588 case 0xA9: /* XOR C */
1589 sum = ((AF >> 8) ^ BC) & 0xff;
1590 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1591 break;
1592 case 0xAA: /* XOR D */
1593 sum = ((AF ^ (DE)) >> 8) & 0xff;
1594 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1595 break;
1596 case 0xAB: /* XOR E */
1597 sum = ((AF >> 8) ^ DE) & 0xff;
1598 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1599 break;
1600 case 0xAC: /* XOR H */
1601 sum = ((AF ^ (HL)) >> 8) & 0xff;
1602 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1603 break;
1604 case 0xAD: /* XOR L */
1605 sum = ((AF >> 8) ^ HL) & 0xff;
1606 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1607 break;
1608 case 0xAE: /* XOR (HL) */
1609 sum = ((AF >> 8) ^ GetBYTE(HL)) & 0xff;
1610 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1611 break;
1612 case 0xAF: /* XOR A */
1613 sum = ((AF ^ (AF)) >> 8) & 0xff;
1614 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1615 break;
1616 case 0xB0: /* OR B */
1617 sum = ((AF | (BC)) >> 8) & 0xff;
1618 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1619 break;
1620 case 0xB1: /* OR C */
1621 sum = ((AF >> 8) | BC) & 0xff;
1622 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1623 break;
1624 case 0xB2: /* OR D */
1625 sum = ((AF | (DE)) >> 8) & 0xff;
1626 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1627 break;
1628 case 0xB3: /* OR E */
1629 sum = ((AF >> 8) | DE) & 0xff;
1630 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1631 break;
1632 case 0xB4: /* OR H */
1633 sum = ((AF | (HL)) >> 8) & 0xff;
1634 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1635 break;
1636 case 0xB5: /* OR L */
1637 sum = ((AF >> 8) | HL) & 0xff;
1638 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1639 break;
1640 case 0xB6: /* OR (HL) */
1641 sum = ((AF >> 8) | GetBYTE(HL)) & 0xff;
1642 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1643 break;
1644 case 0xB7: /* OR A */
1645 sum = ((AF | (AF)) >> 8) & 0xff;
1646 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
1647 break;
1648 case 0xB8: /* CP B */
1649 temp = hreg(BC);
1650 AF = (AF & ~0x28) | (temp & 0x28);
1651 acu = hreg(AF);
1652 sum = acu - temp;
1653 cbits = acu ^ temp ^ sum;
1654 AF = (AF & ~0xff) | (sum & 0x80) |
1655 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
1656 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1657 (cbits & 0x10) | ((cbits >> 8) & 1);
1658 break;
1659 case 0xB9: /* CP C */
1660 temp = lreg(BC);
1661 AF = (AF & ~0x28) | (temp & 0x28);
1662 acu = hreg(AF);
1663 sum = acu - temp;
1664 cbits = acu ^ temp ^ sum;
1665 AF = (AF & ~0xff) | (sum & 0x80) |
1666 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
1667 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1668 (cbits & 0x10) | ((cbits >> 8) & 1);
1669 break;
1670 case 0xBA: /* CP D */
1671 temp = hreg(DE);
1672 AF = (AF & ~0x28) | (temp & 0x28);
1673 acu = hreg(AF);
1674 sum = acu - temp;
1675 cbits = acu ^ temp ^ sum;
1676 AF = (AF & ~0xff) | (sum & 0x80) |
1677 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
1678 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1679 (cbits & 0x10) | ((cbits >> 8) & 1);
1680 break;
1681 case 0xBB: /* CP E */
1682 temp = lreg(DE);
1683 AF = (AF & ~0x28) | (temp & 0x28);
1684 acu = hreg(AF);
1685 sum = acu - temp;
1686 cbits = acu ^ temp ^ sum;
1687 AF = (AF & ~0xff) | (sum & 0x80) |
1688 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
1689 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1690 (cbits & 0x10) | ((cbits >> 8) & 1);
1691 break;
1692 case 0xBC: /* CP H */
1693 temp = hreg(HL);
1694 AF = (AF & ~0x28) | (temp & 0x28);
1695 acu = hreg(AF);
1696 sum = acu - temp;
1697 cbits = acu ^ temp ^ sum;
1698 AF = (AF & ~0xff) | (sum & 0x80) |
1699 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
1700 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1701 (cbits & 0x10) | ((cbits >> 8) & 1);
1702 break;
1703 case 0xBD: /* CP L */
1704 temp = lreg(HL);
1705 AF = (AF & ~0x28) | (temp & 0x28);
1706 acu = hreg(AF);
1707 sum = acu - temp;
1708 cbits = acu ^ temp ^ sum;
1709 AF = (AF & ~0xff) | (sum & 0x80) |
1710 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
1711 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1712 (cbits & 0x10) | ((cbits >> 8) & 1);
1713 break;
1714 case 0xBE: /* CP (HL) */
1715 temp = GetBYTE(HL);
1716 AF = (AF & ~0x28) | (temp & 0x28);
1717 acu = hreg(AF);
1718 sum = acu - temp;
1719 cbits = acu ^ temp ^ sum;
1720 AF = (AF & ~0xff) | (sum & 0x80) |
1721 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
1722 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1723 (cbits & 0x10) | ((cbits >> 8) & 1);
1724 break;
1725 case 0xBF: /* CP A */
1726 temp = hreg(AF);
1727 AF = (AF & ~0x28) | (temp & 0x28);
1728 acu = hreg(AF);
1729 sum = acu - temp;
1730 cbits = acu ^ temp ^ sum;
1731 AF = (AF & ~0xff) | (sum & 0x80) |
1732 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
1733 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1734 (cbits & 0x10) | ((cbits >> 8) & 1);
1735 break;
1736 case 0xC0: /* RET NZ */
1737 if (!TSTFLAG(Z)) POP(PC);
1738 break;
1739 case 0xC1: /* POP BC */
1740 POP(BC);
1741 break;
1742 case 0xC2: /* JP NZ,nnnn */
1743 JPC(!TSTFLAG(Z));
1744 break;
1745 case 0xC3: /* JP nnnn */
1746 JPC(1);
1747 break;
1748 case 0xC4: /* CALL NZ,nnnn */
1749 CALLC(!TSTFLAG(Z));
1750 break;
1751 case 0xC5: /* PUSH BC */
1752 PUSH(BC);
1753 break;
1754 case 0xC6: /* ADD A,nn */
1755 temp = GetBYTE(PC);
1756 acu = hreg(AF);
1757 sum = acu + temp;
1758 cbits = acu ^ temp ^ sum;
1759 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1760 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1761 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1762 ((cbits >> 8) & 1);
1763 ++PC;
1764 break;
1765 case 0xC7: /* RST 0 */
1766 PUSH(PC); PC = 0;
1767 break;
1768 case 0xC8: /* RET Z */
1769 if (TSTFLAG(Z)) POP(PC);
1770 break;
1771 case 0xC9: /* RET */
1772 POP(PC);
1773 break;
1774 case 0xCA: /* JP Z,nnnn */
1775 JPC(TSTFLAG(Z));
1776 break;
1777 case 0xCB: /* CB prefix */
1778 SAVE_STATE();
1779 cb_prefix(HL);
1780 LOAD_STATE();
1781 break;
1782 case 0xCC: /* CALL Z,nnnn */
1783 CALLC(TSTFLAG(Z));
1784 break;
1785 case 0xCD: /* CALL nnnn */
1786 CALLC(1);
1787 break;
1788 case 0xCE: /* ADC A,nn */
1789 temp = GetBYTE(PC);
1790 acu = hreg(AF);
1791 sum = acu + temp + TSTFLAG(C);
1792 cbits = acu ^ temp ^ sum;
1793 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1794 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1795 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1796 ((cbits >> 8) & 1);
1797 ++PC;
1798 break;
1799 case 0xCF: /* RST 8 */
1800 PUSH(PC); PC = 8;
1801 break;
1802 case 0xD0: /* RET NC */
1803 if (!TSTFLAG(C)) POP(PC);
1804 break;
1805 case 0xD1: /* POP DE */
1806 POP(DE);
1807 break;
1808 case 0xD2: /* JP NC,nnnn */
1809 JPC(!TSTFLAG(C));
1810 break;
1811 case 0xD3: /* OUT (nn),A */
1812 Output(GetBYTE(PC), hreg(AF)); ++PC;
1813 break;
1814 case 0xD4: /* CALL NC,nnnn */
1815 CALLC(!TSTFLAG(C));
1816 break;
1817 case 0xD5: /* PUSH DE */
1818 PUSH(DE);
1819 break;
1820 case 0xD6: /* SUB nn */
1821 temp = GetBYTE(PC);
1822 acu = hreg(AF);
1823 sum = acu - temp;
1824 cbits = acu ^ temp ^ sum;
1825 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1826 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1827 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1828 ((cbits >> 8) & 1);
1829 ++PC;
1830 break;
1831 case 0xD7: /* RST 10H */
1832 PUSH(PC); PC = 0x10;
1833 break;
1834 case 0xD8: /* RET C */
1835 if (TSTFLAG(C)) POP(PC);
1836 break;
1837 case 0xD9: /* EXX */
1838 regs[regs_sel].bc = BC;
1839 regs[regs_sel].de = DE;
1840 regs[regs_sel].hl = HL;
1841 regs_sel = 1 - regs_sel;
1842 BC = regs[regs_sel].bc;
1843 DE = regs[regs_sel].de;
1844 HL = regs[regs_sel].hl;
1845 break;
1846 case 0xDA: /* JP C,nnnn */
1847 JPC(TSTFLAG(C));
1848 break;
1849 case 0xDB: /* IN A,(nn) */
1850 Sethreg(AF, Input(GetBYTE(PC))); ++PC;
1851 break;
1852 case 0xDC: /* CALL C,nnnn */
1853 CALLC(TSTFLAG(C));
1854 break;
1855 case 0xDD: /* DD prefix */
1856 SAVE_STATE();
1857 ix = dfd_prefix(ix);
1858 LOAD_STATE();
1859 break;
1860 case 0xDE: /* SBC A,nn */
1861 temp = GetBYTE(PC);
1862 acu = hreg(AF);
1863 sum = acu - temp - TSTFLAG(C);
1864 cbits = acu ^ temp ^ sum;
1865 AF = ((sum & 0xff) << 8) | (sum & 0xa8) |
1866 (((sum & 0xff) == 0) << 6) | (cbits & 0x10) |
1867 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
1868 ((cbits >> 8) & 1);
1869 ++PC;
1870 break;
1871 case 0xDF: /* RST 18H */
1872 PUSH(PC); PC = 0x18;
1873 break;
1874 case 0xE0: /* RET PO */
1875 if (!TSTFLAG(P)) POP(PC);
1876 break;
1877 case 0xE1: /* POP HL */
1878 POP(HL);
1879 break;
1880 case 0xE2: /* JP PO,nnnn */
1881 JPC(!TSTFLAG(P));
1882 break;
1883 case 0xE3: /* EX (SP),HL */
1884 temp = HL; POP(HL); PUSH(temp);
1885 break;
1886 case 0xE4: /* CALL PO,nnnn */
1887 CALLC(!TSTFLAG(P));
1888 break;
1889 case 0xE5: /* PUSH HL */
1890 PUSH(HL);
1891 break;
1892 case 0xE6: /* AND nn */
1893 sum = ((AF >> 8) & GetBYTE(PC)) & 0xff;
1894 AF = (sum << 8) | (sum & 0xa8) | 0x10 |
1895 ((sum == 0) << 6) | partab[sum];
1896 ++PC;
1897 break;
1898 case 0xE7: /* RST 20H */
1899 PUSH(PC); PC = 0x20;
1900 break;
1901 case 0xE8: /* RET PE */
1902 if (TSTFLAG(P)) POP(PC);
1903 break;
1904 case 0xE9: /* JP (HL) */
1905 PC = HL;
1906 break;
1907 case 0xEA: /* JP PE,nnnn */
1908 JPC(TSTFLAG(P));
1909 break;
1910 case 0xEB: /* EX DE,HL */
1911 temp = HL; HL = DE; DE = temp;
1912 break;
1913 case 0xEC: /* CALL PE,nnnn */
1914 CALLC(TSTFLAG(P));
1915 break;
1916 case 0xED: /* ED prefix */
1917 switch (++PC, op = GetBYTE(PC-1)) {
1918 case 0x40: /* IN B,(C) */
1919 temp = Input(lreg(BC));
1920 Sethreg(BC, temp);
1921 AF = (AF & ~0xfe) | (temp & 0xa8) |
1922 (((temp & 0xff) == 0) << 6) |
1923 parity(temp);
1924 break;
1925 case 0x41: /* OUT (C),B */
1926 Output(lreg(BC), BC);
1927 break;
1928 case 0x42: /* SBC HL,BC */
1929 HL &= 0xffff;
1930 BC &= 0xffff;
1931 sum = HL - BC - TSTFLAG(C);
1932 cbits = (HL ^ BC ^ sum) >> 8;
1933 HL = sum;
1934 AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) |
1935 (((sum & 0xffff) == 0) << 6) |
1936 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1937 (cbits & 0x10) | 2 | ((cbits >> 8) & 1);
1938 break;
1939 case 0x43: /* LD (nnnn),BC */
1940 temp = GetWORD(PC);
1941 PutWORD(temp, BC);
1942 PC += 2;
1943 break;
1944 case 0x44: /* NEG */
1945 temp = hreg(AF);
1946 AF = (-(AF & 0xff00) & 0xff00);
1947 AF |= ((AF >> 8) & 0xa8) | (((AF & 0xff00) == 0) << 6) |
1948 (((temp & 0x0f) != 0) << 4) | ((temp == 0x80) << 2) |
1949 2 | (temp != 0);
1950 break;
1951 case 0x45: /* RETN */
1952 IFF |= IFF >> 1;
1953 POP(PC);
1954 break;
1955 case 0x46: /* IM 0 */
1956 /* interrupt mode 0 */
1957 break;
1958 case 0x47: /* LD I,A */
1959 ir = (ir & 255) | (AF & ~255);
1960 break;
1961 case 0x48: /* IN C,(C) */
1962 temp = Input(lreg(BC));
1963 Setlreg(BC, temp);
1964 AF = (AF & ~0xfe) | (temp & 0xa8) |
1965 (((temp & 0xff) == 0) << 6) |
1966 parity(temp);
1967 break;
1968 case 0x49: /* OUT (C),C */
1969 Output(lreg(BC), BC);
1970 break;
1971 case 0x4A: /* ADC HL,BC */
1972 HL &= 0xffff;
1973 BC &= 0xffff;
1974 sum = HL + BC + TSTFLAG(C);
1975 cbits = (HL ^ BC ^ sum) >> 8;
1976 HL = sum;
1977 AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) |
1978 (((sum & 0xffff) == 0) << 6) |
1979 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
1980 (cbits & 0x10) | ((cbits >> 8) & 1);
1981 break;
1982 case 0x4B: /* LD BC,(nnnn) */
1983 temp = GetWORD(PC);
1984 BC = GetWORD(temp);
1985 PC += 2;
1986 break;
1987 case 0x4D: /* RETI */
1988 IFF |= IFF >> 1;
1989 POP(PC);
1990 break;
1991 case 0x4F: /* LD R,A */
1992 ir = (ir & ~255) | ((AF >> 8) & 255);
1993 break;
1994 case 0x50: /* IN D,(C) */
1995 temp = Input(lreg(BC));
1996 Sethreg(DE, temp);
1997 AF = (AF & ~0xfe) | (temp & 0xa8) |
1998 (((temp & 0xff) == 0) << 6) |
1999 parity(temp);
2000 break;
2001 case 0x51: /* OUT (C),D */
2002 Output(lreg(BC), DE);
2003 break;
2004 case 0x52: /* SBC HL,DE */
2005 HL &= 0xffff;
2006 DE &= 0xffff;
2007 sum = HL - DE - TSTFLAG(C);
2008 cbits = (HL ^ DE ^ sum) >> 8;
2009 HL = sum;
2010 AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) |
2011 (((sum & 0xffff) == 0) << 6) |
2012 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
2013 (cbits & 0x10) | 2 | ((cbits >> 8) & 1);
2014 break;
2015 case 0x53: /* LD (nnnn),DE */
2016 temp = GetWORD(PC);
2017 PutWORD(temp, DE);
2018 PC += 2;
2019 break;
2020 case 0x56: /* IM 1 */
2021 /* interrupt mode 1 */
2022 break;
2023 case 0x57: /* LD A,I */
2024 AF = (AF & 0x29) | (ir & ~255) | ((ir >> 8) & 0x80) | (((ir & ~255) == 0) << 6) | ((IFF & 2) << 1);
2025 break;
2026 case 0x58: /* IN E,(C) */
2027 temp = Input(lreg(BC));
2028 Setlreg(DE, temp);
2029 AF = (AF & ~0xfe) | (temp & 0xa8) |
2030 (((temp & 0xff) == 0) << 6) |
2031 parity(temp);
2032 break;
2033 case 0x59: /* OUT (C),E */
2034 Output(lreg(BC), DE);
2035 break;
2036 case 0x5A: /* ADC HL,DE */
2037 HL &= 0xffff;
2038 DE &= 0xffff;
2039 sum = HL + DE + TSTFLAG(C);
2040 cbits = (HL ^ DE ^ sum) >> 8;
2041 HL = sum;
2042 AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) |
2043 (((sum & 0xffff) == 0) << 6) |
2044 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
2045 (cbits & 0x10) | ((cbits >> 8) & 1);
2046 break;
2047 case 0x5B: /* LD DE,(nnnn) */
2048 temp = GetWORD(PC);
2049 DE = GetWORD(temp);
2050 PC += 2;
2051 break;
2052 case 0x5E: /* IM 2 */
2053 /* interrupt mode 2 */
2054 break;
2055 case 0x5F: /* LD A,R */
2056 AF = (AF & 0x29) | ((ir & 255) << 8) | (ir & 0x80) | (((ir & 255) == 0) << 6) | ((IFF & 2) << 1);
2057 break;
2058 case 0x60: /* IN H,(C) */
2059 temp = Input(lreg(BC));
2060 Sethreg(HL, temp);
2061 AF = (AF & ~0xfe) | (temp & 0xa8) |
2062 (((temp & 0xff) == 0) << 6) |
2063 parity(temp);
2064 break;
2065 case 0x61: /* OUT (C),H */
2066 Output(lreg(BC), HL);
2067 break;
2068 case 0x62: /* SBC HL,HL */
2069 HL &= 0xffff;
2070 sum = HL - HL - TSTFLAG(C);
2071 cbits = (HL ^ HL ^ sum) >> 8;
2072 HL = sum;
2073 AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) |
2074 (((sum & 0xffff) == 0) << 6) |
2075 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
2076 (cbits & 0x10) | 2 | ((cbits >> 8) & 1);
2077 break;
2078 case 0x63: /* LD (nnnn),HL */
2079 temp = GetWORD(PC);
2080 PutWORD(temp, HL);
2081 PC += 2;
2082 break;
2083 case 0x67: /* RRD */
2084 temp = GetBYTE(HL);
2085 acu = hreg(AF);
2086 PutBYTE(HL, hdig(temp) | (ldig(acu) << 4));
2087 acu = (acu & 0xf0) | ldig(temp);
2088 AF = (acu << 8) | (acu & 0xa8) | (((acu & 0xff) == 0) << 6) |
2089 partab[acu] | (AF & 1);
2090 break;
2091 case 0x68: /* IN L,(C) */
2092 temp = Input(lreg(BC));
2093 Setlreg(HL, temp);
2094 AF = (AF & ~0xfe) | (temp & 0xa8) |
2095 (((temp & 0xff) == 0) << 6) |
2096 parity(temp);
2097 break;
2098 case 0x69: /* OUT (C),L */
2099 Output(lreg(BC), HL);
2100 break;
2101 case 0x6A: /* ADC HL,HL */
2102 HL &= 0xffff;
2103 sum = HL + HL + TSTFLAG(C);
2104 cbits = (HL ^ HL ^ sum) >> 8;
2105 HL = sum;
2106 AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) |
2107 (((sum & 0xffff) == 0) << 6) |
2108 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
2109 (cbits & 0x10) | ((cbits >> 8) & 1);
2110 break;
2111 case 0x6B: /* LD HL,(nnnn) */
2112 temp = GetWORD(PC);
2113 HL = GetWORD(temp);
2114 PC += 2;
2115 break;
2116 case 0x6F: /* RLD */
2117 temp = GetBYTE(HL);
2118 acu = hreg(AF);
2119 PutBYTE(HL, (ldig(temp) << 4) | ldig(acu));
2120 acu = (acu & 0xf0) | hdig(temp);
2121 AF = (acu << 8) | (acu & 0xa8) | (((acu & 0xff) == 0) << 6) |
2122 partab[acu] | (AF & 1);
2123 break;
2124 case 0x70: /* IN (C) */
2125 temp = Input(lreg(BC));
2126 Setlreg(temp, temp);
2127 AF = (AF & ~0xfe) | (temp & 0xa8) |
2128 (((temp & 0xff) == 0) << 6) |
2129 parity(temp);
2130 break;
2131 case 0x71: /* OUT (C),0 */
2132 Output(lreg(BC), 0);
2133 break;
2134 case 0x72: /* SBC HL,SP */
2135 HL &= 0xffff;
2136 SP &= 0xffff;
2137 sum = HL - SP - TSTFLAG(C);
2138 cbits = (HL ^ SP ^ sum) >> 8;
2139 HL = sum;
2140 AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) |
2141 (((sum & 0xffff) == 0) << 6) |
2142 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
2143 (cbits & 0x10) | 2 | ((cbits >> 8) & 1);
2144 break;
2145 case 0x73: /* LD (nnnn),SP */
2146 temp = GetWORD(PC);
2147 PutWORD(temp, SP);
2148 PC += 2;
2149 break;
2150 case 0x78: /* IN A,(C) */
2151 temp = Input(lreg(BC));
2152 Sethreg(AF, temp);
2153 AF = (AF & ~0xfe) | (temp & 0xa8) |
2154 (((temp & 0xff) == 0) << 6) |
2155 parity(temp);
2156 break;
2157 case 0x79: /* OUT (C),A */
2158 Output(lreg(BC), AF);
2159 break;
2160 case 0x7A: /* ADC HL,SP */
2161 HL &= 0xffff;
2162 SP &= 0xffff;
2163 sum = HL + SP + TSTFLAG(C);
2164 cbits = (HL ^ SP ^ sum) >> 8;
2165 HL = sum;
2166 AF = (AF & ~0xff) | ((sum >> 8) & 0xa8) |
2167 (((sum & 0xffff) == 0) << 6) |
2168 (((cbits >> 6) ^ (cbits >> 5)) & 4) |
2169 (cbits & 0x10) | ((cbits >> 8) & 1);
2170 break;
2171 case 0x7B: /* LD SP,(nnnn) */
2172 temp = GetWORD(PC);
2173 SP = GetWORD(temp);
2174 PC += 2;
2175 break;
2176 case 0xA0: /* LDI */
2177 acu = GetBYTE(HL); ++HL;
2178 PutBYTE(DE, acu); ++DE;
2179 acu += hreg(AF);
2180 AF = (AF & ~0x3e) | (acu & 8) | ((acu & 2) << 4) |
2181 (((--BC & 0xffff) != 0) << 2);
2182 break;
2183 case 0xA1: /* CPI */
2184 acu = hreg(AF);
2185 temp = GetBYTE(HL); ++HL;
2186 sum = acu - temp;
2187 cbits = acu ^ temp ^ sum;
2188 AF = (AF & ~0xfe) | (sum & 0x80) | (!(sum & 0xff) << 6) |
2189 (((sum - ((cbits&16)>>4))&2) << 4) | (cbits & 16) |
2190 ((sum - ((cbits >> 4) & 1)) & 8) |
2191 ((--BC & 0xffff) != 0) << 2 | 2;
2192 if ((sum & 15) == 8 && (cbits & 16) != 0)
2193 AF &= ~8;
2194 break;
2195 case 0xA2: /* INI */
2196 PutBYTE(HL, Input(lreg(BC))); ++HL;
2197 SETFLAG(N, 1);
2198 SETFLAG(P, (--BC & 0xffff) != 0);
2199 break;
2200 case 0xA3: /* OUTI */
2201 Output(lreg(BC), GetBYTE(HL)); ++HL;
2202 SETFLAG(N, 1);
2203 Sethreg(BC, lreg(BC) - 1);
2204 SETFLAG(Z, lreg(BC) == 0);
2205 break;
2206 case 0xA8: /* LDD */
2207 acu = GetBYTE(HL); --HL;
2208 PutBYTE(DE, acu); --DE;
2209 acu += hreg(AF);
2210 AF = (AF & ~0x3e) | (acu & 8) | ((acu & 2) << 4) |
2211 (((--BC & 0xffff) != 0) << 2);
2212 break;
2213 case 0xA9: /* CPD */
2214 acu = hreg(AF);
2215 temp = GetBYTE(HL); --HL;
2216 sum = acu - temp;
2217 cbits = acu ^ temp ^ sum;
2218 AF = (AF & ~0xfe) | (sum & 0x80) | (!(sum & 0xff) << 6) |
2219 (((sum - ((cbits&16)>>4))&2) << 4) | (cbits & 16) |
2220 ((sum - ((cbits >> 4) & 1)) & 8) |
2221 ((--BC & 0xffff) != 0) << 2 | 2;
2222 if ((sum & 15) == 8 && (cbits & 16) != 0)
2223 AF &= ~8;
2224 break;
2225 case 0xAA: /* IND */
2226 PutBYTE(HL, Input(lreg(BC))); --HL;
2227 SETFLAG(N, 1);
2228 Sethreg(BC, lreg(BC) - 1);
2229 SETFLAG(Z, lreg(BC) == 0);
2230 break;
2231 case 0xAB: /* OUTD */
2232 Output(lreg(BC), GetBYTE(HL)); --HL;
2233 SETFLAG(N, 1);
2234 Sethreg(BC, lreg(BC) - 1);
2235 SETFLAG(Z, lreg(BC) == 0);
2236 break;
2237 case 0xB0: /* LDIR */
2238 acu = hreg(AF);
2239 BC &= 0xffff;
2240 do {
2241 acu = GetBYTE(HL); ++HL;
2242 PutBYTE(DE, acu); ++DE;
2243 } while (--BC);
2244 acu += hreg(AF);
2245 AF = (AF & ~0x3e) | (acu & 8) | ((acu & 2) << 4);
2246 break;
2247 case 0xB1: /* CPIR */
2248 acu = hreg(AF);
2249 BC &= 0xffff;
2250 do {
2251 temp = GetBYTE(HL); ++HL;
2252 op = --BC != 0;
2253 sum = acu - temp;
2254 } while (op && sum != 0);
2255 cbits = acu ^ temp ^ sum;
2256 AF = (AF & ~0xfe) | (sum & 0x80) | (!(sum & 0xff) << 6) |
2257 (((sum - ((cbits&16)>>4))&2) << 4) |
2258 (cbits & 16) | ((sum - ((cbits >> 4) & 1)) & 8) |
2259 op << 2 | 2;
2260 if ((sum & 15) == 8 && (cbits & 16) != 0)
2261 AF &= ~8;
2262 break;
2263 case 0xB2: /* INIR */
2264 temp = hreg(BC);
2265 do {
2266 PutBYTE(HL, Input(lreg(BC))); ++HL;
2267 } while (--temp);
2268 Sethreg(BC, 0);
2269 SETFLAG(N, 1);
2270 SETFLAG(Z, 1);
2271 break;
2272 case 0xB3: /* OTIR */
2273 temp = hreg(BC);
2274 do {
2275 Output(lreg(BC), GetBYTE(HL)); ++HL;
2276 } while (--temp);
2277 Sethreg(BC, 0);
2278 SETFLAG(N, 1);
2279 SETFLAG(Z, 1);
2280 break;
2281 case 0xB8: /* LDDR */
2282 BC &= 0xffff;
2283 do {
2284 acu = GetBYTE(HL); --HL;
2285 PutBYTE(DE, acu); --DE;
2286 } while (--BC);
2287 acu += hreg(AF);
2288 AF = (AF & ~0x3e) | (acu & 8) | ((acu & 2) << 4);
2289 break;
2290 case 0xB9: /* CPDR */
2291 acu = hreg(AF);
2292 BC &= 0xffff;
2293 do {
2294 temp = GetBYTE(HL); --HL;
2295 op = --BC != 0;
2296 sum = acu - temp;
2297 } while (op && sum != 0);
2298 cbits = acu ^ temp ^ sum;
2299 AF = (AF & ~0xfe) | (sum & 0x80) | (!(sum & 0xff) << 6) |
2300 (((sum - ((cbits&16)>>4))&2) << 4) |
2301 (cbits & 16) | ((sum - ((cbits >> 4) & 1)) & 8) |
2302 op << 2 | 2;
2303 if ((sum & 15) == 8 && (cbits & 16) != 0)
2304 AF &= ~8;
2305 break;
2306 case 0xBA: /* INDR */
2307 temp = hreg(BC);
2308 do {
2309 PutBYTE(HL, Input(lreg(BC))); --HL;
2310 } while (--temp);
2311 Sethreg(BC, 0);
2312 SETFLAG(N, 1);
2313 SETFLAG(Z, 1);
2314 break;
2315 case 0xBB: /* OTDR */
2316 temp = hreg(BC);
2317 do {
2318 Output(lreg(BC), GetBYTE(HL)); --HL;
2319 } while (--temp);
2320 Sethreg(BC, 0);
2321 SETFLAG(N, 1);
2322 SETFLAG(Z, 1);
2323 break;
2324 default: if (0x40 <= op && op <= 0x7f) PC--; /* ignore ED */
2326 break;
2327 case 0xEE: /* XOR nn */
2328 sum = ((AF >> 8) ^ GetBYTE(PC)) & 0xff;
2329 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
2330 ++PC;
2331 break;
2332 case 0xEF: /* RST 28H */
2333 PUSH(PC); PC = 0x28;
2334 break;
2335 case 0xF0: /* RET P */
2336 if (!TSTFLAG(S)) POP(PC);
2337 break;
2338 case 0xF1: /* POP AF */
2339 POP(AF);
2340 break;
2341 case 0xF2: /* JP P,nnnn */
2342 JPC(!TSTFLAG(S));
2343 break;
2344 case 0xF3: /* DI */
2345 IFF = 0;
2346 break;
2347 case 0xF4: /* CALL P,nnnn */
2348 CALLC(!TSTFLAG(S));
2349 break;
2350 case 0xF5: /* PUSH AF */
2351 PUSH(AF);
2352 break;
2353 case 0xF6: /* OR nn */
2354 sum = ((AF >> 8) | GetBYTE(PC)) & 0xff;
2355 AF = (sum << 8) | (sum & 0xa8) | ((sum == 0) << 6) | partab[sum];
2356 ++PC;
2357 break;
2358 case 0xF7: /* RST 30H */
2359 PUSH(PC); PC = 0x30;
2360 break;
2361 case 0xF8: /* RET M */
2362 if (TSTFLAG(S)) POP(PC);
2363 break;
2364 case 0xF9: /* LD SP,HL */
2365 SP = HL;
2366 break;
2367 case 0xFA: /* JP M,nnnn */
2368 JPC(TSTFLAG(S));
2369 break;
2370 case 0xFB: /* EI */
2371 IFF = 3;
2372 break;
2373 case 0xFC: /* CALL M,nnnn */
2374 CALLC(TSTFLAG(S));
2375 break;
2376 case 0xFD: /* FD prefix */
2377 SAVE_STATE();
2378 iy = dfd_prefix(iy);
2379 LOAD_STATE();
2380 break;
2381 case 0xFE: /* CP nn */
2382 temp = GetBYTE(PC);
2383 AF = (AF & ~0x28) | (temp & 0x28);
2384 acu = hreg(AF);
2385 sum = acu - temp;
2386 cbits = acu ^ temp ^ sum;
2387 AF = (AF & ~0xff) | (sum & 0x80) |
2388 (((sum & 0xff) == 0) << 6) | (temp & 0x28) |
2389 (((cbits >> 6) ^ (cbits >> 5)) & 4) | 2 |
2390 (cbits & 0x10) | ((cbits >> 8) & 1);
2391 ++PC;
2392 break;
2393 case 0xFF: /* RST 38H */
2394 PUSH(PC); PC = 0x38;
2397 /* make registers visible for debugging if interrupted */
2398 SAVE_STATE();
2399 return (PC&0xffff)|0x10000; /* flag non-bios stop */