Mercurial > repos > blastem
comparison z80_to_x86.c @ 246:ed548c77b598
Implement RETCC in Z80 core.
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 28 Apr 2013 21:00:27 -0700 |
parents | 2f069a0b487e |
children | 682e505f5757 |
comparison
equal
deleted
inserted
replaced
245:ea3899e3e7ec | 246:ed548c77b598 |
---|---|
904 dst = call(dst, (uint8_t *)z80_read_word);//T STates: 3, 3 | 904 dst = call(dst, (uint8_t *)z80_read_word);//T STates: 3, 3 |
905 dst = add_ir(dst, 2, opts->regs[Z80_SP], SZ_W); | 905 dst = add_ir(dst, 2, opts->regs[Z80_SP], SZ_W); |
906 dst = call(dst, (uint8_t *)z80_native_addr); | 906 dst = call(dst, (uint8_t *)z80_native_addr); |
907 dst = jmp_r(dst, SCRATCH1); | 907 dst = jmp_r(dst, SCRATCH1); |
908 break; | 908 break; |
909 /*case Z80_RETCC: | 909 case Z80_RETCC: { |
910 case Z80_RETI: | 910 dst = zcycles(dst, 5);//T States: 5 |
911 uint8_t cond = CC_Z; | |
912 switch (inst->reg) | |
913 { | |
914 case Z80_CC_NZ: | |
915 cond = CC_NZ; | |
916 case Z80_CC_Z: | |
917 dst = cmp_irdisp8(dst, 0, CONTEXT, zf_off(ZF_Z), SZ_B); | |
918 break; | |
919 case Z80_CC_NC: | |
920 cond = CC_NZ; | |
921 case Z80_CC_C: | |
922 dst = cmp_irdisp8(dst, 0, CONTEXT, zf_off(ZF_C), SZ_B); | |
923 break; | |
924 case Z80_CC_PO: | |
925 cond = CC_NZ; | |
926 case Z80_CC_PE: | |
927 dst = cmp_irdisp8(dst, 0, CONTEXT, zf_off(ZF_PV), SZ_B); | |
928 break; | |
929 case Z80_CC_P: | |
930 case Z80_CC_M: | |
931 dst = cmp_irdisp8(dst, 0, CONTEXT, zf_off(ZF_S), SZ_B); | |
932 break; | |
933 } | |
934 uint8_t *no_call_off = dst+1; | |
935 dst = jcc(dst, cond, dst+2); | |
936 dst = mov_rr(dst, opts->regs[Z80_SP], SCRATCH1, SZ_W); | |
937 dst = call(dst, (uint8_t *)z80_read_word);//T STates: 3, 3 | |
938 dst = add_ir(dst, 2, opts->regs[Z80_SP], SZ_W); | |
939 dst = call(dst, (uint8_t *)z80_native_addr); | |
940 dst = jmp_r(dst, SCRATCH1); | |
941 *no_call_off = dst - (no_call_off+1); | |
942 break; | |
943 } | |
944 /*case Z80_RETI: | |
911 case Z80_RETN:*/ | 945 case Z80_RETN:*/ |
912 case Z80_RST: { | 946 case Z80_RST: { |
913 //RST is basically CALL to an address in page 0 | 947 //RST is basically CALL to an address in page 0 |
914 dst = zcycles(dst, 5);//T States: 5 | 948 dst = zcycles(dst, 5);//T States: 5 |
915 dst = sub_ir(dst, 2, opts->regs[Z80_SP], SZ_W); | 949 dst = sub_ir(dst, 2, opts->regs[Z80_SP], SZ_W); |
1043 } | 1077 } |
1044 z80_map_native_address(context, address, opts->cur_code); | 1078 z80_map_native_address(context, address, opts->cur_code); |
1045 opts->cur_code = translate_z80inst(&inst, opts->cur_code, context, address); | 1079 opts->cur_code = translate_z80inst(&inst, opts->cur_code, context, address); |
1046 address += next-encoded; | 1080 address += next-encoded; |
1047 encoded = next; | 1081 encoded = next; |
1048 } while (!(inst.op == Z80_RET || inst.op == Z80_RETI || inst.op == Z80_RETN || (inst.op = Z80_NOP && inst.immed == 42))); | 1082 } while (!(inst.op == Z80_RET || inst.op == Z80_RETI || inst.op == Z80_RETN || inst.op == Z80_JP || (inst.op = Z80_NOP && inst.immed == 42))); |
1049 process_deferred(&opts->deferred, context, (native_addr_func)z80_get_native_address); | 1083 process_deferred(&opts->deferred, context, (native_addr_func)z80_get_native_address); |
1050 if (opts->deferred) { | 1084 if (opts->deferred) { |
1051 address = opts->deferred->address; | 1085 address = opts->deferred->address; |
1052 printf("defferred address: %X\n", address); | 1086 printf("defferred address: %X\n", address); |
1053 if (address < 0x4000) { | 1087 if (address < 0x4000) { |