mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-23 14:19:55 -06:00
make FIFO size static whene possible
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user