1 /******************************************************************************
\r
3 * CZ80 ED opcode include source file
\r
4 * CZ80 emulator version 0.9
\r
5 * Copyright 2004-2005 Stéphane Dallongeville
\r
9 *****************************************************************************/
\r
11 #if CZ80_USE_JUMPTABLE
\r
12 goto *JumpTableED[Opcode];
\r
18 /*-----------------------------------------
\r
20 -----------------------------------------*/
\r
216 /*-----------------------------------------
\r
218 -----------------------------------------*/
\r
220 OPED(0x47): // LD I,A
\r
224 OPED(0x4f): // LD R,A
\r
225 #if CZ80_EMULATE_R_EXACTLY
\r
228 zR = zA - ((cycles - CPU->ICount) >> 2);
\r
233 OPED(0x57): // LD A,I
\r
235 zF = (zF & CF) | SZ[zA] | zIFF2;
\r
238 OPED(0x5f): // LD A,R
\r
239 #if CZ80_EMULATE_R_EXACTLY
\r
240 zA = (zR & 0x7f) | zR2;
\r
242 zA = ((zR + ((cycles - CPU->ICount) >> 2)) & 0x7f) | zR2;
\r
244 zF = (zF & CF) | SZ[zA] | zIFF2;
\r
247 /*-----------------------------------------
\r
249 -----------------------------------------*/
\r
251 OPED(0x43): // LD (w),BC
\r
255 OPED(0x53): // LD (w),DE
\r
259 OPED(0x63): // LD (w),HL
\r
263 OPED(0x73): // LD (w),SP
\r
267 OPED(0x4b): // LD BC,(w)
\r
271 OPED(0x5b): // LD DE,(w)
\r
275 OPED(0x6b): // LD HL,(w)
\r
279 OPED(0x7b): // LD SP,(w)
\r
283 /*-----------------------------------------
\r
285 -----------------------------------------*/
\r
299 /*-----------------------------------------
\r
301 -----------------------------------------*/
\r
303 OPED(0x67): // RRD (HL)
\r
305 val = READ_MEM8(adr);
\r
306 WRITE_MEM8(adr, (val >> 4) | (zA << 4));
\r
307 zA = (zA & 0xf0) | (val & 0x0f);
\r
308 zF = (zF & CF) | SZP[zA];
\r
311 /*-----------------------------------------
\r
313 -----------------------------------------*/
\r
315 OPED(0x6f): // RLD (HL)
\r
317 val = READ_MEM8(adr);
\r
318 WRITE_MEM8(adr, (val << 4) | (zA & 0x0f));
\r
319 zA = (zA & 0xf0) | (val >> 4);
\r
320 zF = (zF & CF) | SZP[zA];
\r
323 /*-----------------------------------------
\r
325 -----------------------------------------*/
\r
327 OPED(0x7a): // ADC HL,SP
\r
331 OPED(0x4a): // ADC HL,BC
\r
332 OPED(0x5a): // ADC HL,DE
\r
333 OPED(0x6a): // ADC HL,HL
\r
334 val = zR16((Opcode >> 4) & 3);
\r
337 res = zHL + val + (zF & CF);
\r
338 zF = (((zHL ^ res ^ val) >> 8) & HF) |
\r
339 ((res >> 16) & CF) |
\r
340 ((res >> 8) & (SF | YF | XF)) |
\r
341 ((res & 0xffff) ? 0 : ZF) |
\r
342 (((val ^ zHL ^ 0x8000) & (val ^ res) & 0x8000) >> 13);
\r
346 /*-----------------------------------------
\r
348 -----------------------------------------*/
\r
350 OPED(0x72): // SBC HL,SP
\r
354 OPED(0x42): // SBC HL,BC
\r
355 OPED(0x52): // SBC HL,DE
\r
356 OPED(0x62): // SBC HL,HL
\r
357 val = zR16((Opcode >> 4) & 3);
\r
360 res = zHL - val - (zF & CF);
\r
361 zF = (((zHL ^ res ^ val) >> 8) & HF) | NF |
\r
362 ((res >> 16) & CF) |
\r
363 ((res >> 8) & (SF | YF | XF)) |
\r
364 ((res & 0xffff) ? 0 : ZF) |
\r
365 (((val ^ zHL) & (zHL ^ res) & 0x8000) >> 13);
\r
369 /*-----------------------------------------
\r
371 -----------------------------------------*/
\r
373 OPED(0x40): // IN B,(C)
\r
374 OPED(0x48): // IN C,(C)
\r
375 OPED(0x50): // IN D,(C)
\r
376 OPED(0x58): // IN E,(C)
\r
377 OPED(0x60): // IN H,(C)
\r
378 OPED(0x68): // IN L,(C)
\r
379 OPED(0x78): // IN E,(C)
\r
381 zR8((Opcode >> 3) & 7) = res;
\r
382 zF = (zF & CF) | SZP[res];
\r
385 OPED(0x70): // IN 0,(C)
\r
387 zF = (zF & CF) | SZP[res];
\r
390 /*-----------------------------------------
\r
392 -----------------------------------------*/
\r
394 OPED(0x51): // OUT (C),D
\r
395 OPED(0x41): // OUT (C),B
\r
396 OPED(0x49): // OUT (C),C
\r
397 OPED(0x59): // OUT (C),E
\r
398 OPED(0x61): // OUT (C),H
\r
399 OPED(0x69): // OUT (C),L
\r
400 OPED(0x79): // OUT (C),E
\r
401 res = zR8((Opcode >> 3) & 7);
\r
405 OPED(0x71): // OUT (C),0
\r
409 /*-----------------------------------------
\r
411 -----------------------------------------*/
\r
413 // works the same, but Z80 PIO can detect the opcode
\r
414 OPED(0x45): // RETN
\r
415 OPED(0x55): // RETN
\r
416 OPED(0x65): // RETN
\r
417 OPED(0x75): // RETN
\r
419 OPED(0x4d): // RETI
\r
420 OPED(0x5d): // RETI
\r
421 OPED(0x6d): // RETI
\r
422 OPED(0x7d): // RETI
\r
425 if (!zIFF1 && zIFF2)
\r
429 CPU->Status |= CZ80_HAS_INT;
\r
435 /*-----------------------------------------
\r
437 -----------------------------------------*/
\r
439 OPED(0x46): // IM 0
\r
440 OPED(0x4e): // IM 0
\r
441 OPED(0x66): // IM 0
\r
442 OPED(0x6e): // IM 0
\r
446 OPED(0x56): // IM 1
\r
447 OPED(0x76): // IM 1
\r
451 OPED(0x5e): // IM 2
\r
452 OPED(0x7e): // IM 2
\r
461 /*-----------------------------------------
\r
463 -----------------------------------------*/
\r
466 val = READ_MEM8(zHL++);
\r
467 WRITE_MEM8(zDE++, val);
\r
471 val = READ_MEM8(zHL--);
\r
472 WRITE_MEM8(zDE--, val);
\r
475 F = zF & (SF | ZF | CF);
\r
476 if ((zA + val) & 0x02) F |= YF;
\r
477 if ((zA + val) & 0x08) F |= XF;
\r
478 if (--zBC) F |= VF;
\r
482 /*-----------------------------------------
\r
484 -----------------------------------------*/
\r
486 OPED(0xb0): // LDIR
\r
489 val = READ_MEM8(zHL++);
\r
490 WRITE_MEM8(zDE++, val);
\r
493 } while (zBC && (CPU->ICount > -4) && !CPU->Status);
\r
496 OPED(0xb8): // LDDR
\r
499 val = READ_MEM8(zHL--);
\r
500 WRITE_MEM8(zDE--, val);
\r
503 } while (zBC && (CPU->ICount > -4) && !CPU->Status);
\r
506 F = zF & (SF | ZF | CF);
\r
507 if ((zA + val) & 0x02) F |= YF;
\r
508 if ((zA + val) & 0x08) F |= XF;
\r
513 #if CZ80_EMULATE_R_EXACTLY
\r
523 /*-----------------------------------------
\r
525 -----------------------------------------*/
\r
528 val = READ_MEM8(zHL++);
\r
532 val = READ_MEM8(zHL--);
\r
536 F = (zF & CF) | (SZ[res] & ~(YF | XF)) | ((zA ^ val ^ res) & HF) | NF;
\r
538 if (res & 0x02) F |= YF;
\r
539 if (res & 0x08) F |= XF;
\r
540 if (--zBC) F |= VF;
\r
544 /*-----------------------------------------
\r
546 -----------------------------------------*/
\r
548 OPED(0xb1): // CPIR
\r
551 val = READ_MEM8(zHL++);
\r
554 F = (zF & CF) | (SZ[res] & ~(YF | XF)) | ((zA ^ val ^ res) & HF) | NF;
\r
556 if (res & 0x02) F |= YF;
\r
557 if (res & 0x08) F |= XF;
\r
561 } while (zBC && !(F & ZF) && (CPU->ICount > -4) && !CPU->Status);
\r
564 OPED(0xb9): // CPDR
\r
567 val = READ_MEM8(zHL--);
\r
570 F = (zF & CF) | (SZ[res] & ~(YF | XF)) | ((zA ^ val ^ res) & HF) | NF;
\r
572 if (res & 0x02) F |= YF;
\r
573 if (res & 0x08) F |= XF;
\r
577 } while (zBC && !(F & ZF) && (CPU->ICount > -4) && !CPU->Status);
\r
580 if (zBC && !(F & ZF))
\r
583 #if CZ80_EMULATE_R_EXACTLY
\r
592 /*-----------------------------------------
\r
594 -----------------------------------------*/
\r
599 WRITE_MEM8(zHL++, val);
\r
605 WRITE_MEM8(zHL--, val);
\r
609 res = ((UINT32)(zC - 1) & 0xff) + (UINT32)val;
\r
610 if (val & SF) F |= NF;
\r
611 if (res < val) F |= HF | CF;
\r
612 F |= SZP[(UINT8)(res & 0x07) ^ zB] & PF;
\r
616 /*-----------------------------------------
\r
618 -----------------------------------------*/
\r
620 OPED(0xb2): // INIR
\r
625 WRITE_MEM8(zHL++, val);
\r
627 } while (zB && (CPU->ICount > -4) && !CPU->Status);
\r
630 OPED(0xba): // INDR
\r
635 WRITE_MEM8(zHL--, val);
\r
637 } while (zB && (CPU->ICount > -4) && !CPU->Status);
\r
641 res = ((UINT32)(zC - 1) & 0xff) + (UINT32)val;
\r
642 if (val & SF) F |= NF;
\r
643 if (res < val) F |= HF | CF;
\r
644 F |= SZP[(UINT8)(res & 0x07) ^ zB] & PF;
\r
649 #if CZ80_EMULATE_R_EXACTLY
\r
658 /*-----------------------------------------
\r
660 -----------------------------------------*/
\r
662 OPED(0xa3): // OUTI
\r
663 val = READ_MEM8(zHL++);
\r
668 OPED(0xab): // OUTD
\r
669 val = READ_MEM8(zHL--);
\r
675 res = (UINT32)zL + (UINT32)val;
\r
676 if (val & SF) F |= NF;
\r
677 if (res < val) F |= HF | CF;
\r
678 F |= SZP[(UINT8)(res & 0x07) ^ zB] & PF;
\r
682 /*-----------------------------------------
\r
684 -----------------------------------------*/
\r
686 OPED(0xb3): // OTIR
\r
689 val = READ_MEM8(zHL++);
\r
693 } while (zB && (CPU->ICount > -4) && !CPU->Status);
\r
696 OPED(0xbb): // OTDR
\r
699 val = READ_MEM8(zHL--);
\r
703 } while (zB && (CPU->ICount > -4) && !CPU->Status);
\r
707 res = (UINT32)zL + (UINT32)val;
\r
708 if (val & SF) F |= NF;
\r
709 if (res < val) F |= HF | CF;
\r
710 F |= SZP[(UINT8)(res & 0x07) ^ zB] & PF;
\r
715 #if CZ80_EMULATE_R_EXACTLY
\r
725 #if !CZ80_USE_JUMPTABLE
\r