DSPLLE: Rename cr to control_reg
Before, there were two distinct fields called cr and r.cr, which is needlessly confusing (see the comment in DSPCore.h).
This commit is contained in:
parent
107a928452
commit
3ceda1df8c
|
@ -161,7 +161,7 @@ bool SDSP::Initialize(const DSPInitOptions& opts)
|
||||||
r.sr |= SR_INT_ENABLE;
|
r.sr |= SR_INT_ENABLE;
|
||||||
r.sr |= SR_EXT_INT_ENABLE;
|
r.sr |= SR_EXT_INT_ENABLE;
|
||||||
|
|
||||||
cr = CR_INIT | CR_HALT;
|
control_reg = CR_INIT | CR_HALT;
|
||||||
InitializeIFX();
|
InitializeIFX();
|
||||||
// Mostly keep IRAM write protected. We unprotect only when DMA-ing
|
// Mostly keep IRAM write protected. We unprotect only when DMA-ing
|
||||||
// in new ucodes.
|
// in new ucodes.
|
||||||
|
@ -210,7 +210,7 @@ void SDSP::CheckExternalInterrupt()
|
||||||
// Signal the SPU about new mail
|
// Signal the SPU about new mail
|
||||||
SetException(ExceptionType::ExternalInterrupt);
|
SetException(ExceptionType::ExternalInterrupt);
|
||||||
|
|
||||||
cr &= ~CR_EXTERNAL_INT;
|
control_reg &= ~CR_EXTERNAL_INT;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDSP::CheckExceptions()
|
void SDSP::CheckExceptions()
|
||||||
|
@ -378,7 +378,7 @@ void SDSP::DoState(PointerWrap& p)
|
||||||
{
|
{
|
||||||
p.Do(r);
|
p.Do(r);
|
||||||
p.Do(pc);
|
p.Do(pc);
|
||||||
p.Do(cr);
|
p.Do(control_reg);
|
||||||
p.Do(reg_stack_ptrs);
|
p.Do(reg_stack_ptrs);
|
||||||
p.Do(exceptions);
|
p.Do(exceptions);
|
||||||
p.Do(external_interrupt_waiting);
|
p.Do(external_interrupt_waiting);
|
||||||
|
|
|
@ -419,11 +419,11 @@ struct SDSP
|
||||||
DSP_Regs r{};
|
DSP_Regs r{};
|
||||||
u16 pc = 0;
|
u16 pc = 0;
|
||||||
|
|
||||||
// This is NOT the same cr as r.cr.
|
// This is NOT the same as r.cr.
|
||||||
// This register is shared with the main emulation, see DSP.cpp
|
// This register is shared with the main emulation, see DSP.cpp
|
||||||
// The engine has control over 0x0C07 of this reg.
|
// The engine has control over 0x0C07 of this reg.
|
||||||
// Bits are defined in a struct in DSP.cpp.
|
// Bits are defined in a struct in DSP.cpp.
|
||||||
u16 cr = 0;
|
u16 control_reg = 0;
|
||||||
|
|
||||||
u8 reg_stack_ptrs[4]{};
|
u8 reg_stack_ptrs[4]{};
|
||||||
u8 exceptions = 0; // pending exceptions
|
u8 exceptions = 0; // pending exceptions
|
||||||
|
|
|
@ -127,7 +127,7 @@ void Interpreter::rti(const UDSPInstruction opc)
|
||||||
void Interpreter::halt(const UDSPInstruction)
|
void Interpreter::halt(const UDSPInstruction)
|
||||||
{
|
{
|
||||||
auto& state = m_dsp_core.DSPState();
|
auto& state = m_dsp_core.DSPState();
|
||||||
state.cr |= CR_HALT;
|
state.control_reg |= CR_HALT;
|
||||||
state.pc--;
|
state.pc--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -81,7 +81,7 @@ int Interpreter::RunCyclesThread(int cycles)
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if ((state.cr & CR_HALT) != 0)
|
if ((state.control_reg & CR_HALT) != 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (state.external_interrupt_waiting.exchange(false, std::memory_order_acquire))
|
if (state.external_interrupt_waiting.exchange(false, std::memory_order_acquire))
|
||||||
|
@ -104,7 +104,7 @@ int Interpreter::RunCyclesDebug(int cycles)
|
||||||
// First, let's run a few cycles with no idle skipping so that things can progress a bit.
|
// First, let's run a few cycles with no idle skipping so that things can progress a bit.
|
||||||
for (int i = 0; i < 8; i++)
|
for (int i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
if ((state.cr & CR_HALT) != 0)
|
if ((state.control_reg & CR_HALT) != 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (m_dsp_core.BreakPoints().IsAddressBreakPoint(state.pc))
|
if (m_dsp_core.BreakPoints().IsAddressBreakPoint(state.pc))
|
||||||
|
@ -124,7 +124,7 @@ int Interpreter::RunCyclesDebug(int cycles)
|
||||||
// idle loops.
|
// idle loops.
|
||||||
for (int i = 0; i < 8; i++)
|
for (int i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
if ((state.cr & CR_HALT) != 0)
|
if ((state.control_reg & CR_HALT) != 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (m_dsp_core.BreakPoints().IsAddressBreakPoint(state.pc))
|
if (m_dsp_core.BreakPoints().IsAddressBreakPoint(state.pc))
|
||||||
|
@ -169,7 +169,7 @@ int Interpreter::RunCycles(int cycles)
|
||||||
// progress a bit.
|
// progress a bit.
|
||||||
for (int i = 0; i < 8; i++)
|
for (int i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
if ((state.cr & CR_HALT) != 0)
|
if ((state.control_reg & CR_HALT) != 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
Step();
|
Step();
|
||||||
|
@ -185,7 +185,7 @@ int Interpreter::RunCycles(int cycles)
|
||||||
// idle loops.
|
// idle loops.
|
||||||
for (int i = 0; i < 8; i++)
|
for (int i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
if ((state.cr & CR_HALT) != 0)
|
if ((state.control_reg & CR_HALT) != 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (state.GetAnalyzer().IsIdleSkip(state.pc))
|
if (state.GetAnalyzer().IsIdleSkip(state.pc))
|
||||||
|
@ -212,7 +212,7 @@ int Interpreter::RunCycles(int cycles)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: These have nothing to do with SDSP::r::cr!
|
// NOTE: These have nothing to do with SDSP::r::cr!
|
||||||
void Interpreter::WriteCR(u16 val)
|
void Interpreter::WriteControlRegister(u16 val)
|
||||||
{
|
{
|
||||||
// reset
|
// reset
|
||||||
if ((val & CR_RESET) != 0)
|
if ((val & CR_RESET) != 0)
|
||||||
|
@ -232,23 +232,23 @@ void Interpreter::WriteCR(u16 val)
|
||||||
}
|
}
|
||||||
|
|
||||||
// update cr
|
// update cr
|
||||||
m_dsp_core.DSPState().cr = val;
|
m_dsp_core.DSPState().control_reg = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
u16 Interpreter::ReadCR()
|
u16 Interpreter::ReadControlRegister()
|
||||||
{
|
{
|
||||||
auto& state = m_dsp_core.DSPState();
|
auto& state = m_dsp_core.DSPState();
|
||||||
|
|
||||||
if ((state.pc & 0x8000) != 0)
|
if ((state.pc & 0x8000) != 0)
|
||||||
{
|
{
|
||||||
state.cr |= CR_INIT;
|
state.control_reg |= CR_INIT;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
state.cr &= ~CR_INIT;
|
state.control_reg &= ~CR_INIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
return state.cr;
|
return state.control_reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Interpreter::SetSRFlag(u16 flag)
|
void Interpreter::SetSRFlag(u16 flag)
|
||||||
|
|
|
@ -32,8 +32,8 @@ public:
|
||||||
int RunCycles(int cycles);
|
int RunCycles(int cycles);
|
||||||
int RunCyclesDebug(int cycles);
|
int RunCyclesDebug(int cycles);
|
||||||
|
|
||||||
void WriteCR(u16 val);
|
void WriteControlRegister(u16 val);
|
||||||
u16 ReadCR();
|
u16 ReadControlRegister();
|
||||||
|
|
||||||
void SetSRFlag(u16 flag);
|
void SetSRFlag(u16 flag);
|
||||||
bool IsSRFlagSet(u16 flag) const;
|
bool IsSRFlagSet(u16 flag) const;
|
||||||
|
|
|
@ -443,7 +443,7 @@ void DSPEmitter::CompileDispatcher()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for DSP halt
|
// Check for DSP halt
|
||||||
TEST(8, M_SDSP_cr(), Imm8(CR_HALT));
|
TEST(8, M_SDSP_control_reg(), Imm8(CR_HALT));
|
||||||
FixupBranch _halt = J_CC(CC_NE);
|
FixupBranch _halt = J_CC(CC_NE);
|
||||||
|
|
||||||
// Execute block. Cycles executed returned in EAX.
|
// Execute block. Cycles executed returned in EAX.
|
||||||
|
@ -484,9 +484,9 @@ Gen::OpArg DSPEmitter::M_SDSP_exceptions()
|
||||||
return MDisp(R15, static_cast<int>(offsetof(SDSP, exceptions)));
|
return MDisp(R15, static_cast<int>(offsetof(SDSP, exceptions)));
|
||||||
}
|
}
|
||||||
|
|
||||||
Gen::OpArg DSPEmitter::M_SDSP_cr()
|
Gen::OpArg DSPEmitter::M_SDSP_control_reg()
|
||||||
{
|
{
|
||||||
return MDisp(R15, static_cast<int>(offsetof(SDSP, cr)));
|
return MDisp(R15, static_cast<int>(offsetof(SDSP, control_reg)));
|
||||||
}
|
}
|
||||||
|
|
||||||
Gen::OpArg DSPEmitter::M_SDSP_external_interrupt_waiting()
|
Gen::OpArg DSPEmitter::M_SDSP_external_interrupt_waiting()
|
||||||
|
|
|
@ -292,7 +292,7 @@ private:
|
||||||
// SDSP memory offset helpers
|
// SDSP memory offset helpers
|
||||||
Gen::OpArg M_SDSP_pc();
|
Gen::OpArg M_SDSP_pc();
|
||||||
Gen::OpArg M_SDSP_exceptions();
|
Gen::OpArg M_SDSP_exceptions();
|
||||||
Gen::OpArg M_SDSP_cr();
|
Gen::OpArg M_SDSP_control_reg();
|
||||||
Gen::OpArg M_SDSP_external_interrupt_waiting();
|
Gen::OpArg M_SDSP_external_interrupt_waiting();
|
||||||
Gen::OpArg M_SDSP_r_st(size_t index);
|
Gen::OpArg M_SDSP_r_st(size_t index);
|
||||||
Gen::OpArg M_SDSP_reg_stack_ptrs(size_t index);
|
Gen::OpArg M_SDSP_reg_stack_ptrs(size_t index);
|
||||||
|
|
|
@ -304,7 +304,7 @@ void DSPEmitter::rti(const UDSPInstruction opc)
|
||||||
// Stops execution of DSP code. Sets bit DSP_CR_HALT in register DREG_CR.
|
// Stops execution of DSP code. Sets bit DSP_CR_HALT in register DREG_CR.
|
||||||
void DSPEmitter::halt(const UDSPInstruction)
|
void DSPEmitter::halt(const UDSPInstruction)
|
||||||
{
|
{
|
||||||
OR(16, M_SDSP_cr(), Imm16(CR_HALT));
|
OR(16, M_SDSP_control_reg(), Imm16(CR_HALT));
|
||||||
// g_dsp.pc = dsp_reg_load_stack(StackRegister::Call);
|
// g_dsp.pc = dsp_reg_load_stack(StackRegister::Call);
|
||||||
dsp_reg_load_stack(StackRegister::Call);
|
dsp_reg_load_stack(StackRegister::Call);
|
||||||
MOV(16, M_SDSP_pc(), R(DX));
|
MOV(16, M_SDSP_pc(), R(DX));
|
||||||
|
|
|
@ -183,7 +183,7 @@ void DSPLLE::Shutdown()
|
||||||
|
|
||||||
u16 DSPLLE::DSP_WriteControlRegister(u16 value)
|
u16 DSPLLE::DSP_WriteControlRegister(u16 value)
|
||||||
{
|
{
|
||||||
m_dsp_core.GetInterpreter().WriteCR(value);
|
m_dsp_core.GetInterpreter().WriteControlRegister(value);
|
||||||
|
|
||||||
if ((value & CR_EXTERNAL_INT) != 0)
|
if ((value & CR_EXTERNAL_INT) != 0)
|
||||||
{
|
{
|
||||||
|
@ -207,7 +207,7 @@ u16 DSPLLE::DSP_WriteControlRegister(u16 value)
|
||||||
|
|
||||||
u16 DSPLLE::DSP_ReadControlRegister()
|
u16 DSPLLE::DSP_ReadControlRegister()
|
||||||
{
|
{
|
||||||
return m_dsp_core.GetInterpreter().ReadCR();
|
return m_dsp_core.GetInterpreter().ReadControlRegister();
|
||||||
}
|
}
|
||||||
|
|
||||||
u16 DSPLLE::DSP_ReadMailBoxHigh(bool cpu_mailbox)
|
u16 DSPLLE::DSP_ReadMailBoxHigh(bool cpu_mailbox)
|
||||||
|
|
Loading…
Reference in New Issue