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:
Jaklyy 2024-12-19 16:36:13 -05:00
parent 4493634a5b
commit 0686523543
3 changed files with 18 additions and 2 deletions

View File

@ -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;
}

View File

@ -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);

View File

@ -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;