# HG changeset patch # User Mike Pavone # Date 1367379210 25200 # Node ID d97c9eca49f4ff4a440e354cd6d3a91f5d8c3f98 # Parent f0c53a4bbfa3c86118201ce1565c6b5628f0795a Implement ld to and from the I and R registers diff -r f0c53a4bbfa3 -r d97c9eca49f4 z80_to_x86.c --- a/z80_to_x86.c Tue Apr 30 01:00:10 2013 -0700 +++ b/z80_to_x86.c Tue Apr 30 20:33:30 2013 -0700 @@ -88,8 +88,12 @@ if (inst->reg == Z80_IYH) { ea->base = opts->regs[Z80_IYL]; dst = ror_ir(dst, 8, opts->regs[Z80_IY], SZ_W); + } else if(opts->regs[inst->reg] >= 0) { + ea->base = opts->regs[inst->reg]; } else { - ea->base = opts->regs[inst->reg]; + ea->mode = MODE_REG_DISPLACE8; + ea->base = CONTEXT; + ea->disp = offsetof(z80_context, regs) + inst->reg; } } return dst; @@ -301,9 +305,15 @@ dst = translate_z80_reg(inst, &dst_op, dst, opts); } if (src_op.mode == MODE_REG_DIRECT) { - dst = mov_rr(dst, src_op.base, dst_op.base, size); + if(dst_op.mode == MODE_REG_DISPLACE8) { + dst = mov_rrdisp8(dst, src_op.base, dst_op.base, dst_op.disp, size); + } else { + dst = mov_rr(dst, src_op.base, dst_op.base, size); + } + } else if(src_op.mode == MODE_IMMED) { + dst = mov_ir(dst, src_op.disp, dst_op.base, size); } else { - dst = mov_ir(dst, src_op.disp, dst_op.base, size); + dst = mov_rdisp8r(dst, src_op.base, src_op.disp, dst_op.base, size); } dst = z80_save_reg(dst, inst, opts); dst = z80_save_ea(dst, inst, opts);