From 068652354389c503e9ae8372f964118fbc6b6c49 Mon Sep 17 00:00:00 2001 From: Jaklyy <102590697+Jaklyy@users.noreply.github.com> Date: Thu, 19 Dec 2024 16:36:13 -0500 Subject: [PATCH] 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! --- src/NDS.cpp | 2 +- src/NDSCart.cpp | 16 +++++++++++++++- src/NDSCart.h | 2 ++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/NDS.cpp b/src/NDS.cpp index 99b9878b..c0225bb6 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -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) + delay; else evt.Timestamp = ARM7Timestamp + delay; } diff --git a/src/NDSCart.cpp b/src/NDSCart.cpp index 1fa0fbfe..29518540 100644 --- a/src/NDSCart.cpp +++ b/src/NDSCart.cpp @@ -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) + (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; + + 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); diff --git a/src/NDSCart.h b/src/NDSCart.h index 3704f659..c84aec90 100644 --- a/src/NDSCart.h +++ b/src/NDSCart.h @@ -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;