comparison z80_to_x86.c @ 238:827ebce557bf

Added the rest of the conditions to JPCC, implemented CALLCC (untested)
author Mike Pavone <pavone@retrodev.com>
date Fri, 26 Apr 2013 09:51:57 -0700
parents 19fb3523a9e5
children a5bea9711a46
comparison
equal deleted inserted replaced
237:7ccc4ae86e07 238:827ebce557bf
574 case Z80_CC_NC: 574 case Z80_CC_NC:
575 cond = CC_NZ; 575 cond = CC_NZ;
576 case Z80_CC_C: 576 case Z80_CC_C:
577 dst = cmp_irdisp8(dst, 0, CONTEXT, zf_off(ZF_C), SZ_B); 577 dst = cmp_irdisp8(dst, 0, CONTEXT, zf_off(ZF_C), SZ_B);
578 break; 578 break;
579 case Z80_CC_PO:
580 cond = CC_NZ;
581 case Z80_CC_PE:
582 dst = cmp_irdisp8(dst, 0, CONTEXT, zf_off(ZF_PV), SZ_B);
583 break;
584 case Z80_CC_P:
585 case Z80_CC_M:
586 dst = cmp_irdisp8(dst, 0, CONTEXT, zf_off(ZF_S), SZ_B);
587 break;
579 } 588 }
580 uint8_t *no_jump_off = dst+1; 589 uint8_t *no_jump_off = dst+1;
581 dst = jcc(dst, cond, dst+2); 590 dst = jcc(dst, cond, dst+2);
582 dst = zcycles(dst, 5);//T States: 5 591 dst = zcycles(dst, 5);//T States: 5
583 uint16_t dest_addr = inst->immed; 592 uint16_t dest_addr = inst->immed;
671 dst = call(dst, (uint8_t *)z80_native_addr); 680 dst = call(dst, (uint8_t *)z80_native_addr);
672 dst = jmp_r(dst, SCRATCH1); 681 dst = jmp_r(dst, SCRATCH1);
673 } 682 }
674 break; 683 break;
675 } 684 }
676 //case Z80_CALLCC: 685 case Z80_CALLCC:
686 dst = zcycles(dst, 10);//T States: 4,3,3 (false case)
687 uint8_t cond = CC_Z;
688 switch (inst->reg)
689 {
690 case Z80_CC_NZ:
691 cond = CC_NZ;
692 case Z80_CC_Z:
693 dst = cmp_irdisp8(dst, 0, CONTEXT, zf_off(ZF_Z), SZ_B);
694 break;
695 case Z80_CC_NC:
696 cond = CC_NZ;
697 case Z80_CC_C:
698 dst = cmp_irdisp8(dst, 0, CONTEXT, zf_off(ZF_C), SZ_B);
699 break;
700 case Z80_CC_PO:
701 cond = CC_NZ;
702 case Z80_CC_PE:
703 dst = cmp_irdisp8(dst, 0, CONTEXT, zf_off(ZF_PV), SZ_B);
704 break;
705 case Z80_CC_P:
706 case Z80_CC_M:
707 dst = cmp_irdisp8(dst, 0, CONTEXT, zf_off(ZF_S), SZ_B);
708 break;
709 }
710 uint8_t *no_call_off = dst+1;
711 dst = jcc(dst, cond, dst+2);
712 dst = zcycles(dst, 1);//Last of the above T states takes an extra cycle in the true case
713 dst = sub_ir(dst, 2, opts->regs[Z80_SP], SZ_W);
714 dst = mov_ir(dst, address + 3, SCRATCH2, SZ_W);
715 dst = mov_rr(dst, opts->regs[Z80_SP], SCRATCH1, SZ_W);
716 dst = call(dst, (uint8_t *)z80_write_word_highfirst);//T States: 3, 3
717 if (inst->immed < 0x4000) {
718 uint8_t * call_dst = z80_get_native_address(context, inst->immed);
719 if (!call_dst) {
720 opts->deferred = defer_address(opts->deferred, inst->immed, dst + 1);
721 //fake address to force large displacement
722 call_dst = dst + 256;
723 }
724 dst = jmp(dst, call_dst);
725 } else {
726 dst = mov_ir(dst, inst->immed, SCRATCH1, SZ_W);
727 dst = call(dst, (uint8_t *)z80_native_addr);
728 dst = jmp_r(dst, SCRATCH1);
729 }
730 *no_call_off = dst - (no_call_off+1);
731 break;
677 case Z80_RET: 732 case Z80_RET:
678 dst = zcycles(dst, 4);//T States: 4 733 dst = zcycles(dst, 4);//T States: 4
679 dst = mov_rr(dst, opts->regs[Z80_SP], SCRATCH1, SZ_W); 734 dst = mov_rr(dst, opts->regs[Z80_SP], SCRATCH1, SZ_W);
680 dst = call(dst, (uint8_t *)z80_read_word);//T STates: 3, 3 735 dst = call(dst, (uint8_t *)z80_read_word);//T STates: 3, 3
681 dst = add_ir(dst, 2, opts->regs[Z80_SP], SZ_W); 736 dst = add_ir(dst, 2, opts->regs[Z80_SP], SZ_W);