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) {