Mercurial > repos > blastem
comparison z80_to_x86.c @ 248:9c7a3db7bcd0
Implement ADC and SBC in Z80 core (untested)
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 28 Apr 2013 23:25:18 -0700 |
parents | 682e505f5757 |
children | 5f1b68cecfc7 |
comparison
equal
deleted
inserted
replaced
247:682e505f5757 | 248:9c7a3db7bcd0 |
---|---|
441 dst = setcc_rdisp8(dst, CC_S, CONTEXT, zf_off(ZF_S)); | 441 dst = setcc_rdisp8(dst, CC_S, CONTEXT, zf_off(ZF_S)); |
442 } | 442 } |
443 dst = z80_save_reg(dst, inst, opts); | 443 dst = z80_save_reg(dst, inst, opts); |
444 dst = z80_save_ea(dst, inst, opts); | 444 dst = z80_save_ea(dst, inst, opts); |
445 break; | 445 break; |
446 /*case Z80_ADC: | 446 case Z80_ADC: |
447 break;*/ | 447 cycles = 4; |
448 if (inst->addr_mode == Z80_IX_DISPLACE || inst->addr_mode == Z80_IY_DISPLACE) { | |
449 cycles += 12; | |
450 } else if(inst->addr_mode == Z80_IMMED) { | |
451 cycles += 3; | |
452 } else if(z80_size(inst) == SZ_W) { | |
453 cycles += 4; | |
454 } | |
455 dst = zcycles(dst, cycles); | |
456 dst = translate_z80_reg(inst, &dst_op, dst, opts); | |
457 dst = translate_z80_ea(inst, &src_op, dst, opts, READ, DONT_MODIFY); | |
458 if (src_op.mode == MODE_REG_DIRECT) { | |
459 dst = adc_rr(dst, src_op.base, dst_op.base, z80_size(inst)); | |
460 } else { | |
461 dst = adc_ir(dst, src_op.disp, dst_op.base, z80_size(inst)); | |
462 } | |
463 dst = setcc_rdisp8(dst, CC_C, CONTEXT, zf_off(ZF_C)); | |
464 dst = mov_irdisp8(dst, 0, CONTEXT, zf_off(ZF_N), SZ_B); | |
465 //TODO: Implement half-carry flag | |
466 dst = setcc_rdisp8(dst, CC_O, CONTEXT, zf_off(ZF_PV)); | |
467 dst = setcc_rdisp8(dst, CC_Z, CONTEXT, zf_off(ZF_Z)); | |
468 dst = setcc_rdisp8(dst, CC_S, CONTEXT, zf_off(ZF_S)); | |
469 dst = z80_save_reg(dst, inst, opts); | |
470 dst = z80_save_ea(dst, inst, opts); | |
471 break; | |
448 case Z80_SUB: | 472 case Z80_SUB: |
449 cycles = 4; | 473 cycles = 4; |
450 if (inst->addr_mode == Z80_IX_DISPLACE || inst->addr_mode == Z80_IY_DISPLACE) { | 474 if (inst->addr_mode == Z80_IX_DISPLACE || inst->addr_mode == Z80_IY_DISPLACE) { |
451 cycles += 12; | 475 cycles += 12; |
452 } else if(inst->addr_mode == Z80_IMMED) { | 476 } else if(inst->addr_mode == Z80_IMMED) { |
467 dst = setcc_rdisp8(dst, CC_Z, CONTEXT, zf_off(ZF_Z)); | 491 dst = setcc_rdisp8(dst, CC_Z, CONTEXT, zf_off(ZF_Z)); |
468 dst = setcc_rdisp8(dst, CC_S, CONTEXT, zf_off(ZF_S)); | 492 dst = setcc_rdisp8(dst, CC_S, CONTEXT, zf_off(ZF_S)); |
469 dst = z80_save_reg(dst, inst, opts); | 493 dst = z80_save_reg(dst, inst, opts); |
470 dst = z80_save_ea(dst, inst, opts); | 494 dst = z80_save_ea(dst, inst, opts); |
471 break; | 495 break; |
472 //case Z80_SBC: | 496 case Z80_SBC: |
497 cycles = 4; | |
498 if (inst->addr_mode == Z80_IX_DISPLACE || inst->addr_mode == Z80_IY_DISPLACE) { | |
499 cycles += 12; | |
500 } else if(inst->addr_mode == Z80_IMMED) { | |
501 cycles += 3; | |
502 } else if(z80_size(inst) == SZ_W) { | |
503 cycles += 4; | |
504 } | |
505 dst = zcycles(dst, cycles); | |
506 dst = translate_z80_reg(inst, &dst_op, dst, opts); | |
507 dst = translate_z80_ea(inst, &src_op, dst, opts, READ, DONT_MODIFY); | |
508 if (src_op.mode == MODE_REG_DIRECT) { | |
509 dst = sbb_rr(dst, src_op.base, dst_op.base, z80_size(inst)); | |
510 } else { | |
511 dst = sbb_ir(dst, src_op.disp, dst_op.base, z80_size(inst)); | |
512 } | |
513 dst = setcc_rdisp8(dst, CC_C, CONTEXT, zf_off(ZF_C)); | |
514 dst = mov_irdisp8(dst, 0, CONTEXT, zf_off(ZF_N), SZ_B); | |
515 //TODO: Implement half-carry flag | |
516 dst = setcc_rdisp8(dst, CC_O, CONTEXT, zf_off(ZF_PV)); | |
517 dst = setcc_rdisp8(dst, CC_Z, CONTEXT, zf_off(ZF_Z)); | |
518 dst = setcc_rdisp8(dst, CC_S, CONTEXT, zf_off(ZF_S)); | |
519 dst = z80_save_reg(dst, inst, opts); | |
520 dst = z80_save_ea(dst, inst, opts); | |
521 break; | |
473 case Z80_AND: | 522 case Z80_AND: |
474 cycles = 4; | 523 cycles = 4; |
475 if (inst->addr_mode == Z80_IX_DISPLACE || inst->addr_mode == Z80_IY_DISPLACE) { | 524 if (inst->addr_mode == Z80_IX_DISPLACE || inst->addr_mode == Z80_IY_DISPLACE) { |
476 cycles += 12; | 525 cycles += 12; |
477 } else if(inst->addr_mode == Z80_IMMED) { | 526 } else if(inst->addr_mode == Z80_IMMED) { |
1142 addr = z80_get_native_address(context, address); | 1191 addr = z80_get_native_address(context, address); |
1143 } | 1192 } |
1144 return addr; | 1193 return addr; |
1145 } | 1194 } |
1146 | 1195 |
1196 //uint32_t max_size = 0; | |
1197 | |
1147 void translate_z80_stream(z80_context * context, uint32_t address) | 1198 void translate_z80_stream(z80_context * context, uint32_t address) |
1148 { | 1199 { |
1149 char disbuf[80]; | 1200 char disbuf[80]; |
1150 if (z80_get_native_address(context, address)) { | 1201 if (z80_get_native_address(context, address)) { |
1151 return; | 1202 return; |
1188 printf("%X\t%s(%d)\n", address, disbuf, inst.immed); | 1239 printf("%X\t%s(%d)\n", address, disbuf, inst.immed); |
1189 } else { | 1240 } else { |
1190 printf("%X\t%s\n", address, disbuf); | 1241 printf("%X\t%s\n", address, disbuf); |
1191 } | 1242 } |
1192 z80_map_native_address(context, address, opts->cur_code); | 1243 z80_map_native_address(context, address, opts->cur_code); |
1193 opts->cur_code = translate_z80inst(&inst, opts->cur_code, context, address); | 1244 uint8_t *after = translate_z80inst(&inst, opts->cur_code, context, address); |
1245 //max_size = (after - opts->cur_code) > max_size ? (after - opts->cur_code) : max_size; | |
1246 opts->cur_code = after; | |
1194 address += next-encoded; | 1247 address += next-encoded; |
1195 encoded = next; | 1248 encoded = next; |
1196 } while (!(inst.op == Z80_RET || inst.op == Z80_RETI || inst.op == Z80_RETN || inst.op == Z80_JP || (inst.op = Z80_NOP && inst.immed == 42))); | 1249 } while (!(inst.op == Z80_RET || inst.op == Z80_RETI || inst.op == Z80_RETN || inst.op == Z80_JP || (inst.op = Z80_NOP && inst.immed == 42))); |
1197 process_deferred(&opts->deferred, context, (native_addr_func)z80_get_native_address); | 1250 process_deferred(&opts->deferred, context, (native_addr_func)z80_get_native_address); |
1198 if (opts->deferred) { | 1251 if (opts->deferred) { |