comparison 68kinst.c @ 50:4836d1f3841a

Fix shift rotate instruction decoding and improve disassembly of move USP and conditional branch instructions
author Mike Pavone <pavone@retrodev.com>
date Thu, 13 Dec 2012 09:47:40 -0800
parents f2aaaf36c875
children 937b47c9b79b
comparison
equal deleted inserted replaced
49:d2e43d64e999 50:4836d1f3841a
1006 break; 1006 break;
1007 } 1007 }
1008 decoded->extra.size = (*istream >> 6) & 0x3; 1008 decoded->extra.size = (*istream >> 6) & 0x3;
1009 immed = (*istream >> 9) & 0x7; 1009 immed = (*istream >> 9) & 0x7;
1010 if (*istream & 0x100) { 1010 if (*istream & 0x100) {
1011 decoded->src.addr_mode = MODE_IMMEDIATE;
1012 decoded->src.params.immed = immed;
1013 } else {
1014 decoded->src.addr_mode = MODE_REG; 1011 decoded->src.addr_mode = MODE_REG;
1015 decoded->src.params.regs.pri = immed; 1012 decoded->src.params.regs.pri = immed;
1013 } else {
1014 decoded->src.addr_mode = MODE_IMMEDIATE;
1015 if (!immed) {
1016 immed = 8;
1017 }
1018 decoded->src.params.immed = immed;
1016 } 1019 }
1017 decoded->dst.addr_mode = MODE_REG; 1020 decoded->dst.addr_mode = MODE_REG;
1018 decoded->dst.params.regs.pri = *istream & 0x7; 1021 decoded->dst.params.regs.pri = *istream & 0x7;
1019 1022
1020 } else { 1023 } else {
1065 "lsr", 1068 "lsr",
1066 "move", 1069 "move",
1067 "move",//ccr 1070 "move",//ccr
1068 "move",//from_sr 1071 "move",//from_sr
1069 "move",//sr 1072 "move",//sr
1070 "move_usp", 1073 "move",//usp
1071 "movem", 1074 "movem",
1072 "movep", 1075 "movep",
1073 "muls", 1076 "muls",
1074 "mulu", 1077 "mulu",
1075 "nbcd", 1078 "nbcd",
1215 case M68K_DBCC: 1218 case M68K_DBCC:
1216 case M68K_SCC: 1219 case M68K_SCC:
1217 ret = strlen(mnemonics[decoded->op]) - 2; 1220 ret = strlen(mnemonics[decoded->op]) - 2;
1218 memcpy(dst, mnemonics[decoded->op], ret); 1221 memcpy(dst, mnemonics[decoded->op], ret);
1219 dst[ret] = 0; 1222 dst[ret] = 0;
1220 strcat(dst, cond_mnem[decoded->extra.cond]); 1223 strcpy(dst+ret, cond_mnem[decoded->extra.cond]);
1221 ret = strlen(dst); 1224 ret = strlen(dst);
1225 if (decoded->op != M68K_SCC) {
1226 ret += sprintf(dst+ret, " #%d <%X>", decoded->src.params.immed, decoded->address + 2 + decoded->src.params.immed);
1227 return ret;
1228 }
1222 break; 1229 break;
1223 case M68K_BSR: 1230 case M68K_BSR:
1224 ret = sprintf(dst, "bsr%s", decoded->variant == VAR_BYTE ? ".s" : ""); 1231 ret = sprintf(dst, "bsr%s #%d <%X>", decoded->variant == VAR_BYTE ? ".s" : "", decoded->src.params.immed, decoded->address + 2 + decoded->src.params.immed);
1225 break; 1232 return ret;
1226 case M68K_MOVE_FROM_SR: 1233 case M68K_MOVE_FROM_SR:
1227 ret = sprintf(dst, "%s", mnemonics[decoded->op]); 1234 ret = sprintf(dst, "%s", mnemonics[decoded->op]);
1228 ret += sprintf(dst + ret, " SR"); 1235 ret += sprintf(dst + ret, " SR");
1229 ret += m68k_disasm_op(&(decoded->dst), dst + ret, 1); 1236 ret += m68k_disasm_op(&(decoded->dst), dst + ret, 1);
1230 return ret; 1237 return ret;
1238 case M68K_MOVE_CCR: 1245 case M68K_MOVE_CCR:
1239 case M68K_ORI_CCR: 1246 case M68K_ORI_CCR:
1240 ret = sprintf(dst, "%s", mnemonics[decoded->op]); 1247 ret = sprintf(dst, "%s", mnemonics[decoded->op]);
1241 ret += m68k_disasm_op(&(decoded->src), dst + ret, 0); 1248 ret += m68k_disasm_op(&(decoded->src), dst + ret, 0);
1242 ret += sprintf(dst + ret, ", %s", special_op); 1249 ret += sprintf(dst + ret, ", %s", special_op);
1250 return ret;
1251 case M68K_MOVE_USP:
1252 ret = sprintf(dst, "%s", mnemonics[decoded->op]);
1253 if (decoded->src.addr_mode != MODE_UNUSED) {
1254 ret += m68k_disasm_op(&(decoded->src), dst + ret, 0);
1255 ret += sprintf(dst + ret, ", USP");
1256 } else {
1257 ret += sprintf(dst + ret, "USP, ");
1258 ret += m68k_disasm_op(&(decoded->dst), dst + ret, 0);
1259 }
1243 return ret; 1260 return ret;
1244 default: 1261 default:
1245 size = decoded->extra.size; 1262 size = decoded->extra.size;
1246 ret = sprintf(dst, "%s%s%s", 1263 ret = sprintf(dst, "%s%s%s",
1247 mnemonics[decoded->op], 1264 mnemonics[decoded->op],