comparison m68k_to_x86.c @ 70:cebd0b5ac7f0

Make the translator bail out if it hits an instruction I haven't implemented yet
author Mike Pavone <pavone@retrodev.com>
date Thu, 20 Dec 2012 09:17:31 -0800
parents 534eb4976423
children f80fa1776507
comparison
equal deleted inserted replaced
69:36f1133837d0 70:cebd0b5ac7f0
937 if (inst->dst.addr_mode != MODE_UNUSED) { 937 if (inst->dst.addr_mode != MODE_UNUSED) {
938 dst = translate_m68k_dst(inst, &dst_op, dst, opts); 938 dst = translate_m68k_dst(inst, &dst_op, dst, opts);
939 } 939 }
940 switch(inst->op) 940 switch(inst->op)
941 { 941 {
942 case M68K_ABCD: 942 //case M68K_ABCD:
943 break; 943 // break;
944 case M68K_ADD: 944 case M68K_ADD:
945 dst = cycles(dst, BUS); 945 dst = cycles(dst, BUS);
946 if (src_op.mode == MODE_REG_DIRECT) { 946 if (src_op.mode == MODE_REG_DIRECT) {
947 if (dst_op.mode == MODE_REG_DIRECT) { 947 if (dst_op.mode == MODE_REG_DIRECT) {
948 dst = add_rr(dst, src_op.base, dst_op.base, inst->extra.size); 948 dst = add_rr(dst, src_op.base, dst_op.base, inst->extra.size);
963 dst = setcc_r(dst, CC_S, FLAG_N); 963 dst = setcc_r(dst, CC_S, FLAG_N);
964 dst = setcc_r(dst, CC_O, FLAG_V); 964 dst = setcc_r(dst, CC_O, FLAG_V);
965 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B); 965 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B);
966 dst = m68k_save_result(inst, dst, opts); 966 dst = m68k_save_result(inst, dst, opts);
967 break; 967 break;
968 case M68K_ADDX: 968 //case M68K_ADDX:
969 break; 969 // break;
970 case M68K_AND: 970 case M68K_AND:
971 dst = cycles(dst, BUS); 971 dst = cycles(dst, BUS);
972 if (src_op.mode == MODE_REG_DIRECT) { 972 if (src_op.mode == MODE_REG_DIRECT) {
973 if (dst_op.mode == MODE_REG_DIRECT) { 973 if (dst_op.mode == MODE_REG_DIRECT) {
974 dst = and_rr(dst, src_op.base, dst_op.base, inst->extra.size); 974 dst = and_rr(dst, src_op.base, dst_op.base, inst->extra.size);
988 dst = setcc_r(dst, CC_Z, FLAG_Z); 988 dst = setcc_r(dst, CC_Z, FLAG_Z);
989 dst = setcc_r(dst, CC_S, FLAG_N); 989 dst = setcc_r(dst, CC_S, FLAG_N);
990 dst = mov_ir(dst, 0, FLAG_V, SZ_B); 990 dst = mov_ir(dst, 0, FLAG_V, SZ_B);
991 dst = m68k_save_result(inst, dst, opts); 991 dst = m68k_save_result(inst, dst, opts);
992 break; 992 break;
993 case M68K_ANDI_CCR: 993 //case M68K_ANDI_CCR:
994 case M68K_ANDI_SR: 994 //case M68K_ANDI_SR:
995 break; 995 // break;
996 case M68K_ASL: 996 case M68K_ASL:
997 case M68K_LSL: 997 case M68K_LSL:
998 dst = translate_shift(dst, inst, &src_op, &dst_op, opts, shl_ir, shl_irdisp8, shl_clr, shl_clrdisp8, shr_ir, shr_irdisp8); 998 dst = translate_shift(dst, inst, &src_op, &dst_op, opts, shl_ir, shl_irdisp8, shl_clr, shl_clrdisp8, shr_ir, shr_irdisp8);
999 break; 999 break;
1000 case M68K_ASR: 1000 case M68K_ASR:
1001 dst = translate_shift(dst, inst, &src_op, &dst_op, opts, sar_ir, sar_irdisp8, sar_clr, sar_clrdisp8, NULL, NULL); 1001 dst = translate_shift(dst, inst, &src_op, &dst_op, opts, sar_ir, sar_irdisp8, sar_clr, sar_clrdisp8, NULL, NULL);
1002 break; 1002 break;
1003 case M68K_LSR: 1003 case M68K_LSR:
1004 dst = translate_shift(dst, inst, &src_op, &dst_op, opts, shr_ir, shr_irdisp8, shr_clr, shr_clrdisp8, shl_ir, shl_irdisp8); 1004 dst = translate_shift(dst, inst, &src_op, &dst_op, opts, shr_ir, shr_irdisp8, shr_clr, shr_clrdisp8, shl_ir, shl_irdisp8);
1005 break; 1005 break;
1006 case M68K_BCHG: 1006 /*case M68K_BCHG:
1007 case M68K_BCLR: 1007 case M68K_BCLR:
1008 case M68K_BSET: 1008 case M68K_BSET:
1009 break; 1009 break;*/
1010 case M68K_BTST: 1010 case M68K_BTST:
1011 dst = cycles(dst, inst->extra.size == OPSIZE_BYTE ? 4 : 6); 1011 dst = cycles(dst, inst->extra.size == OPSIZE_BYTE ? 4 : 6);
1012 if (src_op.mode == MODE_IMMED) { 1012 if (src_op.mode == MODE_IMMED) {
1013 if (inst->extra.size == OPSIZE_BYTE) { 1013 if (inst->extra.size == OPSIZE_BYTE) {
1014 src_op.disp &= 0x7; 1014 src_op.disp &= 0x7;
1043 dst = setcc_r(dst, CC_NC, FLAG_Z); 1043 dst = setcc_r(dst, CC_NC, FLAG_Z);
1044 if (src_op.base == SCRATCH2) { 1044 if (src_op.base == SCRATCH2) {
1045 dst = pop_r(dst, SCRATCH2); 1045 dst = pop_r(dst, SCRATCH2);
1046 } 1046 }
1047 break; 1047 break;
1048 case M68K_CHK: 1048 /*case M68K_CHK:
1049 break; 1049 break;*/
1050 case M68K_CMP: 1050 case M68K_CMP:
1051 dst = cycles(dst, BUS); 1051 dst = cycles(dst, BUS);
1052 if (src_op.mode == MODE_REG_DIRECT) { 1052 if (src_op.mode == MODE_REG_DIRECT) {
1053 if (dst_op.mode == MODE_REG_DIRECT) { 1053 if (dst_op.mode == MODE_REG_DIRECT) {
1054 dst = cmp_rr(dst, src_op.base, dst_op.base, inst->extra.size); 1054 dst = cmp_rr(dst, src_op.base, dst_op.base, inst->extra.size);
1067 dst = setcc_r(dst, CC_C, FLAG_C); 1067 dst = setcc_r(dst, CC_C, FLAG_C);
1068 dst = setcc_r(dst, CC_Z, FLAG_Z); 1068 dst = setcc_r(dst, CC_Z, FLAG_Z);
1069 dst = setcc_r(dst, CC_S, FLAG_N); 1069 dst = setcc_r(dst, CC_S, FLAG_N);
1070 dst = setcc_r(dst, CC_O, FLAG_V); 1070 dst = setcc_r(dst, CC_O, FLAG_V);
1071 break; 1071 break;
1072 case M68K_DIVS: 1072 /*case M68K_DIVS:
1073 case M68K_DIVU: 1073 case M68K_DIVU:
1074 break; 1074 break;*/
1075 case M68K_EOR: 1075 case M68K_EOR:
1076 dst = cycles(dst, BUS); 1076 dst = cycles(dst, BUS);
1077 if (src_op.mode == MODE_REG_DIRECT) { 1077 if (src_op.mode == MODE_REG_DIRECT) {
1078 if (dst_op.mode == MODE_REG_DIRECT) { 1078 if (dst_op.mode == MODE_REG_DIRECT) {
1079 dst = xor_rr(dst, src_op.base, dst_op.base, inst->extra.size); 1079 dst = xor_rr(dst, src_op.base, dst_op.base, inst->extra.size);
1093 dst = setcc_r(dst, CC_Z, FLAG_Z); 1093 dst = setcc_r(dst, CC_Z, FLAG_Z);
1094 dst = setcc_r(dst, CC_S, FLAG_N); 1094 dst = setcc_r(dst, CC_S, FLAG_N);
1095 dst = mov_ir(dst, 0, FLAG_V, SZ_B); 1095 dst = mov_ir(dst, 0, FLAG_V, SZ_B);
1096 dst = m68k_save_result(inst, dst, opts); 1096 dst = m68k_save_result(inst, dst, opts);
1097 break; 1097 break;
1098 case M68K_EORI_CCR: 1098 /*case M68K_EORI_CCR:
1099 case M68K_EORI_SR: 1099 case M68K_EORI_SR:*/
1100 case M68K_EXG: 1100 case M68K_EXG:
1101 dst = cycles(dst, 6); 1101 dst = cycles(dst, 6);
1102 if (dst_op.mode == MODE_REG_DIRECT) { 1102 if (dst_op.mode == MODE_REG_DIRECT) {
1103 dst = mov_rr(dst, dst_op.base, SCRATCH2, SZ_D); 1103 dst = mov_rr(dst, dst_op.base, SCRATCH2, SZ_D);
1104 if (src_op.mode == MODE_REG_DIRECT) { 1104 if (src_op.mode == MODE_REG_DIRECT) {
1125 case M68K_ILLEGAL: 1125 case M68K_ILLEGAL:
1126 dst = call(dst, (uint8_t *)m68k_save_context); 1126 dst = call(dst, (uint8_t *)m68k_save_context);
1127 dst = mov_rr(dst, CONTEXT, RDI, SZ_Q); 1127 dst = mov_rr(dst, CONTEXT, RDI, SZ_Q);
1128 dst = call(dst, (uint8_t *)print_regs_exit); 1128 dst = call(dst, (uint8_t *)print_regs_exit);
1129 break; 1129 break;
1130 case M68K_JSR: 1130 /*case M68K_JSR:
1131 case M68K_LEA: 1131 case M68K_LEA:
1132 case M68K_LINK: 1132 case M68K_LINK:
1133 case M68K_MOVE_CCR: 1133 case M68K_MOVE_CCR:
1134 case M68K_MOVE_FROM_SR: 1134 case M68K_MOVE_FROM_SR:
1135 case M68K_MOVE_SR: 1135 case M68K_MOVE_SR:
1139 case M68K_MULS: 1139 case M68K_MULS:
1140 case M68K_MULU: 1140 case M68K_MULU:
1141 case M68K_NBCD: 1141 case M68K_NBCD:
1142 case M68K_NEG: 1142 case M68K_NEG:
1143 case M68K_NEGX: 1143 case M68K_NEGX:
1144 break; 1144 break;*/
1145 case M68K_NOP: 1145 case M68K_NOP:
1146 dst = cycles(dst, BUS); 1146 dst = cycles(dst, BUS);
1147 break; 1147 break;
1148 case M68K_NOT: 1148 case M68K_NOT:
1149 break; 1149 break;
1168 dst = setcc_r(dst, CC_Z, FLAG_Z); 1168 dst = setcc_r(dst, CC_Z, FLAG_Z);
1169 dst = setcc_r(dst, CC_S, FLAG_N); 1169 dst = setcc_r(dst, CC_S, FLAG_N);
1170 dst = mov_ir(dst, 0, FLAG_V, SZ_B); 1170 dst = mov_ir(dst, 0, FLAG_V, SZ_B);
1171 dst = m68k_save_result(inst, dst, opts); 1171 dst = m68k_save_result(inst, dst, opts);
1172 break; 1172 break;
1173 case M68K_ORI_CCR: 1173 /*case M68K_ORI_CCR:
1174 case M68K_ORI_SR: 1174 case M68K_ORI_SR:
1175 case M68K_PEA: 1175 case M68K_PEA:
1176 case M68K_RESET: 1176 case M68K_RESET:
1177 case M68K_ROL: 1177 case M68K_ROL:
1178 case M68K_ROR: 1178 case M68K_ROR:
1181 case M68K_RTE: 1181 case M68K_RTE:
1182 case M68K_RTR: 1182 case M68K_RTR:
1183 case M68K_SBCD: 1183 case M68K_SBCD:
1184 case M68K_SCC: 1184 case M68K_SCC:
1185 case M68K_STOP: 1185 case M68K_STOP:
1186 break; 1186 break;*/
1187 case M68K_SUB: 1187 case M68K_SUB:
1188 dst = cycles(dst, BUS); 1188 dst = cycles(dst, BUS);
1189 if (src_op.mode == MODE_REG_DIRECT) { 1189 if (src_op.mode == MODE_REG_DIRECT) {
1190 if (dst_op.mode == MODE_REG_DIRECT) { 1190 if (dst_op.mode == MODE_REG_DIRECT) {
1191 dst = sub_rr(dst, src_op.base, dst_op.base, inst->extra.size); 1191 dst = sub_rr(dst, src_op.base, dst_op.base, inst->extra.size);
1206 dst = setcc_r(dst, CC_S, FLAG_N); 1206 dst = setcc_r(dst, CC_S, FLAG_N);
1207 dst = setcc_r(dst, CC_O, FLAG_V); 1207 dst = setcc_r(dst, CC_O, FLAG_V);
1208 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B); 1208 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B);
1209 dst = m68k_save_result(inst, dst, opts); 1209 dst = m68k_save_result(inst, dst, opts);
1210 break; 1210 break;
1211 case M68K_SUBX: 1211 //case M68K_SUBX:
1212 break; 1212 // break;
1213 case M68K_SWAP: 1213 case M68K_SWAP:
1214 dst = cycles(dst, BUS); 1214 dst = cycles(dst, BUS);
1215 if (src_op.mode == MODE_REG_DIRECT) { 1215 if (src_op.mode == MODE_REG_DIRECT) {
1216 dst = rol_ir(dst, 16, src_op.base, inst->extra.size); 1216 dst = rol_ir(dst, 16, src_op.base, inst->extra.size);
1217 } else{ 1217 } else{
1220 dst = mov_ir(dst, 0, FLAG_C, SZ_B); 1220 dst = mov_ir(dst, 0, FLAG_C, SZ_B);
1221 dst = setcc_r(dst, CC_Z, FLAG_Z); 1221 dst = setcc_r(dst, CC_Z, FLAG_Z);
1222 dst = setcc_r(dst, CC_S, FLAG_N); 1222 dst = setcc_r(dst, CC_S, FLAG_N);
1223 dst = mov_ir(dst, 0, FLAG_V, SZ_B); 1223 dst = mov_ir(dst, 0, FLAG_V, SZ_B);
1224 break; 1224 break;
1225 case M68K_TAS: 1225 /*case M68K_TAS:
1226 case M68K_TRAP: 1226 case M68K_TRAP:
1227 case M68K_TRAPV: 1227 case M68K_TRAPV:*/
1228 case M68K_TST: 1228 case M68K_TST:
1229 dst = cycles(dst, BUS); 1229 dst = cycles(dst, BUS);
1230 if (src_op.mode == MODE_REG_DIRECT) { 1230 if (src_op.mode == MODE_REG_DIRECT) {
1231 dst = cmp_ir(dst, 0, src_op.base, inst->extra.size); 1231 dst = cmp_ir(dst, 0, src_op.base, inst->extra.size);
1232 } else { //M68000 doesn't support immedate operand for tst, so this must be MODE_REG_DISPLACE8 1232 } else { //M68000 doesn't support immedate operand for tst, so this must be MODE_REG_DISPLACE8
1235 dst = setcc_r(dst, CC_C, FLAG_C); 1235 dst = setcc_r(dst, CC_C, FLAG_C);
1236 dst = setcc_r(dst, CC_Z, FLAG_Z); 1236 dst = setcc_r(dst, CC_Z, FLAG_Z);
1237 dst = setcc_r(dst, CC_S, FLAG_N); 1237 dst = setcc_r(dst, CC_S, FLAG_N);
1238 dst = setcc_r(dst, CC_O, FLAG_V); 1238 dst = setcc_r(dst, CC_O, FLAG_V);
1239 break; 1239 break;
1240 case M68K_UNLK: 1240 /*case M68K_UNLK:
1241 case M68K_INVALID: 1241 case M68K_INVALID:
1242 break; 1242 break;*/
1243 default:
1244 printf("instruction %d not yet implemented\n", inst->op);
1245 exit(1);
1243 } 1246 }
1244 return dst; 1247 return dst;
1245 } 1248 }
1246 1249
1247 uint8_t * translate_m68k_stream(uint8_t * dst, uint8_t * dst_end, uint32_t address, m68k_context * context) 1250 uint8_t * translate_m68k_stream(uint8_t * dst, uint8_t * dst_end, uint32_t address, m68k_context * context)