Mercurial > repos > blastem
comparison m68k_to_x86.c @ 133:c4d10c2aaee2
Add support for pc indexed addressing mode to lea
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 30 Dec 2012 09:55:07 -0800 |
parents | 0969d8363a20 |
children | 5416a5c4628e |
comparison
equal
deleted
inserted
replaced
132:0969d8363a20 | 133:c4d10c2aaee2 |
---|---|
1236 dst = mov_ir(dst, inst->src.params.regs.displacement + inst->address+2, dst_reg, SZ_D); | 1236 dst = mov_ir(dst, inst->src.params.regs.displacement + inst->address+2, dst_reg, SZ_D); |
1237 } else { | 1237 } else { |
1238 dst = mov_irdisp8(dst, inst->src.params.regs.displacement + inst->address+2, CONTEXT, offsetof(m68k_context, aregs) + 4 * inst->dst.params.regs.pri, SZ_D); | 1238 dst = mov_irdisp8(dst, inst->src.params.regs.displacement + inst->address+2, CONTEXT, offsetof(m68k_context, aregs) + 4 * inst->dst.params.regs.pri, SZ_D); |
1239 } | 1239 } |
1240 break; | 1240 break; |
1241 case MODE_PC_INDEX_DISP8: | |
1242 dst = cycles(dst, BUS*3);//TODO: CHeck that this is correct | |
1243 dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D); | |
1244 sec_reg = (inst->src.params.regs.sec >> 1) & 0x7; | |
1245 if (inst->src.params.regs.sec & 1) { | |
1246 if (inst->src.params.regs.sec & 0x10) { | |
1247 if (opts->aregs[sec_reg] >= 0) { | |
1248 dst = add_rr(dst, opts->aregs[sec_reg], SCRATCH1, SZ_D); | |
1249 } else { | |
1250 dst = add_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t)*sec_reg, SCRATCH1, SZ_D); | |
1251 } | |
1252 } else { | |
1253 if (opts->dregs[sec_reg] >= 0) { | |
1254 dst = add_rr(dst, opts->dregs[sec_reg], SCRATCH1, SZ_D); | |
1255 } else { | |
1256 dst = add_rdisp8r(dst, CONTEXT, offsetof(m68k_context, dregs) + sizeof(uint32_t)*sec_reg, SCRATCH1, SZ_D); | |
1257 } | |
1258 } | |
1259 } else { | |
1260 if (inst->src.params.regs.sec & 0x10) { | |
1261 if (opts->aregs[sec_reg] >= 0) { | |
1262 dst = movsx_rr(dst, opts->aregs[sec_reg], SCRATCH2, SZ_W, SZ_D); | |
1263 } else { | |
1264 dst = movsx_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t)*sec_reg, SCRATCH2, SZ_W, SZ_D); | |
1265 } | |
1266 } else { | |
1267 if (opts->dregs[sec_reg] >= 0) { | |
1268 dst = movsx_rr(dst, opts->dregs[sec_reg], SCRATCH2, SZ_W, SZ_D); | |
1269 } else { | |
1270 dst = movsx_rdisp8r(dst, CONTEXT, offsetof(m68k_context, dregs) + sizeof(uint32_t)*sec_reg, SCRATCH2, SZ_W, SZ_D); | |
1271 } | |
1272 } | |
1273 dst = add_rr(dst, SCRATCH2, SCRATCH1, SZ_D); | |
1274 } | |
1275 if (inst->src.params.regs.displacement) { | |
1276 dst = add_ir(dst, inst->src.params.regs.displacement, SCRATCH1, SZ_D); | |
1277 } | |
1278 if (dst_reg >= 0) { | |
1279 dst = mov_rr(dst, SCRATCH1, dst_reg, SZ_D); | |
1280 } else { | |
1281 dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, reg_offset(&(inst->dst)), SZ_D); | |
1282 } | |
1283 break; | |
1241 case MODE_ABSOLUTE: | 1284 case MODE_ABSOLUTE: |
1242 case MODE_ABSOLUTE_SHORT: | 1285 case MODE_ABSOLUTE_SHORT: |
1243 dst = cycles(dst, (inst->src.addr_mode == MODE_ABSOLUTE) ? BUS * 3 : BUS * 2); | 1286 dst = cycles(dst, (inst->src.addr_mode == MODE_ABSOLUTE) ? BUS * 3 : BUS * 2); |
1244 if (dst_reg >= 0) { | 1287 if (dst_reg >= 0) { |
1245 dst = mov_ir(dst, inst->src.params.immed, dst_reg, SZ_D); | 1288 dst = mov_ir(dst, inst->src.params.immed, dst_reg, SZ_D); |
1246 } else { | 1289 } else { |
1247 dst = mov_irdisp8(dst, inst->src.params.immed, CONTEXT, offsetof(m68k_context, aregs) + 4 * inst->dst.params.regs.pri, SZ_D); | 1290 dst = mov_irdisp8(dst, inst->src.params.immed, CONTEXT, reg_offset(&(inst->dst)), SZ_D); |
1248 } | 1291 } |
1249 break; | 1292 break; |
1250 default: | 1293 default: |
1251 printf("address mode %d not implemented (lea src)\n", inst->src.addr_mode); | 1294 printf("address mode %d not implemented (lea src)\n", inst->src.addr_mode); |
1252 exit(1); | 1295 exit(1); |