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