comparison z80_to_x86.c @ 261:f0c53a4bbfa3

Implement LDIR and fix a bug in which context was not restored after a call to z80_handle_code_write
author Mike Pavone <pavone@retrodev.com>
date Tue, 30 Apr 2013 01:00:10 -0700
parents d9417261366f
children d97c9eca49f4
comparison
equal deleted inserted replaced
260:625f8e4d5fd2 261:f0c53a4bbfa3
261 { 261 {
262 uint32_t cycles; 262 uint32_t cycles;
263 x86_ea src_op, dst_op; 263 x86_ea src_op, dst_op;
264 uint8_t size; 264 uint8_t size;
265 x86_z80_options *opts = context->options; 265 x86_z80_options *opts = context->options;
266 uint8_t * start = dst;
266 dst = z80_check_cycles_int(dst, address); 267 dst = z80_check_cycles_int(dst, address);
267 switch(inst->op) 268 switch(inst->op)
268 { 269 {
269 case Z80_LD: 270 case Z80_LD:
270 size = z80_size(inst); 271 size = z80_size(inst);
422 dst = mov_rrdisp8(dst, SCRATCH2, CONTEXT, zar_off(Z80_L), SZ_W); 423 dst = mov_rrdisp8(dst, SCRATCH2, CONTEXT, zar_off(Z80_L), SZ_W);
423 dst = mov_rr(dst, opts->regs[Z80_DE], SCRATCH1, SZ_W); 424 dst = mov_rr(dst, opts->regs[Z80_DE], SCRATCH1, SZ_W);
424 dst = mov_rdisp8r(dst, CONTEXT, zar_off(Z80_E), opts->regs[Z80_DE], SZ_W); 425 dst = mov_rdisp8r(dst, CONTEXT, zar_off(Z80_E), opts->regs[Z80_DE], SZ_W);
425 dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, zar_off(Z80_E), SZ_W); 426 dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, zar_off(Z80_E), SZ_W);
426 break; 427 break;
427 /*case Z80_LDI: 428 //case Z80_LDI:
428 case Z80_LDIR: 429 case Z80_LDIR: {
429 case Z80_LDD: 430 dst = zcycles(dst, 8);
431 dst = mov_rr(dst, opts->regs[Z80_HL], SCRATCH1, SZ_W);
432 dst = call(dst, (uint8_t *)z80_read_byte);
433 dst = mov_rr(dst, opts->regs[Z80_DE], SCRATCH2, SZ_W);
434 dst = call(dst, (uint8_t *)z80_read_byte);
435 dst = add_ir(dst, 1, opts->regs[Z80_DE], SZ_W);
436 dst = add_ir(dst, 1, opts->regs[Z80_HL], SZ_W);
437
438 dst = sub_ir(dst, 1, opts->regs[Z80_BC], SZ_W);
439 uint8_t * cont = dst+1;
440 dst = jcc(dst, CC_Z, dst+2);
441 dst = zcycles(dst, 7);
442 //TODO: Figure out what the flag state should be here
443 //TODO: Figure out whether an interrupt can interrupt this
444 dst = jmp(dst, start);
445 *cont = dst - (cont + 1);
446 dst = zcycles(dst, 2);
447 //TODO: Implement half-carry
448 dst = mov_irdisp8(dst, 0, CONTEXT, zf_off(ZF_N), SZ_B);
449 dst = mov_irdisp8(dst, 0, CONTEXT, zf_off(ZF_PV), SZ_B);
450 break;
451 }
452 /*case Z80_LDD:
430 case Z80_LDDR: 453 case Z80_LDDR:
431 case Z80_CPI: 454 case Z80_CPI:
432 case Z80_CPIR: 455 case Z80_CPIR:
433 case Z80_CPD: 456 case Z80_CPD:
434 case Z80_CPDR: 457 case Z80_CPDR: