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