aboutsummaryrefslogtreecommitdiff
path: root/src/DMA.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/DMA.cpp')
-rw-r--r--src/DMA.cpp160
1 files changed, 71 insertions, 89 deletions
diff --git a/src/DMA.cpp b/src/DMA.cpp
index 8afc897..717b38f 100644
--- a/src/DMA.cpp
+++ b/src/DMA.cpp
@@ -49,10 +49,10 @@ using Platform::LogLevel;
// TODO: timings are nonseq when address is fixed/decrementing
-DMA::DMA(u32 cpu, u32 num, melonDS::GPU& gpu) :
+DMA::DMA(u32 cpu, u32 num, melonDS::NDS& nds) :
CPU(cpu),
Num(num),
- GPU(gpu)
+ NDS(nds)
{
if (cpu == 0)
CountMask = 0x001FFFFF;
@@ -145,7 +145,7 @@ void DMA::WriteCnt(u32 val)
if ((StartMode & 0x7) == 0)
Start();
else if (StartMode == 0x07)
- GPU.GPU3D.CheckFIFODMA();
+ NDS.GPU.GPU3D.CheckFIFODMA();
if (StartMode==0x06 || StartMode==0x13)
Log(LogLevel::Warn, "UNIMPLEMENTED ARM%d DMA%d START MODE %02X, %08X->%08X\n", CPU?7:9, Num, StartMode, SrcAddr, DstAddr);
@@ -192,7 +192,7 @@ void DMA::Start()
MRAMBurstTable = DMATiming::MRAMDummy;
InProgress = true;
- NDS::StopCPU(CPU, 1<<Num);
+ NDS.StopCPU(CPU, 1<<Num);
}
u32 DMA::UnitTimings9_16(bool burststart)
@@ -200,18 +200,18 @@ u32 DMA::UnitTimings9_16(bool burststart)
u32 src_id = CurSrcAddr >> 14;
u32 dst_id = CurDstAddr >> 14;
- u32 src_rgn = NDS::ARM9Regions[src_id];
- u32 dst_rgn = NDS::ARM9Regions[dst_id];
+ u32 src_rgn = NDS.ARM9Regions[src_id];
+ u32 dst_rgn = NDS.ARM9Regions[dst_id];
u32 src_n, src_s, dst_n, dst_s;
- src_n = NDS::ARM9MemTimings[src_id][4];
- src_s = NDS::ARM9MemTimings[src_id][5];
- dst_n = NDS::ARM9MemTimings[dst_id][4];
- dst_s = NDS::ARM9MemTimings[dst_id][5];
+ src_n = NDS.ARM9MemTimings[src_id][4];
+ src_s = NDS.ARM9MemTimings[src_id][5];
+ dst_n = NDS.ARM9MemTimings[dst_id][4];
+ dst_s = NDS.ARM9MemTimings[dst_id][5];
- if (src_rgn == NDS::Mem9_MainRAM)
+ if (src_rgn == Mem9_MainRAM)
{
- if (dst_rgn == NDS::Mem9_MainRAM)
+ if (dst_rgn == Mem9_MainRAM)
return 16;
if (SrcAddrInc > 0)
@@ -220,7 +220,7 @@ u32 DMA::UnitTimings9_16(bool burststart)
{
MRAMBurstCount = 0;
- if (dst_rgn == NDS::Mem9_GBAROM)
+ if (dst_rgn == Mem9_GBAROM)
{
if (dst_s == 4)
MRAMBurstTable = DMATiming::MRAMRead16Bursts[1];
@@ -241,7 +241,7 @@ u32 DMA::UnitTimings9_16(bool burststart)
(burststart ? dst_n : dst_s);
}
}
- else if (dst_rgn == NDS::Mem9_MainRAM)
+ else if (dst_rgn == Mem9_MainRAM)
{
if (DstAddrInc > 0)
{
@@ -249,7 +249,7 @@ u32 DMA::UnitTimings9_16(bool burststart)
{
MRAMBurstCount = 0;
- if (src_rgn == NDS::Mem9_GBAROM)
+ if (src_rgn == Mem9_GBAROM)
{
if (src_s == 4)
MRAMBurstTable = DMATiming::MRAMWrite16Bursts[1];
@@ -286,18 +286,18 @@ u32 DMA::UnitTimings9_32(bool burststart)
u32 src_id = CurSrcAddr >> 14;
u32 dst_id = CurDstAddr >> 14;
- u32 src_rgn = NDS::ARM9Regions[src_id];
- u32 dst_rgn = NDS::ARM9Regions[dst_id];
+ u32 src_rgn = NDS.ARM9Regions[src_id];
+ u32 dst_rgn = NDS.ARM9Regions[dst_id];
u32 src_n, src_s, dst_n, dst_s;
- src_n = NDS::ARM9MemTimings[src_id][6];
- src_s = NDS::ARM9MemTimings[src_id][7];
- dst_n = NDS::ARM9MemTimings[dst_id][6];
- dst_s = NDS::ARM9MemTimings[dst_id][7];
+ src_n = NDS.ARM9MemTimings[src_id][6];
+ src_s = NDS.ARM9MemTimings[src_id][7];
+ dst_n = NDS.ARM9MemTimings[dst_id][6];
+ dst_s = NDS.ARM9MemTimings[dst_id][7];
- if (src_rgn == NDS::Mem9_MainRAM)
+ if (src_rgn == Mem9_MainRAM)
{
- if (dst_rgn == NDS::Mem9_MainRAM)
+ if (dst_rgn == Mem9_MainRAM)
return 18;
if (SrcAddrInc > 0)
@@ -306,7 +306,7 @@ u32 DMA::UnitTimings9_32(bool burststart)
{
MRAMBurstCount = 0;
- if (dst_rgn == NDS::Mem9_GBAROM)
+ if (dst_rgn == Mem9_GBAROM)
{
if (dst_s == 8)
MRAMBurstTable = DMATiming::MRAMRead32Bursts[2];
@@ -329,7 +329,7 @@ u32 DMA::UnitTimings9_32(bool burststart)
(burststart ? dst_n : dst_s);
}
}
- else if (dst_rgn == NDS::Mem9_MainRAM)
+ else if (dst_rgn == Mem9_MainRAM)
{
if (DstAddrInc > 0)
{
@@ -337,7 +337,7 @@ u32 DMA::UnitTimings9_32(bool burststart)
{
MRAMBurstCount = 0;
- if (src_rgn == NDS::Mem9_GBAROM)
+ if (src_rgn == Mem9_GBAROM)
{
if (src_s == 8)
MRAMBurstTable = DMATiming::MRAMWrite32Bursts[2];
@@ -378,18 +378,18 @@ u32 DMA::UnitTimings7_16(bool burststart)
u32 src_id = CurSrcAddr >> 15;
u32 dst_id = CurDstAddr >> 15;
- u32 src_rgn = NDS::ARM7Regions[src_id];
- u32 dst_rgn = NDS::ARM7Regions[dst_id];
+ u32 src_rgn = NDS.ARM7Regions[src_id];
+ u32 dst_rgn = NDS.ARM7Regions[dst_id];
u32 src_n, src_s, dst_n, dst_s;
- src_n = NDS::ARM7MemTimings[src_id][0];
- src_s = NDS::ARM7MemTimings[src_id][1];
- dst_n = NDS::ARM7MemTimings[dst_id][0];
- dst_s = NDS::ARM7MemTimings[dst_id][1];
+ src_n = NDS.ARM7MemTimings[src_id][0];
+ src_s = NDS.ARM7MemTimings[src_id][1];
+ dst_n = NDS.ARM7MemTimings[dst_id][0];
+ dst_s = NDS.ARM7MemTimings[dst_id][1];
- if (src_rgn == NDS::Mem7_MainRAM)
+ if (src_rgn == Mem7_MainRAM)
{
- if (dst_rgn == NDS::Mem7_MainRAM)
+ if (dst_rgn == Mem7_MainRAM)
return 16;
if (SrcAddrInc > 0)
@@ -398,7 +398,7 @@ u32 DMA::UnitTimings7_16(bool burststart)
{
MRAMBurstCount = 0;
- if (dst_rgn == NDS::Mem7_GBAROM || dst_rgn == NDS::Mem7_Wifi0 || dst_rgn == NDS::Mem7_Wifi1)
+ if (dst_rgn == Mem7_GBAROM || dst_rgn == Mem7_Wifi0 || dst_rgn == Mem7_Wifi1)
{
if (dst_s == 4)
MRAMBurstTable = DMATiming::MRAMRead16Bursts[1];
@@ -419,7 +419,7 @@ u32 DMA::UnitTimings7_16(bool burststart)
(burststart ? dst_n : dst_s);
}
}
- else if (dst_rgn == NDS::Mem7_MainRAM)
+ else if (dst_rgn == Mem7_MainRAM)
{
if (DstAddrInc > 0)
{
@@ -427,7 +427,7 @@ u32 DMA::UnitTimings7_16(bool burststart)
{
MRAMBurstCount = 0;
- if (src_rgn == NDS::Mem7_GBAROM || src_rgn == NDS::Mem7_Wifi0 || src_rgn == NDS::Mem7_Wifi1)
+ if (src_rgn == Mem7_GBAROM || src_rgn == Mem7_Wifi0 || src_rgn == Mem7_Wifi1)
{
if (src_s == 4)
MRAMBurstTable = DMATiming::MRAMWrite16Bursts[1];
@@ -464,18 +464,18 @@ u32 DMA::UnitTimings7_32(bool burststart)
u32 src_id = CurSrcAddr >> 15;
u32 dst_id = CurDstAddr >> 15;
- u32 src_rgn = NDS::ARM7Regions[src_id];
- u32 dst_rgn = NDS::ARM7Regions[dst_id];
+ u32 src_rgn = NDS.ARM7Regions[src_id];
+ u32 dst_rgn = NDS.ARM7Regions[dst_id];
u32 src_n, src_s, dst_n, dst_s;
- src_n = NDS::ARM7MemTimings[src_id][2];
- src_s = NDS::ARM7MemTimings[src_id][3];
- dst_n = NDS::ARM7MemTimings[dst_id][2];
- dst_s = NDS::ARM7MemTimings[dst_id][3];
+ src_n = NDS.ARM7MemTimings[src_id][2];
+ src_s = NDS.ARM7MemTimings[src_id][3];
+ dst_n = NDS.ARM7MemTimings[dst_id][2];
+ dst_s = NDS.ARM7MemTimings[dst_id][3];
- if (src_rgn == NDS::Mem7_MainRAM)
+ if (src_rgn == Mem7_MainRAM)
{
- if (dst_rgn == NDS::Mem7_MainRAM)
+ if (dst_rgn == Mem7_MainRAM)
return 18;
if (SrcAddrInc > 0)
@@ -484,7 +484,7 @@ u32 DMA::UnitTimings7_32(bool burststart)
{
MRAMBurstCount = 0;
- if (dst_rgn == NDS::Mem7_GBAROM || dst_rgn == NDS::Mem7_Wifi0 || dst_rgn == NDS::Mem7_Wifi1)
+ if (dst_rgn == Mem7_GBAROM || dst_rgn == Mem7_Wifi0 || dst_rgn == Mem7_Wifi1)
{
if (dst_s == 8)
MRAMBurstTable = DMATiming::MRAMRead32Bursts[2];
@@ -507,7 +507,7 @@ u32 DMA::UnitTimings7_32(bool burststart)
(burststart ? dst_n : dst_s);
}
}
- else if (dst_rgn == NDS::Mem7_MainRAM)
+ else if (dst_rgn == Mem7_MainRAM)
{
if (DstAddrInc > 0)
{
@@ -515,7 +515,7 @@ u32 DMA::UnitTimings7_32(bool burststart)
{
MRAMBurstCount = 0;
- if (src_rgn == NDS::Mem7_GBAROM || src_rgn == NDS::Mem7_Wifi0 || src_rgn == NDS::Mem7_Wifi1)
+ if (src_rgn == Mem7_GBAROM || src_rgn == Mem7_Wifi0 || src_rgn == Mem7_Wifi1)
{
if (src_s == 8)
MRAMBurstTable = DMATiming::MRAMWrite32Bursts[2];
@@ -549,10 +549,9 @@ u32 DMA::UnitTimings7_32(bool burststart)
}
}
-template <int ConsoleType>
void DMA::Run9()
{
- if (NDS::ARM9Timestamp >= NDS::ARM9Target) return;
+ if (NDS.ARM9Timestamp >= NDS.ARM9Target) return;
Executing = true;
@@ -564,40 +563,34 @@ void DMA::Run9()
{
while (IterCount > 0 && !Stall)
{
- NDS::ARM9Timestamp += (UnitTimings9_16(burststart) << NDS::ARM9ClockShift);
+ NDS.ARM9Timestamp += (UnitTimings9_16(burststart) << NDS.ARM9ClockShift);
burststart = false;
- if (ConsoleType == 1)
- DSi::ARM9Write16(CurDstAddr, DSi::ARM9Read16(CurSrcAddr));
- else
- NDS::ARM9Write16(CurDstAddr, NDS::ARM9Read16(CurSrcAddr));
+ NDS.ARM9Write16(CurDstAddr, NDS.ARM9Read16(CurSrcAddr));
CurSrcAddr += SrcAddrInc<<1;
CurDstAddr += DstAddrInc<<1;
IterCount--;
RemCount--;
- if (NDS::ARM9Timestamp >= NDS::ARM9Target) break;
+ if (NDS.ARM9Timestamp >= NDS.ARM9Target) break;
}
}
else
{
while (IterCount > 0 && !Stall)
{
- NDS::ARM9Timestamp += (UnitTimings9_32(burststart) << NDS::ARM9ClockShift);
+ NDS.ARM9Timestamp += (UnitTimings9_32(burststart) << NDS.ARM9ClockShift);
burststart = false;
- if (ConsoleType == 1)
- DSi::ARM9Write32(CurDstAddr, DSi::ARM9Read32(CurSrcAddr));
- else
- NDS::ARM9Write32(CurDstAddr, NDS::ARM9Read32(CurSrcAddr));
+ NDS.ARM9Write32(CurDstAddr, NDS.ARM9Read32(CurSrcAddr));
CurSrcAddr += SrcAddrInc<<2;
CurDstAddr += DstAddrInc<<2;
IterCount--;
RemCount--;
- if (NDS::ARM9Timestamp >= NDS::ARM9Target) break;
+ if (NDS.ARM9Timestamp >= NDS.ARM9Target) break;
}
}
@@ -609,10 +602,10 @@ void DMA::Run9()
if (IterCount == 0)
{
Running = 0;
- NDS::ResumeCPU(0, 1<<Num);
+ NDS.ResumeCPU(0, 1<<Num);
if (StartMode == 0x07)
- GPU.GPU3D.CheckFIFODMA();
+ NDS.GPU.GPU3D.CheckFIFODMA();
}
return;
@@ -622,17 +615,16 @@ void DMA::Run9()
Cnt &= ~(1<<31);
if (Cnt & (1<<30))
- NDS::SetIRQ(0, NDS::IRQ_DMA0 + Num);
+ NDS.SetIRQ(0, IRQ_DMA0 + Num);
Running = 0;
InProgress = false;
- NDS::ResumeCPU(0, 1<<Num);
+ NDS.ResumeCPU(0, 1<<Num);
}
-template <int ConsoleType>
void DMA::Run7()
{
- if (NDS::ARM7Timestamp >= NDS::ARM7Target) return;
+ if (NDS.ARM7Timestamp >= NDS.ARM7Target) return;
Executing = true;
@@ -644,40 +636,34 @@ void DMA::Run7()
{
while (IterCount > 0 && !Stall)
{
- NDS::ARM7Timestamp += UnitTimings7_16(burststart);
+ NDS.ARM7Timestamp += UnitTimings7_16(burststart);
burststart = false;
- if (ConsoleType == 1)
- DSi::ARM7Write16(CurDstAddr, DSi::ARM7Read16(CurSrcAddr));
- else
- NDS::ARM7Write16(CurDstAddr, NDS::ARM7Read16(CurSrcAddr));
+ NDS.ARM7Write16(CurDstAddr, NDS.ARM7Read16(CurSrcAddr));
CurSrcAddr += SrcAddrInc<<1;
CurDstAddr += DstAddrInc<<1;
IterCount--;
RemCount--;
- if (NDS::ARM7Timestamp >= NDS::ARM7Target) break;
+ if (NDS.ARM7Timestamp >= NDS.ARM7Target) break;
}
}
else
{
while (IterCount > 0 && !Stall)
{
- NDS::ARM7Timestamp += UnitTimings7_32(burststart);
+ NDS.ARM7Timestamp += UnitTimings7_32(burststart);
burststart = false;
- if (ConsoleType == 1)
- DSi::ARM7Write32(CurDstAddr, DSi::ARM7Read32(CurSrcAddr));
- else
- NDS::ARM7Write32(CurDstAddr, NDS::ARM7Read32(CurSrcAddr));
+ NDS.ARM7Write32(CurDstAddr, NDS.ARM7Read32(CurSrcAddr));
CurSrcAddr += SrcAddrInc<<2;
CurDstAddr += DstAddrInc<<2;
IterCount--;
RemCount--;
- if (NDS::ARM7Timestamp >= NDS::ARM7Target) break;
+ if (NDS.ARM7Timestamp >= NDS.ARM7Target) break;
}
}
@@ -689,7 +675,7 @@ void DMA::Run7()
if (IterCount == 0)
{
Running = 0;
- NDS::ResumeCPU(1, 1<<Num);
+ NDS.ResumeCPU(1, 1<<Num);
}
return;
@@ -699,22 +685,18 @@ void DMA::Run7()
Cnt &= ~(1<<31);
if (Cnt & (1<<30))
- NDS::SetIRQ(1, NDS::IRQ_DMA0 + Num);
+ NDS.SetIRQ(1, IRQ_DMA0 + Num);
Running = 0;
InProgress = false;
- NDS::ResumeCPU(1, 1<<Num);
+ NDS.ResumeCPU(1, 1<<Num);
}
-template <int ConsoleType>
void DMA::Run()
{
if (!Running) return;
- if (CPU == 0) return Run9<ConsoleType>();
- else return Run7<ConsoleType>();
+ if (CPU == 0) return Run9();
+ else return Run7();
}
-template void DMA::Run<0>();
-template void DMA::Run<1>();
-
} \ No newline at end of file