card reads are "double buffered"
means they can fetch a word in the background while a word is still waiting to be read. Thanks Gericom!
This commit is contained in:
parent
4493634a5b
commit
0686523543
|
@ -1922,7 +1922,7 @@ void NDS::ScheduleEvent(u32 id, bool periodic, s32 delay, u32 funcid, u32 param)
|
|||
else
|
||||
{
|
||||
if (CurCPU == 0)
|
||||
evt.Timestamp = (ARM9Timestamp >> ARM9ClockShift) + delay;
|
||||
evt.Timestamp = ((ARM9Timestamp + ((1<<ARM9ClockShift)-1)) >> ARM9ClockShift) + delay;
|
||||
else
|
||||
evt.Timestamp = ARM7Timestamp + delay;
|
||||
}
|
||||
|
|
|
@ -1799,6 +1799,7 @@ void NDSCartSlot::ResetCart() noexcept
|
|||
TransferDir = 0;
|
||||
memset(TransferCmd.data(), 0, sizeof(TransferCmd));
|
||||
TransferCmd[0] = 0xFF;
|
||||
LastRomTransferTime = 0;
|
||||
|
||||
if (Cart) Cart->Reset();
|
||||
}
|
||||
|
@ -1922,6 +1923,9 @@ void NDSCartSlot::WriteROMCnt(u32 val) noexcept
|
|||
NDS.ScheduleEvent(Event_ROMTransfer, false, xfercycle*cmddelay, ROMTransfer_End, 0);
|
||||
else
|
||||
NDS.ScheduleEvent(Event_ROMTransfer, false, xfercycle*(cmddelay+4), ROMTransfer_PrepareData, 0);
|
||||
|
||||
if (NDS.CurCPU) LastRomTransferTime = NDS.ARM7Timestamp + xfercycle*(cmddelay+4);
|
||||
else LastRomTransferTime = ((std::max(NDS.ARM9Timestamp, NDS.DMA9Timestamp) + ((1<<NDS.ARM9ClockShift)-1)) >> NDS.ARM9ClockShift) + (xfercycle*(cmddelay+4));
|
||||
}
|
||||
|
||||
void NDSCartSlot::AdvanceROMTransfer() noexcept
|
||||
|
@ -1938,7 +1942,17 @@ void NDSCartSlot::AdvanceROMTransfer() noexcept
|
|||
delay += ((ROMCnt >> 16) & 0x3F);
|
||||
}
|
||||
|
||||
NDS.ScheduleEvent(Event_ROMTransfer, false, xfercycle*delay, ROMTransfer_PrepareData, 0);
|
||||
u64 curts;
|
||||
if (NDS.CurCPU) curts = NDS.ARM7Timestamp;
|
||||
else curts = (std::max(NDS.ARM9Timestamp, NDS.DMA9Timestamp) + ((1<<NDS.ARM9ClockShift)-1)) >> NDS.ARM9ClockShift;
|
||||
|
||||
s64 nexttransfer = (xfercycle*delay) - (curts - LastRomTransferTime);
|
||||
|
||||
if (nexttransfer < 1) nexttransfer = 1; // CHECKME: the value of 1 here was kinda just a guess? it seems right though.
|
||||
|
||||
NDS.ScheduleEvent(Event_ROMTransfer, false, nexttransfer, ROMTransfer_PrepareData, 0);
|
||||
|
||||
LastRomTransferTime = curts;
|
||||
}
|
||||
else
|
||||
ROMEndTransfer(0);
|
||||
|
|
|
@ -442,6 +442,8 @@ private:
|
|||
u64 Key2_X = 0;
|
||||
u64 Key2_Y = 0;
|
||||
|
||||
u64 LastRomTransferTime;
|
||||
|
||||
void Key1_Encrypt(u32* data) const noexcept;
|
||||
void Key1_Decrypt(u32* data) const noexcept;
|
||||
void Key1_ApplyKeycode(u32* keycode, u32 mod) noexcept;
|
||||
|
|
Loading…
Reference in New Issue