Mercurial > repos > blastem
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 } |