comparison m68k_to_x86.c @ 78:463641032588

Added untested support for LINK and UNLK
author Mike Pavone <pavone@retrodev.com>
date Fri, 21 Dec 2012 21:53:05 -0800
parents 313a0e2228f1
children 6d231dbe75ab
comparison
equal deleted inserted replaced
77:313a0e2228f1 78:463641032588
1186 *skip_loc = dst - (skip_loc+1); 1186 *skip_loc = dst - (skip_loc+1);
1187 dst = cycles(dst, 2); 1187 dst = cycles(dst, 2);
1188 } else { 1188 } else {
1189 dst = cycles(dst, 4); 1189 dst = cycles(dst, 4);
1190 } 1190 }
1191 return dst;
1192 }
1193
1194 uint8_t * translate_m68k_link(uint8_t * dst, m68kinst * inst, x86_68k_options * opts)
1195 {
1196 int8_t reg = native_reg(&(inst->src), opts);
1197 //compensate for displacement word
1198 dst = cycles(dst, BUS);
1199 dst = sub_ir(dst, 4, opts->aregs[7], SZ_D);
1200 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D);
1201 if (reg >= 0) {
1202 dst = mov_rr(dst, reg, SCRATCH1, SZ_D);
1203 } else {
1204 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->src)), SCRATCH1, SZ_D);
1205 }
1206 dst = call(dst, (char *)m68k_write_long_highfirst);
1207 if (reg >= 0) {
1208 dst = mov_rr(dst, opts->aregs[7], reg, SZ_D);
1209 } else {
1210 dst = mov_rrdisp8(dst, opts->aregs[7], CONTEXT, reg_offset(&(inst->src)), SZ_D);
1211 }
1212 dst = add_ir(dst, inst->dst.params.immed, opts->aregs[7], SZ_D);
1213 //prefetch
1214 dst = cycles(dst, BUS);
1191 return dst; 1215 return dst;
1192 } 1216 }
1193 1217
1194 typedef uint8_t * (*shift_ir_t)(uint8_t * out, uint8_t val, uint8_t dst, uint8_t size); 1218 typedef uint8_t * (*shift_ir_t)(uint8_t * out, uint8_t val, uint8_t dst, uint8_t size);
1195 typedef uint8_t * (*shift_irdisp8_t)(uint8_t * out, uint8_t val, uint8_t dst_base, int8_t disp, uint8_t size); 1219 typedef uint8_t * (*shift_irdisp8_t)(uint8_t * out, uint8_t val, uint8_t dst_base, int8_t disp, uint8_t size);
1315 return translate_m68k_dbcc(dst, inst, opts); 1339 return translate_m68k_dbcc(dst, inst, opts);
1316 } else if(inst->op == M68K_CLR) { 1340 } else if(inst->op == M68K_CLR) {
1317 return translate_m68k_clr(dst, inst, opts); 1341 return translate_m68k_clr(dst, inst, opts);
1318 } else if(inst->op == M68K_MOVEM) { 1342 } else if(inst->op == M68K_MOVEM) {
1319 return translate_m68k_movem(dst, inst, opts); 1343 return translate_m68k_movem(dst, inst, opts);
1344 } else if(inst->op == M68K_LINK) {
1345 return translate_m68k_link(dst, inst, opts);
1320 } 1346 }
1321 x86_ea src_op, dst_op; 1347 x86_ea src_op, dst_op;
1322 if (inst->src.addr_mode != MODE_UNUSED) { 1348 if (inst->src.addr_mode != MODE_UNUSED) {
1323 dst = translate_m68k_src(inst, &src_op, dst, opts); 1349 dst = translate_m68k_src(inst, &src_op, dst, opts);
1324 } 1350 }
1541 dst = mov_rr(dst, CONTEXT, RDI, SZ_Q); 1567 dst = mov_rr(dst, CONTEXT, RDI, SZ_Q);
1542 dst = call(dst, (uint8_t *)print_regs_exit); 1568 dst = call(dst, (uint8_t *)print_regs_exit);
1543 break; 1569 break;
1544 /*case M68K_JSR: 1570 /*case M68K_JSR:
1545 case M68K_LEA: 1571 case M68K_LEA:
1546 case M68K_LINK:
1547 case M68K_MOVE_FROM_SR: 1572 case M68K_MOVE_FROM_SR:
1548 break;*/ 1573 break;*/
1549 case M68K_MOVE_CCR: 1574 case M68K_MOVE_CCR:
1550 case M68K_MOVE_SR: 1575 case M68K_MOVE_SR:
1551 //TODO: Privilege check for MOVE to SR 1576 //TODO: Privilege check for MOVE to SR
1716 dst = setcc_r(dst, CC_C, FLAG_C); 1741 dst = setcc_r(dst, CC_C, FLAG_C);
1717 dst = setcc_r(dst, CC_Z, FLAG_Z); 1742 dst = setcc_r(dst, CC_Z, FLAG_Z);
1718 dst = setcc_r(dst, CC_S, FLAG_N); 1743 dst = setcc_r(dst, CC_S, FLAG_N);
1719 dst = setcc_r(dst, CC_O, FLAG_V); 1744 dst = setcc_r(dst, CC_O, FLAG_V);
1720 break; 1745 break;
1721 /*case M68K_UNLK: 1746 case M68K_UNLK:
1722 case M68K_INVALID: 1747 dst = cycles(dst, BUS);
1748 if (dst_op.mode == MODE_REG_DIRECT) {
1749 dst = mov_rr(dst, dst_op.base, opts->aregs[7], SZ_D);
1750 } else {
1751 dst = mov_rdisp8r(dst, dst_op.base, dst_op.disp, opts->aregs[7], SZ_D);
1752 }
1753 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D);
1754 dst = call(dst, (uint8_t *)m68k_read_long_scratch1);
1755 if (dst_op.mode == MODE_REG_DIRECT) {
1756 dst = mov_rr(dst, SCRATCH1, dst_op.base, SZ_D);
1757 } else {
1758 dst = mov_rdisp8r(dst, SCRATCH1, dst_op.base, dst_op.disp, SZ_D);
1759 }
1760 break;
1761 /*case M68K_INVALID:
1723 break;*/ 1762 break;*/
1724 default: 1763 default:
1725 printf("instruction %d not yet implemented\n", inst->op); 1764 printf("instruction %d not yet implemented\n", inst->op);
1726 exit(1); 1765 exit(1);
1727 } 1766 }