aboutsummaryrefslogtreecommitdiff
path: root/src/NDSCart.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/NDSCart.cpp')
-rw-r--r--src/NDSCart.cpp62
1 files changed, 21 insertions, 41 deletions
diff --git a/src/NDSCart.cpp b/src/NDSCart.cpp
index 58d4a1a..2593b40 100644
--- a/src/NDSCart.cpp
+++ b/src/NDSCart.cpp
@@ -808,9 +808,8 @@ void ReadROM_B7(u32 addr, u32 len, u32 offset)
}
-void EndTransfer()
+void ROMEndTransfer(u32 param)
{
- ROMCnt &= ~(1<<23);
ROMCnt &= ~(1<<31);
if (SPICnt & (1<<14))
@@ -827,16 +826,13 @@ void ROMPrepareData(u32 param)
DataOutPos += 4;
ROMCnt |= (1<<23);
- NDS::CheckDMAs(0, 0x06);
+ NDS::CheckDMAs(0, 0x05);
NDS::CheckDMAs(1, 0x12);
-
- //if (DataOutPos < DataOutLen)
- // NDS::ScheduleEvent((ROMCnt & (1<<27)) ? 8:5, ROMPrepareData, 0);
}
void WriteROMCnt(u32 val)
{
- ROMCnt = val & 0xFF7F7FFF;
+ ROMCnt = (val & 0xFF7F7FFF) | (ROMCnt & 0x00800000);
if (!(SPICnt & (1<<15))) return;
@@ -965,52 +961,36 @@ void WriteROMCnt(u32 val)
break;
}
- //ROMCnt &= ~(1<<23);
- ROMCnt |= (1<<23);
+ ROMCnt &= ~(1<<23);
+
+ // ROM transfer timings
+ // the bus is parallel with 8 bits
+ // thus a command would take 8 cycles to be transferred
+ // and it would take 4 cycles to receive a word of data
+ u32 xfercycle = (ROMCnt & (1<<27)) ? 8 : 5;
if (datasize == 0)
- EndTransfer();
+ NDS::ScheduleEvent(NDS::Event_ROMTransfer, false, xfercycle*8, ROMEndTransfer, 0);
else
- {
- NDS::CheckDMAs(0, 0x05);
- NDS::CheckDMAs(1, 0x12);
- }
- //NDS::ScheduleEvent((ROMCnt & (1<<27)) ? 8:5, ROMPrepareData, 0);
+ NDS::ScheduleEvent(NDS::Event_ROMTransfer, true, xfercycle*(8+4), ROMPrepareData, 0);
}
u32 ReadROMData()
{
- /*if (ROMCnt & (1<<23))
+ if (ROMCnt & (1<<23))
{
ROMCnt &= ~(1<<23);
- if (DataOutPos >= DataOutLen)
- EndTransfer();
- }
-
- return ROMDataOut;*/
- u32 ret;
- if (DataOutPos >= DataOutLen)
- ret = 0;
- else
- ret = *(u32*)&DataOut[DataOutPos];
- DataOutPos += 4;
-
- if (DataOutPos == DataOutLen)
- EndTransfer();
-
- return ret;
-}
-
-void DMA(u32 addr)
-{
- void (*writefn)(u32,u32) = (NDS::ExMemCnt[0] & (1<<11)) ? NDS::ARM7Write32 : NDS::ARM9Write32;
- for (u32 i = 0; i < DataOutLen; i+=4)
- {
- writefn(addr+i, *(u32*)&DataOut[i]);
+ if (DataOutPos < DataOutLen)
+ {
+ u32 xfercycle = (ROMCnt & (1<<27)) ? 8 : 5;
+ NDS::ScheduleEvent(NDS::Event_ROMTransfer, true, xfercycle*4, ROMPrepareData, 0);
+ }
+ else
+ ROMEndTransfer(0);
}
- EndTransfer();
+ return ROMDataOut;
}