diff options
Diffstat (limited to 'src/DMA.cpp')
-rw-r--r-- | src/DMA.cpp | 160 |
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 |