[Project64] Add Write32DPCommandRegisters

This commit is contained in:
zilmar 2015-12-22 08:49:58 +11:00
parent 34dab07f83
commit 31159ed039
4 changed files with 110 additions and 98 deletions

View File

@ -15,6 +15,7 @@
#include <Project64-core/N64System/N64Class.h> #include <Project64-core/N64System/N64Class.h>
#include <Project64-core/N64System/Recompiler/x86CodeLog.h> #include <Project64-core/N64System/Recompiler/x86CodeLog.h>
#include <Project64-core/N64System/Mips/OpcodeName.h> #include <Project64-core/N64System/Mips/OpcodeName.h>
#include <Project64-core/ExceptionHandler.h>
#include <Windows.h> #include <Windows.h>
uint32_t RegModValue; uint32_t RegModValue;
@ -2389,7 +2390,7 @@ int32_t CMipsMemoryVM::MemoryFilter(uint32_t dwExptCode, void * lpExceptionPoint
g_Notify->BreakPoint(__FILE__, __LINE__); g_Notify->BreakPoint(__FILE__, __LINE__);
#endif #endif
return EXCEPTION_EXECUTE_HANDLER; return EXCEPTION_EXECUTE_HANDLER;
} }
bool CMipsMemoryVM::LB_NonMemory(uint32_t PAddr, uint32_t* Value, bool /*SignExtend*/) bool CMipsMemoryVM::LB_NonMemory(uint32_t PAddr, uint32_t* Value, bool /*SignExtend*/)
{ {
@ -2432,7 +2433,7 @@ bool CMipsMemoryVM::LB_NonMemory(uint32_t PAddr, uint32_t* Value, bool /*SignExt
return false; return false;
} }
#endif #endif
} }
// switch (PAddr & 0xFFF00000) // switch (PAddr & 0xFFF00000)
//{ //{
// default: // default:
@ -2548,7 +2549,7 @@ bool CMipsMemoryVM::SB_NonMemory(uint32_t PAddr, uint8_t Value)
break; break;
default: default:
return false; return false;
} }
return true; return true;
} }
@ -2588,7 +2589,7 @@ bool CMipsMemoryVM::SH_NonMemory(uint32_t PAddr, uint16_t Value)
break; break;
default: default:
return false; return false;
} }
return true; return true;
} }
@ -2616,7 +2617,7 @@ bool CMipsMemoryVM::SW_NonMemory(uint32_t PAddr, uint32_t Value)
{ {
return false; return false;
} }
} }
switch (PAddr & 0xFFF00000) switch (PAddr & 0xFFF00000)
{ {
@ -2660,89 +2661,7 @@ bool CMipsMemoryVM::SW_NonMemory(uint32_t PAddr, uint32_t Value)
Write32SPRegisters(); Write32SPRegisters();
} }
break; break;
case 0x04100000: case 0x04100000: Write32DPCommandRegisters(); break;
switch (PAddr)
{
case 0x04100000:
g_Reg->DPC_START_REG = Value;
g_Reg->DPC_CURRENT_REG = Value;
break;
case 0x04100004:
g_Reg->DPC_END_REG = Value;
if (g_Plugins->Gfx()->ProcessRDPList)
{
g_Plugins->Gfx()->ProcessRDPList();
}
break;
//case 0x04100008: g_Reg->DPC_CURRENT_REG = Value; break;
case 0x0410000C:
if ((Value & DPC_CLR_XBUS_DMEM_DMA) != 0)
{
g_Reg->DPC_STATUS_REG &= ~DPC_STATUS_XBUS_DMEM_DMA;
}
if ((Value & DPC_SET_XBUS_DMEM_DMA) != 0)
{
g_Reg->DPC_STATUS_REG |= DPC_STATUS_XBUS_DMEM_DMA;
}
if ((Value & DPC_CLR_FREEZE) != 0)
{
g_Reg->DPC_STATUS_REG &= ~DPC_STATUS_FREEZE;
}
if ((Value & DPC_SET_FREEZE) != 0)
{
g_Reg->DPC_STATUS_REG |= DPC_STATUS_FREEZE;
}
if ((Value & DPC_CLR_FLUSH) != 0)
{
g_Reg->DPC_STATUS_REG &= ~DPC_STATUS_FLUSH;
}
if ((Value & DPC_SET_FLUSH) != 0)
{
g_Reg->DPC_STATUS_REG |= DPC_STATUS_FLUSH;
}
if ((Value & DPC_CLR_FREEZE) != 0)
{
if ((g_Reg->SP_STATUS_REG & SP_STATUS_HALT) == 0)
{
if ((g_Reg->SP_STATUS_REG & SP_STATUS_BROKE) == 0)
{
try
{
g_System->RunRSP();
}
catch (...)
{
g_Notify->BreakPoint(__FILE__, __LINE__);
}
}
}
}
#ifdef legacycode
if (ShowUnhandledMemory)
{
//if ( ( Value & DPC_CLR_TMEM_CTR ) != 0)
//{
// g_Notify->DisplayError(L"RSP: DPC_STATUS_REG: DPC_CLR_TMEM_CTR");
//}
//if ( ( Value & DPC_CLR_PIPE_CTR ) != 0)
//{
// g_Notify->DisplayError(L"RSP: DPC_STATUS_REG: DPC_CLR_PIPE_CTR");
//}
//if ( ( Value & DPC_CLR_CMD_CTR ) != 0)
//{
// g_Notify->DisplayError(L"RSP: DPC_STATUS_REG: DPC_CLR_CMD_CTR");
//}
//if ( ( Value & DPC_CLR_CLOCK_CTR ) != 0)
//{
// g_Notify->DisplayError(L"RSP: DPC_STATUS_REG: DPC_CLR_CLOCK_CTR");
//}
}
#endif
break;
default:
return false;
}
break;
case 0x04300000: case 0x04300000:
switch (PAddr) switch (PAddr)
{ {
@ -5540,7 +5459,7 @@ void CMipsMemoryVM::Load32Rom(void)
VirtualProtect(ROM, RomFileSize, PAGE_READONLY, &OldProtect); VirtualProtect(ROM, RomFileSize, PAGE_READONLY, &OldProtect);
} }
#endif #endif
} }
else if ((m_MemLookupAddress & 0xFFFFFFF) < g_MMU->m_RomSize) else if ((m_MemLookupAddress & 0xFFFFFFF) < g_MMU->m_RomSize)
{ {
m_MemLookupValue.UW[0] = *(uint32_t *)&g_MMU->m_Rom[(m_MemLookupAddress & 0xFFFFFFF)]; m_MemLookupValue.UW[0] = *(uint32_t *)&g_MMU->m_Rom[(m_MemLookupAddress & 0xFFFFFFF)];
@ -5729,5 +5648,93 @@ void CMipsMemoryVM::Write32SPRegisters(void)
{ {
g_Notify->BreakPoint(__FILE__, __LINE__); g_Notify->BreakPoint(__FILE__, __LINE__);
} }
}
} }
void CMipsMemoryVM::Write32DPCommandRegisters(void)
{
switch ((m_MemLookupAddress & 0xFFFFFFF))
{
case 0x04100000:
g_Reg->DPC_START_REG = m_MemLookupValue.UW[0];
g_Reg->DPC_CURRENT_REG = m_MemLookupValue.UW[0];
break;
case 0x04100004:
g_Reg->DPC_END_REG = m_MemLookupValue.UW[0];
if (g_Plugins->Gfx()->ProcessRDPList)
{
g_Plugins->Gfx()->ProcessRDPList();
}
break;
//case 0x04100008: g_Reg->DPC_CURRENT_REG = Value; break;
case 0x0410000C:
if ((m_MemLookupValue.UW[0] & DPC_CLR_XBUS_DMEM_DMA) != 0)
{
g_Reg->DPC_STATUS_REG &= ~DPC_STATUS_XBUS_DMEM_DMA;
}
if ((m_MemLookupValue.UW[0] & DPC_SET_XBUS_DMEM_DMA) != 0)
{
g_Reg->DPC_STATUS_REG |= DPC_STATUS_XBUS_DMEM_DMA;
}
if ((m_MemLookupValue.UW[0] & DPC_CLR_FREEZE) != 0)
{
g_Reg->DPC_STATUS_REG &= ~DPC_STATUS_FREEZE;
}
if ((m_MemLookupValue.UW[0] & DPC_SET_FREEZE) != 0)
{
g_Reg->DPC_STATUS_REG |= DPC_STATUS_FREEZE;
}
if ((m_MemLookupValue.UW[0] & DPC_CLR_FLUSH) != 0)
{
g_Reg->DPC_STATUS_REG &= ~DPC_STATUS_FLUSH;
}
if ((m_MemLookupValue.UW[0] & DPC_SET_FLUSH) != 0)
{
g_Reg->DPC_STATUS_REG |= DPC_STATUS_FLUSH;
}
if ((m_MemLookupValue.UW[0] & DPC_CLR_FREEZE) != 0)
{
if ((g_Reg->SP_STATUS_REG & SP_STATUS_HALT) == 0)
{
if ((g_Reg->SP_STATUS_REG & SP_STATUS_BROKE) == 0)
{
__except_try()
{
g_System->RunRSP();
}
__except_catch()
{
g_Notify->BreakPoint(__FILE__, __LINE__);
}
}
}
}
#ifdef legacycode
if (ShowUnhandledMemory)
{
//if ( ( m_MemLookupValue.UW[0] & DPC_CLR_TMEM_CTR ) != 0)
//{
// g_Notify->DisplayError(L"RSP: DPC_STATUS_REG: DPC_CLR_TMEM_CTR");
//}
//if ( ( m_MemLookupValue.UW[0] & DPC_CLR_PIPE_CTR ) != 0)
//{
// g_Notify->DisplayError(L"RSP: DPC_STATUS_REG: DPC_CLR_PIPE_CTR");
//}
//if ( ( m_MemLookupValue.UW[0] & DPC_CLR_CMD_CTR ) != 0)
//{
// g_Notify->DisplayError(L"RSP: DPC_STATUS_REG: DPC_CLR_CMD_CTR");
//}
//if ( ( m_MemLookupValue.UW[0] & DPC_CLR_CLOCK_CTR ) != 0)
//{
// g_Notify->DisplayError(L"RSP: DPC_STATUS_REG: DPC_CLR_CLOCK_CTR");
//}
}
#endif
break;
default:
if (bHaveDebugger())
{
g_Notify->BreakPoint(__FILE__, __LINE__);
}
}
} }

View File

@ -198,6 +198,7 @@ private:
static void Write32RDRAMRegisters(void); static void Write32RDRAMRegisters(void);
static void Write32SPRegisters(void); static void Write32SPRegisters(void);
static void Write32DPCommandRegisters(void);
CMipsMemory_CallBack * const m_CBClass; CMipsMemory_CallBack * const m_CBClass;

View File

@ -118,6 +118,7 @@
<ClInclude Include="3rdParty\7zip.h" /> <ClInclude Include="3rdParty\7zip.h" />
<ClInclude Include="3rdParty\zip.h" /> <ClInclude Include="3rdParty\zip.h" />
<ClInclude Include="AppInit.h" /> <ClInclude Include="AppInit.h" />
<ClInclude Include="ExceptionHandler.h" />
<ClInclude Include="Logging.h" /> <ClInclude Include="Logging.h" />
<ClInclude Include="Multilanguage.h" /> <ClInclude Include="Multilanguage.h" />
<ClInclude Include="Multilanguage\LanguageClass.h" /> <ClInclude Include="Multilanguage\LanguageClass.h" />

View File

@ -566,5 +566,8 @@
<ClInclude Include="TraceModulesProject64.h"> <ClInclude Include="TraceModulesProject64.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="ExceptionHandler.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>