aboutsummaryrefslogtreecommitdiff
path: root/DMA.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'DMA.cpp')
-rw-r--r--DMA.cpp22
1 files changed, 19 insertions, 3 deletions
diff --git a/DMA.cpp b/DMA.cpp
index 1284565..836a580 100644
--- a/DMA.cpp
+++ b/DMA.cpp
@@ -20,6 +20,7 @@
#include "NDS.h"
#include "DMA.h"
#include "NDSCart.h"
+#include "GPU3D.h"
// NOTES ON DMA SHIT
@@ -87,9 +88,11 @@ void DMA::WriteCnt(u32 val)
if ((StartMode & 0x7) == 0)
Start();
+ else if (StartMode == 0x07)
+ GPU3D::CheckFIFODMA();
//else
// printf("SPECIAL ARM%d DMA%d START MODE %02X\n", CPU?7:9, Num, StartMode);
- if ((StartMode&7)!=0x00 && (StartMode&7)!=0x1 && StartMode!=2 && StartMode!=0x05 && StartMode!=0x12)
+ if ((StartMode&7)!=0x00 && (StartMode&7)!=0x1 && StartMode!=2 && StartMode!=0x05 && StartMode!=0x12 && StartMode!=0x07)
printf("UNIMPLEMENTED ARM%d DMA%d START MODE %02X\n", CPU?7:9, Num, StartMode);
//if (StartMode==2)printf("HBLANK DMA %08X -> %08X\n", SrcAddr, DstAddr);
}
@@ -123,6 +126,10 @@ void DMA::Start()
NDS::TriggerIRQ(CPU, NDS::IRQ_DMA0 + Num);
return;
}
+if (StartMode == 0x07)printf("GXFIFO DMA %08X %08X\n", Cnt, CurSrcAddr);
+ u32 num = RemCount;
+ if (StartMode == 0x07 && num > 112)
+ num = 112;
// TODO: NOT MAKE THE DMA INSTANT!!
if (!(Cnt & 0x04000000))
@@ -130,12 +137,13 @@ void DMA::Start()
u16 (*readfn)(u32) = CPU ? NDS::ARM7Read16 : NDS::ARM9Read16;
void (*writefn)(u32,u16) = CPU ? NDS::ARM7Write16 : NDS::ARM9Write16;
- while (RemCount > 0)
+ while (num > 0)
{
writefn(CurDstAddr, readfn(CurSrcAddr));
CurSrcAddr += SrcAddrInc<<1;
CurDstAddr += DstAddrInc<<1;
+ num--;
RemCount--;
}
}
@@ -144,16 +152,24 @@ void DMA::Start()
u32 (*readfn)(u32) = CPU ? NDS::ARM7Read32 : NDS::ARM9Read32;
void (*writefn)(u32,u32) = CPU ? NDS::ARM7Write32 : NDS::ARM9Write32;
- while (RemCount > 0)
+ while (num > 0)
{
writefn(CurDstAddr, readfn(CurSrcAddr));
CurSrcAddr += SrcAddrInc<<2;
CurDstAddr += DstAddrInc<<2;
+ num--;
RemCount--;
}
}
+ if (RemCount)
+ {
+ Cnt &= ~countmask;
+ Cnt |= RemCount;
+ return;
+ }
+
if (!(Cnt & 0x02000000))
Cnt &= ~0x80000000;