Mercurial > repos > blastem
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 } |