mips1: bc2/bc3 always work (nw)

BCzF/BCzT can be used (by reading input lines) when coprocessor 2 or 3 are enabled, even when there's no real coprocessor hardware.
This commit is contained in:
Patrick Mackinlay 2019-03-01 11:16:04 +07:00
parent f7276e6d76
commit 85f865a782

View File

@ -955,13 +955,75 @@ void mips1core_device_base::handle_cop1(u32 const op)
void mips1core_device_base::handle_cop2(u32 const op)
{
if (!(SR & SR_COP2))
if (SR & SR_COP2)
{
switch (RSREG)
{
case 0x08: // BC2
switch (RTREG)
{
case 0x00: // BC2F
if (!m_in_brcond[2]())
{
m_branch_state = BRANCH;
m_branch_target = m_pc + 4 + (s32(SIMMVAL) << 2);
}
break;
case 0x01: // BC2T
if (m_in_brcond[2]())
{
m_branch_state = BRANCH;
m_branch_target = m_pc + 4 + (s32(SIMMVAL) << 2);
}
break;
default:
generate_exception(EXCEPTION_INVALIDOP);
break;
}
break;
default:
generate_exception(EXCEPTION_INVALIDOP);
break;
}
}
else
generate_exception(EXCEPTION_BADCOP2);
}
void mips1core_device_base::handle_cop3(u32 const op)
{
if (!(SR & SR_COP3))
if (SR & SR_COP3)
{
switch (RSREG)
{
case 0x08: // BC3
switch (RTREG)
{
case 0x00: // BC3F
if (!m_in_brcond[3]())
{
m_branch_state = BRANCH;
m_branch_target = m_pc + 4 + (s32(SIMMVAL) << 2);
}
break;
case 0x01: // BC3T
if (m_in_brcond[3]())
{
m_branch_state = BRANCH;
m_branch_target = m_pc + 4 + (s32(SIMMVAL) << 2);
}
break;
default:
generate_exception(EXCEPTION_INVALIDOP);
break;
}
break;
default:
generate_exception(EXCEPTION_INVALIDOP);
break;
}
}
else
generate_exception(EXCEPTION_BADCOP3);
}