Randomize PI and SI DMA timing

This should help with randomization while FAT is on.
This commit is contained in:
Azimer 2017-10-17 21:38:38 -05:00
parent b5c8a0f4c5
commit 23c1007aa0
9 changed files with 106 additions and 8 deletions

View File

@ -0,0 +1,48 @@
/****************************************************************************
* *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2017 Project64. All rights reserved. *
* *
* License: *
* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html *
* *
****************************************************************************/
/*
* Implements the CRandom class.
*
* This class implements the Lehmer Random Number Generator.
*
*/
#include "Random.h"
#include <time.h>
CRandom::CRandom()
{
state = (uint32_t)time(NULL);
}
CRandom::CRandom(uint32_t seed_value)
{
state = seed_value;
}
uint32_t randomizer(uint32_t val)
{
return ((uint64_t)val * 279470273UL) % 4294967291UL;
}
uint32_t CRandom::next()
{
state = randomizer(state);
return state;
}
void CRandom::seed(uint32_t seed_value)
{
if (seed_value == 0)
state == 1;
else
state = seed_value;
}

31
Source/Project64-core/3rdParty/Random.h vendored Normal file
View File

@ -0,0 +1,31 @@
/****************************************************************************
* *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2017 Project64. All rights reserved. *
* *
* License: *
* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html *
* *
****************************************************************************/
/*
* Defines the CRandom class.
*
* This class implements the Lehmer Random Number Generator.
*
*/
#include <Common/stdtypes.h>
class CRandom
{
public:
CRandom();
CRandom(uint32_t seed_value);
uint32_t next();
void seed(uint32_t seed_value);
protected:
uint32_t randomizer(uint32_t val);
uint32_t state;
};

View File

@ -458,9 +458,11 @@ void CDMA::PI_DMA_WRITE()
{
g_Recompiler->ClearRecompCode_Phys(g_Reg->PI_DRAM_ADDR_REG, g_Reg->PI_WR_LEN_REG, CRecompiler::Remove_DMA);
}
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
g_Reg->MI_INTR_REG |= MI_INTR_PI;
g_Reg->CheckInterrupts();
g_SystemTimer->SetTimer(g_SystemTimer->PiTimer, PI_WR_LEN_REG/8 + (g_Random->next() % 0x40), false);
//g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
//g_Reg->MI_INTR_REG |= MI_INTR_PI;
//g_Reg->CheckInterrupts();
//ChangeTimer(PiTimer,(int32_t)(PI_WR_LEN_REG * 8.9) + 50);
//ChangeTimer(PiTimer,(int32_t)(PI_WR_LEN_REG * 8.9));
return;

View File

@ -358,13 +358,14 @@ void CPifRam::SI_DMA_READ()
if (g_System->bDelaySI())
{
g_SystemTimer->SetTimer(CSystemTimer::SiTimer, 0x900, false);
g_SystemTimer->SetTimer(CSystemTimer::SiTimer, 0x900 + (g_Random->next() % 0x40), false);
}
else
{
g_Reg->MI_INTR_REG |= MI_INTR_SI;
g_Reg->SI_STATUS_REG |= SI_STATUS_INTERRUPT;
g_Reg->CheckInterrupts();
g_SystemTimer->SetTimer(CSystemTimer::SiTimer, g_Random->next() % 0x40, false);
//g_Reg->MI_INTR_REG |= MI_INTR_SI;
//g_Reg->SI_STATUS_REG |= SI_STATUS_INTERRUPT;
//g_Reg->CheckInterrupts();
}
}

View File

@ -716,6 +716,7 @@ void CN64System::Reset(bool bInitReg, bool ClearMenory)
m_SyncCPU->Reset(bInitReg, ClearMenory);
}
g_Settings->SaveBool(GameRunning_InReset, true);
WriteTrace(TraceN64System, TraceDebug, "Done");
}
@ -763,6 +764,7 @@ bool CN64System::SetActiveSystem(bool bActive)
R4300iOp::m_TestTimer = m_TestTimer;
R4300iOp::m_NextInstruction = m_NextInstruction;
R4300iOp::m_JumpToLocation = m_JumpToLocation;
g_Random = &m_Random;
}
else
{
@ -782,6 +784,7 @@ bool CN64System::SetActiveSystem(bool bActive)
g_Plugins = m_Plugins;
g_TLBLoadAddress = NULL;
g_TLBStoreAddress = NULL;
g_Random = NULL;
}
}

View File

@ -23,6 +23,7 @@
#include <Project64-core/Settings/DebugSettings.h>
#include <Project64-core/Plugin.h>
#include <Project64-core/Logging.h>
#include <Project64-core/3rdParty/Random.h>
#include "Mips/TLBClass.h"
#include "CheatClass.h"
@ -164,6 +165,7 @@ private:
uint32_t m_SyncCount;
bool m_SyncCpu;
bool m_CheatsSlectionChanged;
CRandom m_Random;
//When Syncing cores this is the PC where it last Sync'ed correctly
uint32_t m_LastSuccessSyncPC[10];

View File

@ -62,4 +62,7 @@ extern CDebugger * g_Debugger;
extern uint8_t ** g_RecompPos;
class CMempak;
extern CMempak * g_Mempak;
extern CMempak * g_Mempak;
class CRandom;
extern CRandom * g_Random;

View File

@ -35,6 +35,7 @@
<ClCompile Include="3rdParty\7zip.cpp">
<PrecompiledHeader>NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="3rdParty\Random.cpp" />
<ClCompile Include="AppInit.cpp" />
<ClCompile Include="Logging.cpp" />
<ClCompile Include="MemoryExceptionFilter.cpp" />
@ -126,6 +127,7 @@
<ClInclude Include="..\3rdParty\zlib\zconf.h" />
<ClInclude Include="..\3rdParty\zlib\zlib.h" />
<ClInclude Include="3rdParty\7zip.h" />
<ClInclude Include="3rdParty\Random.h" />
<ClInclude Include="3rdParty\zip.h" />
<ClInclude Include="AppInit.h" />
<ClInclude Include="Debugger.h" />

View File

@ -339,6 +339,9 @@
<ClCompile Include="N64System\Recompiler\Arm\ArmRegInfo.cpp">
<Filter>Source Files\N64 System\Recompiler\Arm</Filter>
</ClCompile>
<ClCompile Include="3rdParty\Random.cpp">
<Filter>Source Files\3rd Party</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="stdafx.h">
@ -659,6 +662,9 @@
<ClInclude Include="Debugger.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="3rdParty\Random.h">
<Filter>Header Files\3rd Party</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="ClassDiagram.cd" />