comparison 68kinst.c @ 1218:054472ea077a

Properly treat bad addressing modes in OR/AND as illegal instructions
author Michael Pavone <pavone@retrodev.com>
date Thu, 09 Feb 2017 00:49:53 -0800
parents 261995d06897
children 000953a7641b
comparison
equal deleted inserted replaced
1217:f2f17267b0e1 1218:054472ea077a
1149 decoded->extra.size = size; 1149 decoded->extra.size = size;
1150 if (opmode & 0x4) { 1150 if (opmode & 0x4) {
1151 decoded->src.addr_mode = MODE_REG; 1151 decoded->src.addr_mode = MODE_REG;
1152 decoded->src.params.regs.pri = (*istream >> 9) & 0x7; 1152 decoded->src.params.regs.pri = (*istream >> 9) & 0x7;
1153 istream = m68k_decode_op(istream, size, &(decoded->dst)); 1153 istream = m68k_decode_op(istream, size, &(decoded->dst));
1154 if (!istream) { 1154 if (!istream || !m68k_valid_immed_limited_dst(&(decoded->dst))) {
1155 decoded->op = M68K_INVALID; 1155 decoded->op = M68K_INVALID;
1156 break; 1156 break;
1157 } 1157 }
1158 } else { 1158 } else {
1159 decoded->dst.addr_mode = MODE_REG; 1159 decoded->dst.addr_mode = MODE_REG;
1160 decoded->dst.params.regs.pri = (*istream >> 9) & 0x7; 1160 decoded->dst.params.regs.pri = (*istream >> 9) & 0x7;
1161 istream = m68k_decode_op(istream, size, &(decoded->src)); 1161 istream = m68k_decode_op(istream, size, &(decoded->src));
1162 if (!istream) { 1162 if (!istream || decoded->src.addr_mode == MODE_AREG) {
1163 decoded->op = M68K_INVALID; 1163 decoded->op = M68K_INVALID;
1164 break; 1164 break;
1165 } 1165 }
1166 } 1166 }
1167 } 1167 }
1321 decoded->op = M68K_AND; 1321 decoded->op = M68K_AND;
1322 decoded->extra.size = (*istream >> 6) & 0x3; 1322 decoded->extra.size = (*istream >> 6) & 0x3;
1323 decoded->src.addr_mode = MODE_REG; 1323 decoded->src.addr_mode = MODE_REG;
1324 decoded->src.params.regs.pri = m68k_reg_quick_field(*istream); 1324 decoded->src.params.regs.pri = m68k_reg_quick_field(*istream);
1325 istream = m68k_decode_op(istream, decoded->extra.size, &(decoded->dst)); 1325 istream = m68k_decode_op(istream, decoded->extra.size, &(decoded->dst));
1326 if (!istream) { 1326 if (!istream || !m68k_valid_immed_limited_dst(&(decoded->dst))) {
1327 decoded->op = M68K_INVALID; 1327 decoded->op = M68K_INVALID;
1328 break; 1328 break;
1329 } 1329 }
1330 } 1330 }
1331 } else { 1331 } else {
1343 decoded->op = M68K_AND; 1343 decoded->op = M68K_AND;
1344 decoded->extra.size = (*istream >> 6) & 0x3; 1344 decoded->extra.size = (*istream >> 6) & 0x3;
1345 decoded->dst.addr_mode = MODE_REG; 1345 decoded->dst.addr_mode = MODE_REG;
1346 decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); 1346 decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream);
1347 istream = m68k_decode_op(istream, decoded->extra.size, &(decoded->src)); 1347 istream = m68k_decode_op(istream, decoded->extra.size, &(decoded->src));
1348 if (!istream) { 1348 if (!istream || decoded->src.addr_mode == MODE_AREG) {
1349 decoded->op = M68K_INVALID; 1349 decoded->op = M68K_INVALID;
1350 break; 1350 break;
1351 } 1351 }
1352 } 1352 }
1353 } 1353 }