diff --git a/src/devices/cpu/i960/i960.cpp b/src/devices/cpu/i960/i960.cpp index 9449988fd6e..9d9e5293a67 100644 --- a/src/devices/cpu/i960/i960.cpp +++ b/src/devices/cpu/i960/i960.cpp @@ -1110,14 +1110,16 @@ void i960_cpu_device::execute_op(uint32_t opcode) m_icount--; t1 = get_1_ri(opcode); t2 = get_2_ri(opcode); - set_ri(opcode, t2>>t1); + set_ri(opcode, t1 >= 32 ? 0 : t2>>t1); break; case 0xa: // shrdi m_icount--; t1 = get_1_ri(opcode); t2 = get_2_ri(opcode); - if(((int32_t)t2) < 0) { + if(t1 >= 32) + set_ri(opcode, 0); + else if(((int32_t)t2) < 0) { if(t2 & ((1<>t1)+1); else @@ -1130,14 +1132,17 @@ void i960_cpu_device::execute_op(uint32_t opcode) m_icount--; t1 = get_1_ri(opcode); t2 = get_2_ri(opcode); - set_ri(opcode, ((int32_t)t2)>>t1); + if(t1 >= 32) + set_ri(opcode, (int32_t)t2 < 0 ? -1 : 0); + else + set_ri(opcode, ((int32_t)t2)>>t1); break; case 0xc: // shlo m_icount--; t1 = get_1_ri(opcode); t2 = get_2_ri(opcode); - set_ri(opcode, t2<= 32 ? 0 : t2<= 32 ? 0 : (t2<