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