Mercurial > repos > blastem
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); |