this->m_Z = (val == 0);
this->m_S = ((val >> (BIT_LEN-1)) & 0x1);
this->m_C = ((val >> (BIT_LEN)) & 0x1);
- bool v = (((a ^ b) >> (BIT_LEN-1)) & 0x1) ? true : false;
- this->m_O = (this->m_S != v);
+ bool a_31 = ((a >> (BIT_LEN-1)) & 0x1);
+ bool b_31 = ((b >> (BIT_LEN-1)) & 0x1);
+ bool val_31 = ((val >> (BIT_LEN-1)) & 0x1);
+ this->m_O = ((a_31 && b_31 && !val_31) || (!a_31 && !b_31 && val_31));
}
void CCpu::updateCarry(bool c)
CDat ra = this->m_cpu->getRegister(m_ra);
CDat rb = this->m_cpu->getRegister(m_rb);
CDatd val = ra - rb;
- this->m_cpu->updateFlags(val, ra, rb);
+ this->m_cpu->updateFlags(val, ra, (~rb)+1);
}
std::string Ccmp::toString()
name = "cmpi";
}
+
void Ccmpi::evalInstr()
{
argbits >>= 3;
//cout << "should exec " << this->toString() << endl;
CDat ra = this->m_cpu->getRegister(m_ra);
CDatd reg = ra - this->m_imm;
- this->m_cpu->updateFlags(reg, ra, this->m_imm);
+ this->m_cpu->updateFlags(reg, ra, (~this->m_imm)+1);
}
std::string Ccmpi::toString()
if(m_s) op << 'S';
if(m_c) op << 'C';
- op << this->getConditionFlag() << " r" << m_rd << ", r" << m_ra << ", " << m_imm;
+ op << this->getConditionFlag() << " r" << m_ra << ", " << m_imm;
return op.str();
}
CDatd val = ra - rb;
this->m_cpu->setRegister(m_rd, val);
if(!this->m_d) {
- this->m_cpu->updateFlags(val, ra, rb);
+ this->m_cpu->updateFlags(val, ra, (~rb)+1);
}
}
CDatd reg = ra - this->m_imm;
this->m_cpu->setRegister(m_rd, reg);
if(!this->m_d) {
- this->m_cpu->updateFlags(reg, ra, this->m_imm);
+ this->m_cpu->updateFlags(reg, ra, (~this->m_imm)+1);
}
}