Mercurial > repos > blastem
comparison z80_to_x86.c @ 262:d97c9eca49f4
Implement ld to and from the I and R registers
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 30 Apr 2013 20:33:30 -0700 |
parents | f0c53a4bbfa3 |
children | 8fd6652e56f8 |
comparison
equal
deleted
inserted
replaced
261:f0c53a4bbfa3 | 262:d97c9eca49f4 |
---|---|
86 } else { | 86 } else { |
87 ea->mode = MODE_REG_DIRECT; | 87 ea->mode = MODE_REG_DIRECT; |
88 if (inst->reg == Z80_IYH) { | 88 if (inst->reg == Z80_IYH) { |
89 ea->base = opts->regs[Z80_IYL]; | 89 ea->base = opts->regs[Z80_IYL]; |
90 dst = ror_ir(dst, 8, opts->regs[Z80_IY], SZ_W); | 90 dst = ror_ir(dst, 8, opts->regs[Z80_IY], SZ_W); |
91 } else { | 91 } else if(opts->regs[inst->reg] >= 0) { |
92 ea->base = opts->regs[inst->reg]; | 92 ea->base = opts->regs[inst->reg]; |
93 } else { | |
94 ea->mode = MODE_REG_DISPLACE8; | |
95 ea->base = CONTEXT; | |
96 ea->disp = offsetof(z80_context, regs) + inst->reg; | |
93 } | 97 } |
94 } | 98 } |
95 return dst; | 99 return dst; |
96 } | 100 } |
97 | 101 |
299 } else { | 303 } else { |
300 dst = translate_z80_ea(inst, &src_op, dst, opts, READ, DONT_MODIFY); | 304 dst = translate_z80_ea(inst, &src_op, dst, opts, READ, DONT_MODIFY); |
301 dst = translate_z80_reg(inst, &dst_op, dst, opts); | 305 dst = translate_z80_reg(inst, &dst_op, dst, opts); |
302 } | 306 } |
303 if (src_op.mode == MODE_REG_DIRECT) { | 307 if (src_op.mode == MODE_REG_DIRECT) { |
304 dst = mov_rr(dst, src_op.base, dst_op.base, size); | 308 if(dst_op.mode == MODE_REG_DISPLACE8) { |
305 } else { | 309 dst = mov_rrdisp8(dst, src_op.base, dst_op.base, dst_op.disp, size); |
310 } else { | |
311 dst = mov_rr(dst, src_op.base, dst_op.base, size); | |
312 } | |
313 } else if(src_op.mode == MODE_IMMED) { | |
306 dst = mov_ir(dst, src_op.disp, dst_op.base, size); | 314 dst = mov_ir(dst, src_op.disp, dst_op.base, size); |
315 } else { | |
316 dst = mov_rdisp8r(dst, src_op.base, src_op.disp, dst_op.base, size); | |
307 } | 317 } |
308 dst = z80_save_reg(dst, inst, opts); | 318 dst = z80_save_reg(dst, inst, opts); |
309 dst = z80_save_ea(dst, inst, opts); | 319 dst = z80_save_ea(dst, inst, opts); |
310 if (inst->addr_mode & Z80_DIR) { | 320 if (inst->addr_mode & Z80_DIR) { |
311 dst = z80_save_result(dst, inst); | 321 dst = z80_save_result(dst, inst); |