aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/DSi_AES.cpp59
-rw-r--r--src/DSi_AES.h2
-rw-r--r--src/DSi_NDMA.cpp4
3 files changed, 42 insertions, 23 deletions
diff --git a/src/DSi_AES.cpp b/src/DSi_AES.cpp
index b427dcd..9f48519 100644
--- a/src/DSi_AES.cpp
+++ b/src/DSi_AES.cpp
@@ -207,6 +207,9 @@ void WriteBlkCnt(u32 val)
u32 ReadOutputFIFO()
{
u32 ret = OutputFIFO->Read();
+
+ CheckInputDMA();
+ CheckOutputDMA();
return ret;
}
@@ -218,28 +221,7 @@ void WriteInputFIFO(u32 val)
if (!(Cnt & (1<<31))) return;
- while (InputFIFO->Level() >= 4 && RemBlocks > 0)
- {
- switch (AESMode)
- {
- case 2:
- case 3: ProcessBlock_CTR(); break;
- default:
- // dorp
- OutputFIFO->Write(InputFIFO->Read());
- OutputFIFO->Write(InputFIFO->Read());
- OutputFIFO->Write(InputFIFO->Read());
- OutputFIFO->Write(InputFIFO->Read());
- }
-
- RemBlocks--;
- }
-
- if (OutputFIFO->Level() >= OutputDMASize)
- {
- // trigger output DMA
- DSi::CheckNDMAs(1, 0x2B);
- }
+ Update();
if (RemBlocks == 0)
{
@@ -261,6 +243,39 @@ void CheckInputDMA()
// trigger input DMA
DSi::CheckNDMAs(1, 0x2A);
}
+
+ Update();
+}
+
+void CheckOutputDMA()
+{
+ if (OutputFIFO->Level() >= OutputDMASize)
+ {
+ // trigger output DMA
+ DSi::CheckNDMAs(1, 0x2B);
+ }
+}
+
+void Update()
+{
+ while (InputFIFO->Level() >= 4 && OutputFIFO->Level() <= 12 && RemBlocks > 0)
+ {
+ switch (AESMode)
+ {
+ case 2:
+ case 3: ProcessBlock_CTR(); break;
+ default:
+ // dorp
+ OutputFIFO->Write(InputFIFO->Read());
+ OutputFIFO->Write(InputFIFO->Read());
+ OutputFIFO->Write(InputFIFO->Read());
+ OutputFIFO->Write(InputFIFO->Read());
+ }
+
+ RemBlocks--;
+ }
+
+ CheckOutputDMA();
}
diff --git a/src/DSi_AES.h b/src/DSi_AES.h
index 77a4400..5e726cd 100644
--- a/src/DSi_AES.h
+++ b/src/DSi_AES.h
@@ -37,6 +37,8 @@ void WriteBlkCnt(u32 val);
u32 ReadOutputFIFO();
void WriteInputFIFO(u32 val);
void CheckInputDMA();
+void CheckOutputDMA();
+void Update();
void WriteIV(u32 offset, u32 val, u32 mask);
void WriteMAC(u32 offset, u32 val, u32 mask);
diff --git a/src/DSi_NDMA.cpp b/src/DSi_NDMA.cpp
index cd84901..a62904a 100644
--- a/src/DSi_NDMA.cpp
+++ b/src/DSi_NDMA.cpp
@@ -129,7 +129,7 @@ void DSi_NDMA::Start()
if (Cnt & (1<<12)) CurDstAddr = DstAddr;
if (Cnt & (1<<15)) CurSrcAddr = SrcAddr;
- printf("ARM%d NDMA%d %08X %02X %08X->%08X %d bytes, total=%d\n", CPU?7:9, Num, Cnt, StartMode, CurSrcAddr, CurDstAddr, RemCount*4, TotalRemCount*4);
+ //printf("ARM%d NDMA%d %08X %02X %08X->%08X %d bytes, total=%d\n", CPU?7:9, Num, Cnt, StartMode, CurSrcAddr, CurDstAddr, RemCount*4, TotalRemCount*4);
//IsGXFIFODMA = (CPU == 0 && (CurSrcAddr>>24) == 0x02 && CurDstAddr == 0x04000400 && DstAddrInc == 0);
@@ -307,6 +307,7 @@ void DSi_NDMA::Run7()
NDS::ResumeCPU(1, 1<<(Num+4));
DSi_AES::CheckInputDMA();
+ DSi_AES::CheckOutputDMA();
}
return;
@@ -331,4 +332,5 @@ void DSi_NDMA::Run7()
NDS::ResumeCPU(1, 1<<(Num+4));
DSi_AES::CheckInputDMA();
+ DSi_AES::CheckOutputDMA();
}