improve accuracy of contention resolution
This commit is contained in:
parent
a049c43e27
commit
70dca68de2
12
src/NDS.cpp
12
src/NDS.cpp
|
@ -909,6 +909,8 @@ void NDS::RunSystemSleep(u64 timestamp)
|
||||||
#define A7WENTLAST ( MainRAMLastAccess)
|
#define A7WENTLAST ( MainRAMLastAccess)
|
||||||
#define A9LAST false
|
#define A9LAST false
|
||||||
#define A7LAST true
|
#define A7LAST true
|
||||||
|
#define A9PRIORITY !(ExMemCnt[0] & 0x8000)
|
||||||
|
#define A7PRIORITY (ExMemCnt[0] & 0x8000)
|
||||||
|
|
||||||
void NDS::MainRAMHandleARM9()
|
void NDS::MainRAMHandleARM9()
|
||||||
{
|
{
|
||||||
|
@ -933,7 +935,7 @@ void NDS::MainRAMHandleARM9()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (A9ContentionTS < MainRAMTimestamp) { A9ContentionTS = MainRAMTimestamp; return; }
|
if (A9ContentionTS < MainRAMTimestamp) { A9ContentionTS = MainRAMTimestamp; if (A7PRIORITY) return; }
|
||||||
|
|
||||||
MainRAMTimestamp = A9ContentionTS + 9;
|
MainRAMTimestamp = A9ContentionTS + 9;
|
||||||
A9ContentionTS += (ARM9ClockShift == 1) ? 9 : 8;
|
A9ContentionTS += (ARM9ClockShift == 1) ? 9 : 8;
|
||||||
|
@ -978,11 +980,12 @@ void NDS::MainRAMHandleARM7()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (ARM7Timestamp < MainRAMTimestamp) { ARM7Timestamp = MainRAMTimestamp; return; }
|
if (ARM7Timestamp < MainRAMTimestamp) { ARM7Timestamp = MainRAMTimestamp; if (A9PRIORITY) return; }
|
||||||
|
|
||||||
MainRAMTimestamp = ARM7Timestamp + (var & MR16) ? 8 : 9; // checkme: are these correct for 8bit?
|
MainRAMTimestamp = ARM7Timestamp + (var & MR16) ? 8 : 9; // checkme: are these correct for 8bit?
|
||||||
if (var & MRWrite) ARM7Timestamp += (var & MR16) ? 3 : 4;
|
if (var & MRWrite) ARM7Timestamp += (var & MR16) ? 3 : 4;
|
||||||
else ARM7Timestamp += (var & MR16) ? 5 : 6;
|
else ARM7Timestamp += (var & MR16) ? 5 : 6;
|
||||||
|
MainRAMLastAccess = A7LAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (var & MRCodeFetch)
|
if (var & MRCodeFetch)
|
||||||
|
@ -1024,8 +1027,7 @@ void NDS::MainRAMHandle()
|
||||||
if ((ARM9.MRTrack.Type != MainRAMType::Null) && (A9ContentionTS < MainRAMTimestamp)) A9ContentionTS = MainRAMTimestamp;
|
if ((ARM9.MRTrack.Type != MainRAMType::Null) && (A9ContentionTS < MainRAMTimestamp)) A9ContentionTS = MainRAMTimestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool A7Priority = ExMemCnt[0] & 0x8000;
|
if (A7PRIORITY)
|
||||||
if (A7Priority)
|
|
||||||
{
|
{
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
|
@ -1063,6 +1065,8 @@ void NDS::MainRAMHandle()
|
||||||
#undef A7WENTLAST
|
#undef A7WENTLAST
|
||||||
#undef A9LAST
|
#undef A9LAST
|
||||||
#undef A7LAST
|
#undef A7LAST
|
||||||
|
#undef A9PRIORITY
|
||||||
|
#undef A7PRIORITY
|
||||||
|
|
||||||
template <CPUExecuteMode cpuMode>
|
template <CPUExecuteMode cpuMode>
|
||||||
u32 NDS::RunFrame()
|
u32 NDS::RunFrame()
|
||||||
|
|
Loading…
Reference in New Issue