Mercurial > repos > blastem
comparison m68k_to_x86.c @ 93:f63b0e58e2d5
Implement EXT, add some fixes to LINK/UNLK
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 27 Dec 2012 18:21:10 -0800 |
parents | c3d034e076ee |
children | dd3c680c618c |
comparison
equal
deleted
inserted
replaced
92:c3d034e076ee | 93:f63b0e58e2d5 |
---|---|
896 dst = xor_rr(dst, dst_op.base, dst_op.base, inst->extra.size); | 896 dst = xor_rr(dst, dst_op.base, dst_op.base, inst->extra.size); |
897 } else { | 897 } else { |
898 dst = mov_irdisp8(dst, 0, dst_op.base, dst_op.disp, inst->extra.size); | 898 dst = mov_irdisp8(dst, 0, dst_op.base, dst_op.disp, inst->extra.size); |
899 } | 899 } |
900 dst = m68k_save_result(inst, dst, opts); | 900 dst = m68k_save_result(inst, dst, opts); |
901 return dst; | |
902 } | |
903 | |
904 uint8_t * translate_m68k_ext(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) | |
905 { | |
906 x86_ea dst_op; | |
907 uint8_t dst_size = inst->extra.size; | |
908 inst->extra.size--; | |
909 dst = translate_m68k_dst(inst, &dst_op, dst, opts, 0); | |
910 if (dst_op.mode == MODE_REG_DIRECT) { | |
911 dst = movsx_rr(dst, dst_op.base, dst_op.base, inst->extra.size, dst_size); | |
912 dst = cmp_ir(dst, 0, dst_op.base, dst_size); | |
913 } else { | |
914 dst = movsx_rdisp8r(dst, dst_op.base, dst_op.disp, SCRATCH1, inst->extra.size, dst_size); | |
915 dst = cmp_ir(dst, 0, SCRATCH1, dst_size); | |
916 dst = mov_rrdisp8(dst, SCRATCH1, dst_op.base, dst_op.disp, dst_size); | |
917 } | |
918 inst->extra.size = dst_size; | |
919 dst = mov_ir(dst, 0, FLAG_V, SZ_B); | |
920 dst = mov_ir(dst, 0, FLAG_C, SZ_B); | |
921 dst = setcc_r(dst, CC_Z, FLAG_Z); | |
922 dst = setcc_r(dst, CC_S, FLAG_N); | |
923 //M68K EXT only operates on registers so no need for a call to save result here | |
901 return dst; | 924 return dst; |
902 } | 925 } |
903 | 926 |
904 uint8_t * translate_m68k_lea(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) | 927 uint8_t * translate_m68k_lea(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) |
905 { | 928 { |
1408 return translate_m68k_clr(dst, inst, opts); | 1431 return translate_m68k_clr(dst, inst, opts); |
1409 } else if(inst->op == M68K_MOVEM) { | 1432 } else if(inst->op == M68K_MOVEM) { |
1410 return translate_m68k_movem(dst, inst, opts); | 1433 return translate_m68k_movem(dst, inst, opts); |
1411 } else if(inst->op == M68K_LINK) { | 1434 } else if(inst->op == M68K_LINK) { |
1412 return translate_m68k_link(dst, inst, opts); | 1435 return translate_m68k_link(dst, inst, opts); |
1436 } else if(inst->op == M68K_EXT) { | |
1437 return translate_m68k_ext(dst, inst, opts); | |
1413 } | 1438 } |
1414 x86_ea src_op, dst_op; | 1439 x86_ea src_op, dst_op; |
1415 if (inst->src.addr_mode != MODE_UNUSED) { | 1440 if (inst->src.addr_mode != MODE_UNUSED) { |
1416 dst = translate_m68k_src(inst, &src_op, dst, opts); | 1441 dst = translate_m68k_src(inst, &src_op, dst, opts); |
1417 } | 1442 } |
1840 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D); | 1865 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D); |
1841 dst = call(dst, (uint8_t *)m68k_read_long_scratch1); | 1866 dst = call(dst, (uint8_t *)m68k_read_long_scratch1); |
1842 if (dst_op.mode == MODE_REG_DIRECT) { | 1867 if (dst_op.mode == MODE_REG_DIRECT) { |
1843 dst = mov_rr(dst, SCRATCH1, dst_op.base, SZ_D); | 1868 dst = mov_rr(dst, SCRATCH1, dst_op.base, SZ_D); |
1844 } else { | 1869 } else { |
1845 dst = mov_rdisp8r(dst, SCRATCH1, dst_op.base, dst_op.disp, SZ_D); | 1870 dst = mov_rrdisp8(dst, SCRATCH1, dst_op.base, dst_op.disp, SZ_D); |
1846 } | 1871 } |
1872 dst = add_ir(dst, 4, opts->aregs[7], SZ_D); | |
1847 break; | 1873 break; |
1848 /*case M68K_INVALID: | 1874 /*case M68K_INVALID: |
1849 break;*/ | 1875 break;*/ |
1850 default: | 1876 default: |
1851 printf("instruction %d not yet implemented\n", inst->op); | 1877 printf("instruction %d not yet implemented\n", inst->op); |