aboutsummaryrefslogtreecommitdiff
path: root/src/DSi_SD.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/DSi_SD.cpp')
-rw-r--r--src/DSi_SD.cpp86
1 files changed, 39 insertions, 47 deletions
diff --git a/src/DSi_SD.cpp b/src/DSi_SD.cpp
index de82edb..d6fd5f5 100644
--- a/src/DSi_SD.cpp
+++ b/src/DSi_SD.cpp
@@ -52,20 +52,12 @@ DSi_SDHost::DSi_SDHost(u32 num)
{
Num = num;
- DataFIFO[0] = new FIFO<u16>(0x100);
- DataFIFO[1] = new FIFO<u16>(0x100);
- DataFIFO32 = new FIFO<u32>(0x80);
-
Ports[0] = NULL;
Ports[1] = NULL;
}
DSi_SDHost::~DSi_SDHost()
{
- delete DataFIFO[0];
- delete DataFIFO[1];
- delete DataFIFO32;
-
if (Ports[0]) delete Ports[0];
if (Ports[1]) delete Ports[1];
}
@@ -89,10 +81,10 @@ void DSi_SDHost::Reset()
Param = 0;
memset(ResponseBuffer, 0, sizeof(ResponseBuffer));
- DataFIFO[0]->Clear();
- DataFIFO[1]->Clear();
+ DataFIFO[0].Clear();
+ DataFIFO[1].Clear();
CurFIFO = 0;
- DataFIFO32->Clear();
+ DataFIFO32.Clear();
IRQStatus = 0;
IRQMask = 0x8B7F031D;
@@ -160,8 +152,8 @@ void DSi_SDHost::UpdateData32IRQ()
oldflags &= (Data32IRQ >> 11);
Data32IRQ &= ~0x0300;
- if (DataFIFO32->Level() >= (BlockLen32>>2)) Data32IRQ |= (1<<8);
- if (!DataFIFO32->IsEmpty()) Data32IRQ |= (1<<9);
+ if (DataFIFO32.Level() >= (BlockLen32>>2)) Data32IRQ |= (1<<8);
+ if (!DataFIFO32.IsEmpty()) Data32IRQ |= (1<<9);
u32 newflags = ((Data32IRQ >> 8) & 0x1) | (((~Data32IRQ) >> 8) & 0x2);
newflags &= (Data32IRQ >> 11);
@@ -256,7 +248,7 @@ u32 DSi_SDHost::DataRX(u8* data, u32 len)
u32 f = CurFIFO ^ 1;
for (u32 i = 0; i < len; i += 2)
- DataFIFO[f]->Write(*(u16*)&data[i]);
+ DataFIFO[f].Write(*(u16*)&data[i]);
//CurFIFO = f;
//SetIRQ(24);
@@ -304,9 +296,9 @@ u32 DSi_SDHost::DataTX(u8* data, u32 len)
if (DataMode == 1)
{
- if ((DataFIFO32->Level() << 2) < len)
+ if ((DataFIFO32.Level() << 2) < len)
{
- if (DataFIFO32->IsEmpty())
+ if (DataFIFO32.IsEmpty())
{
SetIRQ(25);
DSi::CheckNDMAs(1, Num ? 0x29 : 0x28);
@@ -316,16 +308,16 @@ u32 DSi_SDHost::DataTX(u8* data, u32 len)
// drain FIFO32 into FIFO16
- if (!DataFIFO[f]->IsEmpty()) printf("VERY BAD!! TRYING TO DRAIN FIFO32 INTO FIFO16 BUT IT CONTAINS SHIT ALREADY\n");
+ if (!DataFIFO[f].IsEmpty()) printf("VERY BAD!! TRYING TO DRAIN FIFO32 INTO FIFO16 BUT IT CONTAINS SHIT ALREADY\n");
for (;;)
{
u32 f = CurFIFO;
- if ((DataFIFO[f]->Level() << 1) >= BlockLen16) break;
- if (DataFIFO32->IsEmpty()) break;
+ if ((DataFIFO[f].Level() << 1) >= BlockLen16) break;
+ if (DataFIFO32.IsEmpty()) break;
- u32 val = DataFIFO32->Read();
- DataFIFO[f]->Write(val & 0xFFFF);
- DataFIFO[f]->Write(val >> 16);
+ u32 val = DataFIFO32.Read();
+ DataFIFO[f].Write(val & 0xFFFF);
+ DataFIFO[f].Write(val >> 16);
}
UpdateData32IRQ();
@@ -335,15 +327,15 @@ u32 DSi_SDHost::DataTX(u8* data, u32 len)
}
else
{
- if ((DataFIFO[f]->Level() << 1) < len)
+ if ((DataFIFO[f].Level() << 1) < len)
{
- if (DataFIFO[f]->IsEmpty()) SetIRQ(25);
+ if (DataFIFO[f].IsEmpty()) SetIRQ(25);
return 0;
}
}
for (u32 i = 0; i < len; i += 2)
- *(u16*)&data[i] = DataFIFO[f]->Read();
+ *(u16*)&data[i] = DataFIFO[f].Read();
CurFIFO ^= 1;
BlockCountInternal--;
@@ -392,13 +384,13 @@ void DSi_SDHost::CheckTX()
if (DataMode == 1)
{
- if ((DataFIFO32->Level() << 2) < BlockLen32)
+ if ((DataFIFO32.Level() << 2) < BlockLen32)
return;
}
else
{
u32 f = CurFIFO;
- if ((DataFIFO[f]->Level() << 1) < BlockLen16)
+ if ((DataFIFO[f].Level() << 1) < BlockLen16)
return;
}
@@ -481,7 +473,7 @@ u16 DSi_SDHost::Read(u32 addr)
u16 DSi_SDHost::ReadFIFO16()
{
u32 f = CurFIFO;
- if (DataFIFO[f]->IsEmpty())
+ if (DataFIFO[f].IsEmpty())
{
// TODO
// on hardware it seems to wrap around. underflow bit is set upon the first 'empty' read.
@@ -489,9 +481,9 @@ u16 DSi_SDHost::ReadFIFO16()
}
DSi_SDDevice* dev = Ports[PortSelect & 0x1];
- u16 ret = DataFIFO[f]->Read();
+ u16 ret = DataFIFO[f].Read();
- if (DataFIFO[f]->IsEmpty())
+ if (DataFIFO[f].IsEmpty())
{
CheckRX();
}
@@ -503,16 +495,16 @@ u32 DSi_SDHost::ReadFIFO32()
{
if (DataMode != 1) return 0;
- if (DataFIFO32->IsEmpty())
+ if (DataFIFO32.IsEmpty())
{
// TODO
return 0;
}
DSi_SDDevice* dev = Ports[PortSelect & 0x1];
- u32 ret = DataFIFO32->Read();
+ u32 ret = DataFIFO32.Read();
- if (DataFIFO32->IsEmpty())
+ if (DataFIFO32.IsEmpty())
{
CheckRX();
}
@@ -628,7 +620,7 @@ void DSi_SDHost::Write(u32 addr, u16 val)
case 0x100:
Data32IRQ = (val & 0x1802) | (Data32IRQ & 0x0300);
- if (val & (1<<10)) DataFIFO32->Clear();
+ if (val & (1<<10)) DataFIFO32.Clear();
DataMode = ((DataCtl >> 1) & 0x1) & ((Data32IRQ >> 1) & 0x1);
return;
case 0x102: return;
@@ -643,14 +635,14 @@ void DSi_SDHost::WriteFIFO16(u16 val)
{
DSi_SDDevice* dev = Ports[PortSelect & 0x1];
u32 f = CurFIFO;
- if (DataFIFO[f]->IsFull())
+ if (DataFIFO[f].IsFull())
{
// TODO
printf("!!!! %s FIFO (16) FULL\n", SD_DESC);
return;
}
- DataFIFO[f]->Write(val);
+ DataFIFO[f].Write(val);
CheckTX();
}
@@ -659,14 +651,14 @@ void DSi_SDHost::WriteFIFO32(u32 val)
{
if (DataMode != 1) return;
- if (DataFIFO32->IsFull())
+ if (DataFIFO32.IsFull())
{
// TODO
printf("!!!! %s FIFO (32) FULL\n", SD_DESC);
return;
}
- DataFIFO32->Write(val);
+ DataFIFO32.Write(val);
CheckTX();
@@ -679,21 +671,21 @@ void DSi_SDHost::UpdateFIFO32()
if (DataMode != 1) return;
- if (!DataFIFO32->IsEmpty()) printf("VERY BAD!! TRYING TO DRAIN FIFO16 INTO FIFO32 BUT IT CONTAINS SHIT ALREADY\n");
+ if (!DataFIFO32.IsEmpty()) printf("VERY BAD!! TRYING TO DRAIN FIFO16 INTO FIFO32 BUT IT CONTAINS SHIT ALREADY\n");
for (;;)
{
u32 f = CurFIFO;
- if ((DataFIFO32->Level() << 2) >= BlockLen32) break;
- if (DataFIFO[f]->IsEmpty()) break;
+ if ((DataFIFO32.Level() << 2) >= BlockLen32) break;
+ if (DataFIFO[f].IsEmpty()) break;
- u32 val = DataFIFO[f]->Read();
- val |= (DataFIFO[f]->Read() << 16);
- DataFIFO32->Write(val);
+ u32 val = DataFIFO[f].Read();
+ val |= (DataFIFO[f].Read() << 16);
+ DataFIFO32.Write(val);
}
UpdateData32IRQ();
- if ((DataFIFO32->Level() << 2) >= BlockLen32)
+ if ((DataFIFO32.Level() << 2) >= BlockLen32)
{
DSi::CheckNDMAs(1, Num ? 0x29 : 0x28);
}
@@ -704,8 +696,8 @@ void DSi_SDHost::CheckSwapFIFO()
// check whether we can swap the FIFOs
u32 f = CurFIFO;
- bool cur_empty = (DataMode == 1) ? DataFIFO32->IsEmpty() : DataFIFO[f]->IsEmpty();
- if (cur_empty && ((DataFIFO[f^1]->Level() << 1) >= BlockLen16))
+ bool cur_empty = (DataMode == 1) ? DataFIFO32.IsEmpty() : DataFIFO[f].IsEmpty();
+ if (cur_empty && ((DataFIFO[f^1].Level() << 1) >= BlockLen16))
{
CurFIFO ^= 1;
}