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:
parent
f7276e6d76
commit
85f865a782
@ -955,13 +955,75 @@ void mips1core_device_base::handle_cop1(u32 const op)
|
|||||||
|
|
||||||
void mips1core_device_base::handle_cop2(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);
|
generate_exception(EXCEPTION_BADCOP2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mips1core_device_base::handle_cop3(u32 const op)
|
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);
|
generate_exception(EXCEPTION_BADCOP3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user