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 */
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]
57 FASTREG y = RAM(SP); SP++; \
58 x = y + (RAM(SP) << 8); SP++; \
61 #define PUSH(x) do { \
62 --SP; RAM(SP) = (x) >> 8; \
66 #define JPC(cond) PC = cond ? GetWORD(PC) : PC+2
68 #define CALLC(cond) { \
70 FASTREG adrr = GetWORD(PC); \
78 /* load Z80 registers into (we hope) host registers */
79 #define LOAD_STATE() \
82 BC = regs[regs_sel].bc; \
83 DE = regs[regs_sel].de; \
84 HL = regs[regs_sel].hl; \
87 /* load Z80 registers into (we hope) host registers */
88 #define DECLARE_STATE() \
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; \
96 /* save Z80 registers back into memory */
97 #define SAVE_STATE() \
100 regs[regs_sel].bc = BC; \
101 regs[regs_sel].de = DE; \
102 regs[regs_sel].hl = HL; \
106 cb_prefix(FASTREG adr
)
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;
122 case 0x00: /* shift/rotate */
125 temp
= (acu
<< 1) | (acu
>> 7);
129 temp
= (acu
>> 1) | (acu
<< 7);
133 temp
= (acu
<< 1) | TSTFLAG(C
);
137 temp
= (acu
>> 1) | (TSTFLAG(C
) << 7);
145 temp
= (acu
>> 1) | (acu
& 0x80);
148 case 0x30: /* SLIA */
149 temp
= (acu
<< 1) | 1;
156 AF
= (AF
& ~0xff) | (temp
& 0xa8) |
157 (((temp
& 0xff) == 0) << 6) |
158 parity(temp
) | !!cbits
;
162 if (acu
& (1 << ((op
>> 3) & 7)))
163 AF
= (AF
& ~0xfe) | 0x10 |
164 (((op
& 0x38) == 0x38) << 7);
166 AF
= (AF
& ~0xfe) | 0x54;
172 temp
= acu
& ~(1 << ((op
>> 3) & 7));
175 temp
= acu
| (1 << ((op
>> 3) & 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;
192 dfd_prefix(FASTREG IXY
)
195 FASTWORK temp
, adr
, acu
, op
, sum
, cbits
;
197 switch (++PC
, op
= GetBYTE(PC
-1)) {
198 case 0x09: /* ADD IXY,BC */
202 cbits
= (IXY
^ BC
^ sum
) >> 8;
204 AF
= (AF
& ~0x3b) | ((sum
>> 8) & 0x28) |
205 (cbits
& 0x10) | ((cbits
>> 8) & 1);
207 case 0x19: /* ADD IXY,DE */
211 cbits
= (IXY
^ DE
^ sum
) >> 8;
213 AF
= (AF
& ~0x3b) | ((sum
>> 8) & 0x28) |
214 (cbits
& 0x10) | ((cbits
>> 8) & 1);
216 case 0x21: /* LD IXY,nnnn */
220 case 0x22: /* LD (nnnn),IXY */
225 case 0x23: /* INC IXY */
228 case 0x24: /* INC IXYH */
231 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
232 (((temp
& 0xff) == 0) << 6) |
233 (((temp
& 0xf) == 0) << 4) |
234 ((temp
== 0x80) << 2);
236 case 0x25: /* DEC IXYH */
239 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
240 (((temp
& 0xff) == 0) << 6) |
241 (((temp
& 0xf) == 0xf) << 4) |
242 ((temp
== 0x7f) << 2) | 2;
244 case 0x26: /* LD IXYH,nn */
245 Sethreg(IXY
, GetBYTE(PC
)); ++PC
;
247 case 0x29: /* ADD IXY,IXY */
250 cbits
= (IXY
^ IXY
^ sum
) >> 8;
252 AF
= (AF
& ~0x3b) | ((sum
>> 8) & 0x28) |
253 (cbits
& 0x10) | ((cbits
>> 8) & 1);
255 case 0x2A: /* LD IXY,(nnnn) */
260 case 0x2B: /* DEC IXY */
263 case 0x2C: /* INC IXYL */
266 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
267 (((temp
& 0xff) == 0) << 6) |
268 (((temp
& 0xf) == 0) << 4) |
269 ((temp
== 0x80) << 2);
271 case 0x2D: /* DEC IXYL */
274 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
275 (((temp
& 0xff) == 0) << 6) |
276 (((temp
& 0xf) == 0xf) << 4) |
277 ((temp
== 0x7f) << 2) | 2;
279 case 0x2E: /* LD IXYL,nn */
280 Setlreg(IXY
, GetBYTE(PC
)); ++PC
;
282 case 0x34: /* INC (IXY+dd) */
283 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
284 temp
= GetBYTE(adr
)+1;
286 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
287 (((temp
& 0xff) == 0) << 6) |
288 (((temp
& 0xf) == 0) << 4) |
289 ((temp
== 0x80) << 2);
291 case 0x35: /* DEC (IXY+dd) */
292 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
293 temp
= GetBYTE(adr
)-1;
295 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
296 (((temp
& 0xff) == 0) << 6) |
297 (((temp
& 0xf) == 0xf) << 4) |
298 ((temp
== 0x7f) << 2) | 2;
300 case 0x36: /* LD (IXY+dd),nn */
301 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
302 PutBYTE(adr
, GetBYTE(PC
)); ++PC
;
304 case 0x39: /* ADD IXY,SP */
308 cbits
= (IXY
^ SP
^ sum
) >> 8;
310 AF
= (AF
& ~0x3b) | ((sum
>> 8) & 0x28) |
311 (cbits
& 0x10) | ((cbits
>> 8) & 1);
313 case 0x44: /* LD B,IXYH */
314 Sethreg(BC
, hreg(IXY
));
316 case 0x45: /* LD B,IXYL */
317 Sethreg(BC
, lreg(IXY
));
319 case 0x46: /* LD B,(IXY+dd) */
320 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
321 Sethreg(BC
, GetBYTE(adr
));
323 case 0x4C: /* LD C,IXYH */
324 Setlreg(BC
, hreg(IXY
));
326 case 0x4D: /* LD C,IXYL */
327 Setlreg(BC
, lreg(IXY
));
329 case 0x4E: /* LD C,(IXY+dd) */
330 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
331 Setlreg(BC
, GetBYTE(adr
));
333 case 0x54: /* LD D,IXYH */
334 Sethreg(DE
, hreg(IXY
));
336 case 0x55: /* LD D,IXYL */
337 Sethreg(DE
, lreg(IXY
));
339 case 0x56: /* LD D,(IXY+dd) */
340 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
341 Sethreg(DE
, GetBYTE(adr
));
343 case 0x5C: /* LD E,H */
344 Setlreg(DE
, hreg(IXY
));
346 case 0x5D: /* LD E,L */
347 Setlreg(DE
, lreg(IXY
));
349 case 0x5E: /* LD E,(IXY+dd) */
350 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
351 Setlreg(DE
, GetBYTE(adr
));
353 case 0x60: /* LD IXYH,B */
354 Sethreg(IXY
, hreg(BC
));
356 case 0x61: /* LD IXYH,C */
357 Sethreg(IXY
, lreg(BC
));
359 case 0x62: /* LD IXYH,D */
360 Sethreg(IXY
, hreg(DE
));
362 case 0x63: /* LD IXYH,E */
363 Sethreg(IXY
, lreg(DE
));
365 case 0x64: /* LD IXYH,IXYH */
368 case 0x65: /* LD IXYH,IXYL */
369 Sethreg(IXY
, lreg(IXY
));
371 case 0x66: /* LD H,(IXY+dd) */
372 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
373 Sethreg(HL
, GetBYTE(adr
));
375 case 0x67: /* LD IXYH,A */
376 Sethreg(IXY
, hreg(AF
));
378 case 0x68: /* LD IXYL,B */
379 Setlreg(IXY
, hreg(BC
));
381 case 0x69: /* LD IXYL,C */
382 Setlreg(IXY
, lreg(BC
));
384 case 0x6A: /* LD IXYL,D */
385 Setlreg(IXY
, hreg(DE
));
387 case 0x6B: /* LD IXYL,E */
388 Setlreg(IXY
, lreg(DE
));
390 case 0x6C: /* LD IXYL,IXYH */
391 Setlreg(IXY
, hreg(IXY
));
393 case 0x6D: /* LD IXYL,IXYL */
396 case 0x6E: /* LD L,(IXY+dd) */
397 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
398 Setlreg(HL
, GetBYTE(adr
));
400 case 0x6F: /* LD IXYL,A */
401 Setlreg(IXY
, hreg(AF
));
403 case 0x70: /* LD (IXY+dd),B */
404 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
405 PutBYTE(adr
, hreg(BC
));
407 case 0x71: /* LD (IXY+dd),C */
408 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
409 PutBYTE(adr
, lreg(BC
));
411 case 0x72: /* LD (IXY+dd),D */
412 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
413 PutBYTE(adr
, hreg(DE
));
415 case 0x73: /* LD (IXY+dd),E */
416 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
417 PutBYTE(adr
, lreg(DE
));
419 case 0x74: /* LD (IXY+dd),H */
420 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
421 PutBYTE(adr
, hreg(HL
));
423 case 0x75: /* LD (IXY+dd),L */
424 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
425 PutBYTE(adr
, lreg(HL
));
427 case 0x77: /* LD (IXY+dd),A */
428 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
429 PutBYTE(adr
, hreg(AF
));
431 case 0x7C: /* LD A,IXYH */
432 Sethreg(AF
, hreg(IXY
));
434 case 0x7D: /* LD A,IXYL */
435 Sethreg(AF
, lreg(IXY
));
437 case 0x7E: /* LD A,(IXY+dd) */
438 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
439 Sethreg(AF
, GetBYTE(adr
));
441 case 0x84: /* ADD A,IXYH */
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) |
451 case 0x85: /* ADD A,IXYL */
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) |
461 case 0x86: /* ADD A,(IXY+dd) */
462 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
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) |
472 case 0x8C: /* ADC A,IXYH */
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) |
482 case 0x8D: /* ADC A,IXYL */
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) |
492 case 0x8E: /* ADC A,(IXY+dd) */
493 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
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) |
503 case 0x94: /* SUB IXYH */
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 |
513 case 0x95: /* SUB IXYL */
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 |
523 case 0x96: /* SUB (IXY+dd) */
524 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
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 |
534 case 0x9C: /* SBC A,IXYH */
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 |
544 case 0x9D: /* SBC A,IXYL */
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 |
554 case 0x9E: /* SBC A,(IXY+dd) */
555 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
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 |
565 case 0xA4: /* AND IXYH */
566 sum
= ((AF
& (IXY
)) >> 8) & 0xff;
567 AF
= (sum
<< 8) | (sum
& 0xa8) |
568 ((sum
== 0) << 6) | 0x10 | partab
[sum
];
570 case 0xA5: /* AND IXYL */
571 sum
= ((AF
>> 8) & IXY
) & 0xff;
572 AF
= (sum
<< 8) | (sum
& 0xa8) | 0x10 |
573 ((sum
== 0) << 6) | partab
[sum
];
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
];
581 case 0xAC: /* XOR IXYH */
582 sum
= ((AF
^ (IXY
)) >> 8) & 0xff;
583 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
585 case 0xAD: /* XOR IXYL */
586 sum
= ((AF
>> 8) ^ IXY
) & 0xff;
587 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
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
];
594 case 0xB4: /* OR IXYH */
595 sum
= ((AF
| (IXY
)) >> 8) & 0xff;
596 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
598 case 0xB5: /* OR IXYL */
599 sum
= ((AF
>> 8) | IXY
) & 0xff;
600 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
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
];
607 case 0xBC: /* CP IXYH */
609 AF
= (AF
& ~0x28) | (temp
& 0x28);
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);
618 case 0xBD: /* CP IXYL */
620 AF
= (AF
& ~0x28) | (temp
& 0x28);
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);
629 case 0xBE: /* CP (IXY+dd) */
630 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
632 AF
= (AF
& ~0x28) | (temp
& 0x28);
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);
641 case 0xCB: /* CB prefix */
642 adr
= IXY
+ (signed char) GetBYTE(PC
); ++PC
;
647 case 0xE1: /* POP IXY */
650 case 0xE3: /* EX (SP),IXY */
651 temp
= IXY
; POP(IXY
); PUSH(temp
);
653 case 0xE5: /* PUSH IXY */
656 case 0xE9: /* JP (IXY) */
659 case 0xF9: /* LD SP,IXY */
662 default: PC
--; /* ignore DD */
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
;
676 FASTWORK temp
, acu
, sum
, cbits
;
689 switch(++PC
,RAM(PC
-1)) {
692 case 0x01: /* LD BC,nnnn */
696 case 0x02: /* LD (BC),A */
697 PutBYTE(BC
, hreg(AF
));
699 case 0x03: /* INC BC */
702 case 0x04: /* INC B */
705 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
706 (((temp
& 0xff) == 0) << 6) |
707 (((temp
& 0xf) == 0) << 4) |
708 ((temp
== 0x80) << 2);
710 case 0x05: /* DEC B */
713 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
714 (((temp
& 0xff) == 0) << 6) |
715 (((temp
& 0xf) == 0xf) << 4) |
716 ((temp
== 0x7f) << 2) | 2;
718 case 0x06: /* LD B,nn */
719 Sethreg(BC
, GetBYTE(PC
)); ++PC
;
721 case 0x07: /* RLCA */
722 AF
= ((AF
>> 7) & 0x0128) | ((AF
<< 1) & ~0x1ff) |
723 (AF
& 0xc4) | ((AF
>> 15) & 1);
725 case 0x08: /* EX AF,AF' */
730 case 0x09: /* ADD HL,BC */
734 cbits
= (HL
^ BC
^ sum
) >> 8;
736 AF
= (AF
& ~0x3b) | ((sum
>> 8) & 0x28) |
737 (cbits
& 0x10) | ((cbits
>> 8) & 1);
739 case 0x0A: /* LD A,(BC) */
740 Sethreg(AF
, GetBYTE(BC
));
742 case 0x0B: /* DEC BC */
745 case 0x0C: /* INC C */
748 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
749 (((temp
& 0xff) == 0) << 6) |
750 (((temp
& 0xf) == 0) << 4) |
751 ((temp
== 0x80) << 2);
753 case 0x0D: /* DEC C */
756 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
757 (((temp
& 0xff) == 0) << 6) |
758 (((temp
& 0xf) == 0xf) << 4) |
759 ((temp
== 0x7f) << 2) | 2;
761 case 0x0E: /* LD C,nn */
762 Setlreg(BC
, GetBYTE(PC
)); ++PC
;
764 case 0x0F: /* RRCA */
767 AF
= ((temp
& 1) << 15) | (sum
<< 8) |
768 (sum
& 0x28) | (AF
& 0xc4) | (temp
& 1);
770 case 0x10: /* DJNZ dd */
771 PC
+= ((BC
-= 0x100) & 0xff00) ? (signed char) GetBYTE(PC
) + 1 : 1;
773 case 0x11: /* LD DE,nnnn */
777 case 0x12: /* LD (DE),A */
778 PutBYTE(DE
, hreg(AF
));
780 case 0x13: /* INC DE */
783 case 0x14: /* INC D */
786 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
787 (((temp
& 0xff) == 0) << 6) |
788 (((temp
& 0xf) == 0) << 4) |
789 ((temp
== 0x80) << 2);
791 case 0x15: /* DEC D */
794 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
795 (((temp
& 0xff) == 0) << 6) |
796 (((temp
& 0xf) == 0xf) << 4) |
797 ((temp
== 0x7f) << 2) | 2;
799 case 0x16: /* LD D,nn */
800 Sethreg(DE
, GetBYTE(PC
)); ++PC
;
803 AF
= ((AF
<< 8) & 0x0100) | ((AF
>> 7) & 0x28) | ((AF
<< 1) & ~0x01ff) |
804 (AF
& 0xc4) | ((AF
>> 15) & 1);
806 case 0x18: /* JR dd */
807 PC
+= (1) ? (signed char) GetBYTE(PC
) + 1 : 1;
809 case 0x19: /* ADD HL,DE */
813 cbits
= (HL
^ DE
^ sum
) >> 8;
815 AF
= (AF
& ~0x3b) | ((sum
>> 8) & 0x28) |
816 (cbits
& 0x10) | ((cbits
>> 8) & 1);
818 case 0x1A: /* LD A,(DE) */
819 Sethreg(AF
, GetBYTE(DE
));
821 case 0x1B: /* DEC DE */
824 case 0x1C: /* INC E */
827 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
828 (((temp
& 0xff) == 0) << 6) |
829 (((temp
& 0xf) == 0) << 4) |
830 ((temp
== 0x80) << 2);
832 case 0x1D: /* DEC E */
835 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
836 (((temp
& 0xff) == 0) << 6) |
837 (((temp
& 0xf) == 0xf) << 4) |
838 ((temp
== 0x7f) << 2) | 2;
840 case 0x1E: /* LD E,nn */
841 Setlreg(DE
, GetBYTE(PC
)); ++PC
;
846 AF
= ((AF
& 1) << 15) | (sum
<< 8) |
847 (sum
& 0x28) | (AF
& 0xc4) | (temp
& 1);
849 case 0x20: /* JR NZ,dd */
850 PC
+= (!TSTFLAG(Z
)) ? (signed char) GetBYTE(PC
) + 1 : 1;
852 case 0x21: /* LD HL,nnnn */
856 case 0x22: /* LD (nnnn),HL */
861 case 0x23: /* INC HL */
864 case 0x24: /* INC H */
867 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
868 (((temp
& 0xff) == 0) << 6) |
869 (((temp
& 0xf) == 0) << 4) |
870 ((temp
== 0x80) << 2);
872 case 0x25: /* DEC H */
875 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
876 (((temp
& 0xff) == 0) << 6) |
877 (((temp
& 0xf) == 0xf) << 4) |
878 ((temp
== 0x7f) << 2) | 2;
880 case 0x26: /* LD H,nn */
881 Sethreg(HL
, GetBYTE(PC
)); ++PC
;
887 if (TSTFLAG(N
)) { /* last operation was a subtract */
888 int hd
= cbits
|| acu
> 0x99;
889 if (TSTFLAG(H
) || (temp
> 9)) { /* adjust low digit */
895 if (hd
) /* adjust high digit */
898 else { /* last operation was an add */
899 if (TSTFLAG(H
) || (temp
> 9)) { /* adjust low digit */
900 SETFLAG(H
, (temp
> 9));
903 if (cbits
|| ((acu
& 0x1f0) > 0x90)) /* adjust high digit */
906 cbits
|= (acu
>> 8) & 1;
908 AF
= (acu
<< 8) | (acu
& 0xa8) | ((acu
== 0) << 6) |
909 (AF
& 0x12) | partab
[acu
] | cbits
;
911 case 0x28: /* JR Z,dd */
912 PC
+= (TSTFLAG(Z
)) ? (signed char) GetBYTE(PC
) + 1 : 1;
914 case 0x29: /* ADD HL,HL */
917 cbits
= (HL
^ HL
^ sum
) >> 8;
919 AF
= (AF
& ~0x3b) | ((sum
>> 8) & 0x28) |
920 (cbits
& 0x10) | ((cbits
>> 8) & 1);
922 case 0x2A: /* LD HL,(nnnn) */
927 case 0x2B: /* DEC HL */
930 case 0x2C: /* INC L */
933 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
934 (((temp
& 0xff) == 0) << 6) |
935 (((temp
& 0xf) == 0) << 4) |
936 ((temp
== 0x80) << 2);
938 case 0x2D: /* DEC L */
941 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
942 (((temp
& 0xff) == 0) << 6) |
943 (((temp
& 0xf) == 0xf) << 4) |
944 ((temp
== 0x7f) << 2) | 2;
946 case 0x2E: /* LD L,nn */
947 Setlreg(HL
, GetBYTE(PC
)); ++PC
;
950 AF
= (~AF
& ~0xff) | (AF
& 0xc5) | ((~AF
>> 8) & 0x28) | 0x12;
952 case 0x30: /* JR NC,dd */
953 PC
+= (!TSTFLAG(C
)) ? (signed char) GetBYTE(PC
) + 1 : 1;
955 case 0x31: /* LD SP,nnnn */
959 case 0x32: /* LD (nnnn),A */
961 PutBYTE(temp
, hreg(AF
));
964 case 0x33: /* INC SP */
967 case 0x34: /* INC (HL) */
968 temp
= GetBYTE(HL
)+1;
970 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
971 (((temp
& 0xff) == 0) << 6) |
972 (((temp
& 0xf) == 0) << 4) |
973 ((temp
== 0x80) << 2);
975 case 0x35: /* DEC (HL) */
976 temp
= GetBYTE(HL
)-1;
978 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
979 (((temp
& 0xff) == 0) << 6) |
980 (((temp
& 0xf) == 0xf) << 4) |
981 ((temp
== 0x7f) << 2) | 2;
983 case 0x36: /* LD (HL),nn */
984 PutBYTE(HL
, GetBYTE(PC
)); ++PC
;
987 AF
= (AF
&~0x3b)|((AF
>>8)&0x28)|1;
989 case 0x38: /* JR C,dd */
990 PC
+= (TSTFLAG(C
)) ? (signed char) GetBYTE(PC
) + 1 : 1;
992 case 0x39: /* ADD HL,SP */
996 cbits
= (HL
^ SP
^ sum
) >> 8;
998 AF
= (AF
& ~0x3b) | ((sum
>> 8) & 0x28) |
999 (cbits
& 0x10) | ((cbits
>> 8) & 1);
1001 case 0x3A: /* LD A,(nnnn) */
1003 Sethreg(AF
, GetBYTE(temp
));
1006 case 0x3B: /* DEC SP */
1009 case 0x3C: /* INC A */
1012 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
1013 (((temp
& 0xff) == 0) << 6) |
1014 (((temp
& 0xf) == 0) << 4) |
1015 ((temp
== 0x80) << 2);
1017 case 0x3D: /* DEC A */
1020 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
1021 (((temp
& 0xff) == 0) << 6) |
1022 (((temp
& 0xf) == 0xf) << 4) |
1023 ((temp
== 0x7f) << 2) | 2;
1025 case 0x3E: /* LD A,nn */
1026 Sethreg(AF
, GetBYTE(PC
)); ++PC
;
1028 case 0x3F: /* CCF */
1029 AF
= (AF
&~0x3b)|((AF
>>8)&0x28)|((AF
&1)<<4)|(~AF
&1);
1031 case 0x40: /* LD B,B */
1034 case 0x41: /* LD B,C */
1035 BC
= (BC
& 255) | ((BC
& 255) << 8);
1037 case 0x42: /* LD B,D */
1038 BC
= (BC
& 255) | (DE
& ~255);
1040 case 0x43: /* LD B,E */
1041 BC
= (BC
& 255) | ((DE
& 255) << 8);
1043 case 0x44: /* LD B,H */
1044 BC
= (BC
& 255) | (HL
& ~255);
1046 case 0x45: /* LD B,L */
1047 BC
= (BC
& 255) | ((HL
& 255) << 8);
1049 case 0x46: /* LD B,(HL) */
1050 Sethreg(BC
, GetBYTE(HL
));
1052 case 0x47: /* LD B,A */
1053 BC
= (BC
& 255) | (AF
& ~255);
1055 case 0x48: /* LD C,B */
1056 BC
= (BC
& ~255) | ((BC
>> 8) & 255);
1058 case 0x49: /* LD C,C */
1061 case 0x4A: /* LD C,D */
1062 BC
= (BC
& ~255) | ((DE
>> 8) & 255);
1064 case 0x4B: /* LD C,E */
1065 BC
= (BC
& ~255) | (DE
& 255);
1067 case 0x4C: /* LD C,H */
1068 BC
= (BC
& ~255) | ((HL
>> 8) & 255);
1070 case 0x4D: /* LD C,L */
1071 BC
= (BC
& ~255) | (HL
& 255);
1073 case 0x4E: /* LD C,(HL) */
1074 Setlreg(BC
, GetBYTE(HL
));
1076 case 0x4F: /* LD C,A */
1077 BC
= (BC
& ~255) | ((AF
>> 8) & 255);
1079 case 0x50: /* LD D,B */
1080 DE
= (DE
& 255) | (BC
& ~255);
1082 case 0x51: /* LD D,C */
1083 DE
= (DE
& 255) | ((BC
& 255) << 8);
1085 case 0x52: /* LD D,D */
1088 case 0x53: /* LD D,E */
1089 DE
= (DE
& 255) | ((DE
& 255) << 8);
1091 case 0x54: /* LD D,H */
1092 DE
= (DE
& 255) | (HL
& ~255);
1094 case 0x55: /* LD D,L */
1095 DE
= (DE
& 255) | ((HL
& 255) << 8);
1097 case 0x56: /* LD D,(HL) */
1098 Sethreg(DE
, GetBYTE(HL
));
1100 case 0x57: /* LD D,A */
1101 DE
= (DE
& 255) | (AF
& ~255);
1103 case 0x58: /* LD E,B */
1104 DE
= (DE
& ~255) | ((BC
>> 8) & 255);
1106 case 0x59: /* LD E,C */
1107 DE
= (DE
& ~255) | (BC
& 255);
1109 case 0x5A: /* LD E,D */
1110 DE
= (DE
& ~255) | ((DE
>> 8) & 255);
1112 case 0x5B: /* LD E,E */
1115 case 0x5C: /* LD E,H */
1116 DE
= (DE
& ~255) | ((HL
>> 8) & 255);
1118 case 0x5D: /* LD E,L */
1119 DE
= (DE
& ~255) | (HL
& 255);
1121 case 0x5E: /* LD E,(HL) */
1122 Setlreg(DE
, GetBYTE(HL
));
1124 case 0x5F: /* LD E,A */
1125 DE
= (DE
& ~255) | ((AF
>> 8) & 255);
1127 case 0x60: /* LD H,B */
1128 HL
= (HL
& 255) | (BC
& ~255);
1130 case 0x61: /* LD H,C */
1131 HL
= (HL
& 255) | ((BC
& 255) << 8);
1133 case 0x62: /* LD H,D */
1134 HL
= (HL
& 255) | (DE
& ~255);
1136 case 0x63: /* LD H,E */
1137 HL
= (HL
& 255) | ((DE
& 255) << 8);
1139 case 0x64: /* LD H,H */
1142 case 0x65: /* LD H,L */
1143 HL
= (HL
& 255) | ((HL
& 255) << 8);
1145 case 0x66: /* LD H,(HL) */
1146 Sethreg(HL
, GetBYTE(HL
));
1148 case 0x67: /* LD H,A */
1149 HL
= (HL
& 255) | (AF
& ~255);
1151 case 0x68: /* LD L,B */
1152 HL
= (HL
& ~255) | ((BC
>> 8) & 255);
1154 case 0x69: /* LD L,C */
1155 HL
= (HL
& ~255) | (BC
& 255);
1157 case 0x6A: /* LD L,D */
1158 HL
= (HL
& ~255) | ((DE
>> 8) & 255);
1160 case 0x6B: /* LD L,E */
1161 HL
= (HL
& ~255) | (DE
& 255);
1163 case 0x6C: /* LD L,H */
1164 HL
= (HL
& ~255) | ((HL
>> 8) & 255);
1166 case 0x6D: /* LD L,L */
1169 case 0x6E: /* LD L,(HL) */
1170 Setlreg(HL
, GetBYTE(HL
));
1172 case 0x6F: /* LD L,A */
1173 HL
= (HL
& ~255) | ((AF
>> 8) & 255);
1175 case 0x70: /* LD (HL),B */
1176 PutBYTE(HL
, hreg(BC
));
1178 case 0x71: /* LD (HL),C */
1179 PutBYTE(HL
, lreg(BC
));
1181 case 0x72: /* LD (HL),D */
1182 PutBYTE(HL
, hreg(DE
));
1184 case 0x73: /* LD (HL),E */
1185 PutBYTE(HL
, lreg(DE
));
1187 case 0x74: /* LD (HL),H */
1188 PutBYTE(HL
, hreg(HL
));
1190 case 0x75: /* LD (HL),L */
1191 PutBYTE(HL
, lreg(HL
));
1193 case 0x76: /* HALT */
1196 case 0x77: /* LD (HL),A */
1197 PutBYTE(HL
, hreg(AF
));
1199 case 0x78: /* LD A,B */
1200 AF
= (AF
& 255) | (BC
& ~255);
1202 case 0x79: /* LD A,C */
1203 AF
= (AF
& 255) | ((BC
& 255) << 8);
1205 case 0x7A: /* LD A,D */
1206 AF
= (AF
& 255) | (DE
& ~255);
1208 case 0x7B: /* LD A,E */
1209 AF
= (AF
& 255) | ((DE
& 255) << 8);
1211 case 0x7C: /* LD A,H */
1212 AF
= (AF
& 255) | (HL
& ~255);
1214 case 0x7D: /* LD A,L */
1215 AF
= (AF
& 255) | ((HL
& 255) << 8);
1217 case 0x7E: /* LD A,(HL) */
1218 Sethreg(AF
, GetBYTE(HL
));
1220 case 0x7F: /* LD A,A */
1223 case 0x80: /* ADD A,B */
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) |
1233 case 0x81: /* ADD A,C */
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) |
1243 case 0x82: /* ADD A,D */
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) |
1253 case 0x83: /* ADD A,E */
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) |
1263 case 0x84: /* ADD A,H */
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) |
1273 case 0x85: /* ADD A,L */
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) |
1283 case 0x86: /* ADD A,(HL) */
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) |
1293 case 0x87: /* ADD A,A */
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) |
1303 case 0x88: /* ADC A,B */
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) |
1313 case 0x89: /* ADC A,C */
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) |
1323 case 0x8A: /* ADC A,D */
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) |
1333 case 0x8B: /* ADC A,E */
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) |
1343 case 0x8C: /* ADC A,H */
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) |
1353 case 0x8D: /* ADC A,L */
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) |
1363 case 0x8E: /* ADC A,(HL) */
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) |
1373 case 0x8F: /* ADC A,A */
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) |
1383 case 0x90: /* SUB B */
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 |
1393 case 0x91: /* SUB C */
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 |
1403 case 0x92: /* SUB D */
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 |
1413 case 0x93: /* SUB E */
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 |
1423 case 0x94: /* SUB H */
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 |
1433 case 0x95: /* SUB L */
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 |
1443 case 0x96: /* SUB (HL) */
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 |
1453 case 0x97: /* SUB A */
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 |
1463 case 0x98: /* SBC A,B */
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 |
1473 case 0x99: /* SBC A,C */
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 |
1483 case 0x9A: /* SBC A,D */
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 |
1493 case 0x9B: /* SBC A,E */
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 |
1503 case 0x9C: /* SBC A,H */
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 |
1513 case 0x9D: /* SBC A,L */
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 |
1523 case 0x9E: /* SBC A,(HL) */
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 |
1533 case 0x9F: /* SBC A,A */
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 |
1543 case 0xA0: /* AND B */
1544 sum
= ((AF
& (BC
)) >> 8) & 0xff;
1545 AF
= (sum
<< 8) | (sum
& 0xa8) |
1546 ((sum
== 0) << 6) | 0x10 | partab
[sum
];
1548 case 0xA1: /* AND C */
1549 sum
= ((AF
>> 8) & BC
) & 0xff;
1550 AF
= (sum
<< 8) | (sum
& 0xa8) | 0x10 |
1551 ((sum
== 0) << 6) | partab
[sum
];
1553 case 0xA2: /* AND D */
1554 sum
= ((AF
& (DE
)) >> 8) & 0xff;
1555 AF
= (sum
<< 8) | (sum
& 0xa8) |
1556 ((sum
== 0) << 6) | 0x10 | partab
[sum
];
1558 case 0xA3: /* AND E */
1559 sum
= ((AF
>> 8) & DE
) & 0xff;
1560 AF
= (sum
<< 8) | (sum
& 0xa8) | 0x10 |
1561 ((sum
== 0) << 6) | partab
[sum
];
1563 case 0xA4: /* AND H */
1564 sum
= ((AF
& (HL
)) >> 8) & 0xff;
1565 AF
= (sum
<< 8) | (sum
& 0xa8) |
1566 ((sum
== 0) << 6) | 0x10 | partab
[sum
];
1568 case 0xA5: /* AND L */
1569 sum
= ((AF
>> 8) & HL
) & 0xff;
1570 AF
= (sum
<< 8) | (sum
& 0xa8) | 0x10 |
1571 ((sum
== 0) << 6) | partab
[sum
];
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
];
1578 case 0xA7: /* AND A */
1579 sum
= ((AF
& (AF
)) >> 8) & 0xff;
1580 AF
= (sum
<< 8) | (sum
& 0xa8) |
1581 ((sum
== 0) << 6) | 0x10 | partab
[sum
];
1583 case 0xA8: /* XOR B */
1584 sum
= ((AF
^ (BC
)) >> 8) & 0xff;
1585 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
1587 case 0xA9: /* XOR C */
1588 sum
= ((AF
>> 8) ^ BC
) & 0xff;
1589 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
1591 case 0xAA: /* XOR D */
1592 sum
= ((AF
^ (DE
)) >> 8) & 0xff;
1593 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
1595 case 0xAB: /* XOR E */
1596 sum
= ((AF
>> 8) ^ DE
) & 0xff;
1597 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
1599 case 0xAC: /* XOR H */
1600 sum
= ((AF
^ (HL
)) >> 8) & 0xff;
1601 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
1603 case 0xAD: /* XOR L */
1604 sum
= ((AF
>> 8) ^ HL
) & 0xff;
1605 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
1607 case 0xAE: /* XOR (HL) */
1608 sum
= ((AF
>> 8) ^ GetBYTE(HL
)) & 0xff;
1609 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
1611 case 0xAF: /* XOR A */
1612 sum
= ((AF
^ (AF
)) >> 8) & 0xff;
1613 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
1615 case 0xB0: /* OR B */
1616 sum
= ((AF
| (BC
)) >> 8) & 0xff;
1617 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
1619 case 0xB1: /* OR C */
1620 sum
= ((AF
>> 8) | BC
) & 0xff;
1621 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
1623 case 0xB2: /* OR D */
1624 sum
= ((AF
| (DE
)) >> 8) & 0xff;
1625 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
1627 case 0xB3: /* OR E */
1628 sum
= ((AF
>> 8) | DE
) & 0xff;
1629 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
1631 case 0xB4: /* OR H */
1632 sum
= ((AF
| (HL
)) >> 8) & 0xff;
1633 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
1635 case 0xB5: /* OR L */
1636 sum
= ((AF
>> 8) | HL
) & 0xff;
1637 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
1639 case 0xB6: /* OR (HL) */
1640 sum
= ((AF
>> 8) | GetBYTE(HL
)) & 0xff;
1641 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
1643 case 0xB7: /* OR A */
1644 sum
= ((AF
| (AF
)) >> 8) & 0xff;
1645 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
1647 case 0xB8: /* CP B */
1649 AF
= (AF
& ~0x28) | (temp
& 0x28);
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);
1658 case 0xB9: /* CP C */
1660 AF
= (AF
& ~0x28) | (temp
& 0x28);
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);
1669 case 0xBA: /* CP D */
1671 AF
= (AF
& ~0x28) | (temp
& 0x28);
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);
1680 case 0xBB: /* CP E */
1682 AF
= (AF
& ~0x28) | (temp
& 0x28);
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);
1691 case 0xBC: /* CP H */
1693 AF
= (AF
& ~0x28) | (temp
& 0x28);
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);
1702 case 0xBD: /* CP L */
1704 AF
= (AF
& ~0x28) | (temp
& 0x28);
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);
1713 case 0xBE: /* CP (HL) */
1715 AF
= (AF
& ~0x28) | (temp
& 0x28);
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);
1724 case 0xBF: /* CP A */
1726 AF
= (AF
& ~0x28) | (temp
& 0x28);
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);
1735 case 0xC0: /* RET NZ */
1736 if (!TSTFLAG(Z
)) POP(PC
);
1738 case 0xC1: /* POP BC */
1741 case 0xC2: /* JP NZ,nnnn */
1744 case 0xC3: /* JP nnnn */
1747 case 0xC4: /* CALL NZ,nnnn */
1750 case 0xC5: /* PUSH BC */
1753 case 0xC6: /* ADD A,nn */
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) |
1764 case 0xC7: /* RST 0 */
1767 case 0xC8: /* RET Z */
1768 if (TSTFLAG(Z
)) POP(PC
);
1770 case 0xC9: /* RET */
1773 case 0xCA: /* JP Z,nnnn */
1776 case 0xCB: /* CB prefix */
1781 case 0xCC: /* CALL Z,nnnn */
1784 case 0xCD: /* CALL nnnn */
1787 case 0xCE: /* ADC A,nn */
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) |
1798 case 0xCF: /* RST 8 */
1801 case 0xD0: /* RET NC */
1802 if (!TSTFLAG(C
)) POP(PC
);
1804 case 0xD1: /* POP DE */
1807 case 0xD2: /* JP NC,nnnn */
1810 case 0xD3: /* OUT (nn),A */
1811 Output(GetBYTE(PC
), hreg(AF
)); ++PC
;
1813 case 0xD4: /* CALL NC,nnnn */
1816 case 0xD5: /* PUSH DE */
1819 case 0xD6: /* SUB nn */
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 |
1830 case 0xD7: /* RST 10H */
1831 PUSH(PC
); PC
= 0x10;
1833 case 0xD8: /* RET C */
1834 if (TSTFLAG(C
)) POP(PC
);
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
;
1845 case 0xDA: /* JP C,nnnn */
1848 case 0xDB: /* IN A,(nn) */
1849 Sethreg(AF
, Input(GetBYTE(PC
))); ++PC
;
1851 case 0xDC: /* CALL C,nnnn */
1854 case 0xDD: /* DD prefix */
1856 ix
= dfd_prefix(ix
);
1859 case 0xDE: /* SBC A,nn */
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 |
1870 case 0xDF: /* RST 18H */
1871 PUSH(PC
); PC
= 0x18;
1873 case 0xE0: /* RET PO */
1874 if (!TSTFLAG(P
)) POP(PC
);
1876 case 0xE1: /* POP HL */
1879 case 0xE2: /* JP PO,nnnn */
1882 case 0xE3: /* EX (SP),HL */
1883 temp
= HL
; POP(HL
); PUSH(temp
);
1885 case 0xE4: /* CALL PO,nnnn */
1888 case 0xE5: /* PUSH HL */
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
];
1897 case 0xE7: /* RST 20H */
1898 PUSH(PC
); PC
= 0x20;
1900 case 0xE8: /* RET PE */
1901 if (TSTFLAG(P
)) POP(PC
);
1903 case 0xE9: /* JP (HL) */
1906 case 0xEA: /* JP PE,nnnn */
1909 case 0xEB: /* EX DE,HL */
1910 temp
= HL
; HL
= DE
; DE
= temp
;
1912 case 0xEC: /* CALL PE,nnnn */
1915 case 0xED: /* ED prefix */
1916 switch (++PC
, op
= GetBYTE(PC
-1)) {
1917 case 0x40: /* IN B,(C) */
1918 temp
= Input(lreg(BC
));
1920 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
1921 (((temp
& 0xff) == 0) << 6) |
1924 case 0x41: /* OUT (C),B */
1925 Output(lreg(BC
), BC
);
1927 case 0x42: /* SBC HL,BC */
1930 sum
= HL
- BC
- TSTFLAG(C
);
1931 cbits
= (HL
^ BC
^ sum
) >> 8;
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);
1938 case 0x43: /* LD (nnnn),BC */
1943 case 0x44: /* NEG */
1945 AF
= (-(AF
& 0xff00) & 0xff00);
1946 AF
|= ((AF
>> 8) & 0xa8) | (((AF
& 0xff00) == 0) << 6) |
1947 (((temp
& 0x0f) != 0) << 4) | ((temp
== 0x80) << 2) |
1950 case 0x45: /* RETN */
1954 case 0x46: /* IM 0 */
1955 /* interrupt mode 0 */
1957 case 0x47: /* LD I,A */
1958 ir
= (ir
& 255) | (AF
& ~255);
1960 case 0x48: /* IN C,(C) */
1961 temp
= Input(lreg(BC
));
1963 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
1964 (((temp
& 0xff) == 0) << 6) |
1967 case 0x49: /* OUT (C),C */
1968 Output(lreg(BC
), BC
);
1970 case 0x4A: /* ADC HL,BC */
1973 sum
= HL
+ BC
+ TSTFLAG(C
);
1974 cbits
= (HL
^ BC
^ sum
) >> 8;
1976 AF
= (AF
& ~0xff) | ((sum
>> 8) & 0xa8) |
1977 (((sum
& 0xffff) == 0) << 6) |
1978 (((cbits
>> 6) ^ (cbits
>> 5)) & 4) |
1979 (cbits
& 0x10) | ((cbits
>> 8) & 1);
1981 case 0x4B: /* LD BC,(nnnn) */
1986 case 0x4D: /* RETI */
1990 case 0x4F: /* LD R,A */
1991 ir
= (ir
& ~255) | ((AF
>> 8) & 255);
1993 case 0x50: /* IN D,(C) */
1994 temp
= Input(lreg(BC
));
1996 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
1997 (((temp
& 0xff) == 0) << 6) |
2000 case 0x51: /* OUT (C),D */
2001 Output(lreg(BC
), DE
);
2003 case 0x52: /* SBC HL,DE */
2006 sum
= HL
- DE
- TSTFLAG(C
);
2007 cbits
= (HL
^ DE
^ sum
) >> 8;
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);
2014 case 0x53: /* LD (nnnn),DE */
2019 case 0x56: /* IM 1 */
2020 /* interrupt mode 1 */
2022 case 0x57: /* LD A,I */
2023 AF
= (AF
& 0x29) | (ir
& ~255) | ((ir
>> 8) & 0x80) | (((ir
& ~255) == 0) << 6) | ((IFF
& 2) << 1);
2025 case 0x58: /* IN E,(C) */
2026 temp
= Input(lreg(BC
));
2028 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
2029 (((temp
& 0xff) == 0) << 6) |
2032 case 0x59: /* OUT (C),E */
2033 Output(lreg(BC
), DE
);
2035 case 0x5A: /* ADC HL,DE */
2038 sum
= HL
+ DE
+ TSTFLAG(C
);
2039 cbits
= (HL
^ DE
^ sum
) >> 8;
2041 AF
= (AF
& ~0xff) | ((sum
>> 8) & 0xa8) |
2042 (((sum
& 0xffff) == 0) << 6) |
2043 (((cbits
>> 6) ^ (cbits
>> 5)) & 4) |
2044 (cbits
& 0x10) | ((cbits
>> 8) & 1);
2046 case 0x5B: /* LD DE,(nnnn) */
2051 case 0x5E: /* IM 2 */
2052 /* interrupt mode 2 */
2054 case 0x5F: /* LD A,R */
2055 AF
= (AF
& 0x29) | ((ir
& 255) << 8) | (ir
& 0x80) | (((ir
& 255) == 0) << 6) | ((IFF
& 2) << 1);
2057 case 0x60: /* IN H,(C) */
2058 temp
= Input(lreg(BC
));
2060 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
2061 (((temp
& 0xff) == 0) << 6) |
2064 case 0x61: /* OUT (C),H */
2065 Output(lreg(BC
), HL
);
2067 case 0x62: /* SBC HL,HL */
2069 sum
= HL
- HL
- TSTFLAG(C
);
2070 cbits
= (HL
^ HL
^ sum
) >> 8;
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);
2077 case 0x63: /* LD (nnnn),HL */
2082 case 0x67: /* RRD */
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);
2090 case 0x68: /* IN L,(C) */
2091 temp
= Input(lreg(BC
));
2093 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
2094 (((temp
& 0xff) == 0) << 6) |
2097 case 0x69: /* OUT (C),L */
2098 Output(lreg(BC
), HL
);
2100 case 0x6A: /* ADC HL,HL */
2102 sum
= HL
+ HL
+ TSTFLAG(C
);
2103 cbits
= (HL
^ HL
^ sum
) >> 8;
2105 AF
= (AF
& ~0xff) | ((sum
>> 8) & 0xa8) |
2106 (((sum
& 0xffff) == 0) << 6) |
2107 (((cbits
>> 6) ^ (cbits
>> 5)) & 4) |
2108 (cbits
& 0x10) | ((cbits
>> 8) & 1);
2110 case 0x6B: /* LD HL,(nnnn) */
2115 case 0x6F: /* RLD */
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);
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) |
2130 case 0x71: /* OUT (C),0 */
2131 Output(lreg(BC
), 0);
2133 case 0x72: /* SBC HL,SP */
2136 sum
= HL
- SP
- TSTFLAG(C
);
2137 cbits
= (HL
^ SP
^ sum
) >> 8;
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);
2144 case 0x73: /* LD (nnnn),SP */
2149 case 0x78: /* IN A,(C) */
2150 temp
= Input(lreg(BC
));
2152 AF
= (AF
& ~0xfe) | (temp
& 0xa8) |
2153 (((temp
& 0xff) == 0) << 6) |
2156 case 0x79: /* OUT (C),A */
2157 Output(lreg(BC
), AF
);
2159 case 0x7A: /* ADC HL,SP */
2162 sum
= HL
+ SP
+ TSTFLAG(C
);
2163 cbits
= (HL
^ SP
^ sum
) >> 8;
2165 AF
= (AF
& ~0xff) | ((sum
>> 8) & 0xa8) |
2166 (((sum
& 0xffff) == 0) << 6) |
2167 (((cbits
>> 6) ^ (cbits
>> 5)) & 4) |
2168 (cbits
& 0x10) | ((cbits
>> 8) & 1);
2170 case 0x7B: /* LD SP,(nnnn) */
2175 case 0xA0: /* LDI */
2176 acu
= GetBYTE(HL
); ++HL
;
2177 PutBYTE(DE
, acu
); ++DE
;
2179 AF
= (AF
& ~0x3e) | (acu
& 8) | ((acu
& 2) << 4) |
2180 (((--BC
& 0xffff) != 0) << 2);
2182 case 0xA1: /* CPI */
2184 temp
= GetBYTE(HL
); ++HL
;
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)
2194 case 0xA2: /* INI */
2195 PutBYTE(HL
, Input(lreg(BC
))); ++HL
;
2197 SETFLAG(P
, (--BC
& 0xffff) != 0);
2199 case 0xA3: /* OUTI */
2200 Output(lreg(BC
), GetBYTE(HL
)); ++HL
;
2202 Sethreg(BC
, lreg(BC
) - 1);
2203 SETFLAG(Z
, lreg(BC
) == 0);
2205 case 0xA8: /* LDD */
2206 acu
= GetBYTE(HL
); --HL
;
2207 PutBYTE(DE
, acu
); --DE
;
2209 AF
= (AF
& ~0x3e) | (acu
& 8) | ((acu
& 2) << 4) |
2210 (((--BC
& 0xffff) != 0) << 2);
2212 case 0xA9: /* CPD */
2214 temp
= GetBYTE(HL
); --HL
;
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)
2224 case 0xAA: /* IND */
2225 PutBYTE(HL
, Input(lreg(BC
))); --HL
;
2227 Sethreg(BC
, lreg(BC
) - 1);
2228 SETFLAG(Z
, lreg(BC
) == 0);
2230 case 0xAB: /* OUTD */
2231 Output(lreg(BC
), GetBYTE(HL
)); --HL
;
2233 Sethreg(BC
, lreg(BC
) - 1);
2234 SETFLAG(Z
, lreg(BC
) == 0);
2236 case 0xB0: /* LDIR */
2240 acu
= GetBYTE(HL
); ++HL
;
2241 PutBYTE(DE
, acu
); ++DE
;
2244 AF
= (AF
& ~0x3e) | (acu
& 8) | ((acu
& 2) << 4);
2246 case 0xB1: /* CPIR */
2250 temp
= GetBYTE(HL
); ++HL
;
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) |
2259 if ((sum
& 15) == 8 && (cbits
& 16) != 0)
2262 case 0xB2: /* INIR */
2265 PutBYTE(HL
, Input(lreg(BC
))); ++HL
;
2271 case 0xB3: /* OTIR */
2274 Output(lreg(BC
), GetBYTE(HL
)); ++HL
;
2280 case 0xB8: /* LDDR */
2283 acu
= GetBYTE(HL
); --HL
;
2284 PutBYTE(DE
, acu
); --DE
;
2287 AF
= (AF
& ~0x3e) | (acu
& 8) | ((acu
& 2) << 4);
2289 case 0xB9: /* CPDR */
2293 temp
= GetBYTE(HL
); --HL
;
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) |
2302 if ((sum
& 15) == 8 && (cbits
& 16) != 0)
2305 case 0xBA: /* INDR */
2308 PutBYTE(HL
, Input(lreg(BC
))); --HL
;
2314 case 0xBB: /* OTDR */
2317 Output(lreg(BC
), GetBYTE(HL
)); --HL
;
2323 default: if (0x40 <= op
&& op
<= 0x7f) PC
--; /* ignore ED */
2326 case 0xEE: /* XOR nn */
2327 sum
= ((AF
>> 8) ^ GetBYTE(PC
)) & 0xff;
2328 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
2331 case 0xEF: /* RST 28H */
2332 PUSH(PC
); PC
= 0x28;
2334 case 0xF0: /* RET P */
2335 if (!TSTFLAG(S
)) POP(PC
);
2337 case 0xF1: /* POP AF */
2340 case 0xF2: /* JP P,nnnn */
2346 case 0xF4: /* CALL P,nnnn */
2349 case 0xF5: /* PUSH AF */
2352 case 0xF6: /* OR nn */
2353 sum
= ((AF
>> 8) | GetBYTE(PC
)) & 0xff;
2354 AF
= (sum
<< 8) | (sum
& 0xa8) | ((sum
== 0) << 6) | partab
[sum
];
2357 case 0xF7: /* RST 30H */
2358 PUSH(PC
); PC
= 0x30;
2360 case 0xF8: /* RET M */
2361 if (TSTFLAG(S
)) POP(PC
);
2363 case 0xF9: /* LD SP,HL */
2366 case 0xFA: /* JP M,nnnn */
2372 case 0xFC: /* CALL M,nnnn */
2375 case 0xFD: /* FD prefix */
2377 iy
= dfd_prefix(iy
);
2380 case 0xFE: /* CP nn */
2382 AF
= (AF
& ~0x28) | (temp
& 0x28);
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);
2392 case 0xFF: /* RST 38H */
2393 PUSH(PC
); PC
= 0x38;
2396 /* make registers visible for debugging if interrupted */
2398 return (PC
&0xffff)|0x10000; /* flag non-bios stop */