diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/DSi.cpp | 4 | ||||
| -rw-r--r-- | src/DSi_SD.cpp | 49 | 
2 files changed, 51 insertions, 2 deletions
| diff --git a/src/DSi.cpp b/src/DSi.cpp index e6e3c5a..fc590e1 100644 --- a/src/DSi.cpp +++ b/src/DSi.cpp @@ -1101,10 +1101,12 @@ u32 ARM7IORead32(u32 addr)      if (addr >= 0x04004800 && addr < 0x04004A00)      { +        if (addr == 0x0400490C) return SDMMC->ReadFIFO32();          return SDMMC->Read(addr) | (SDMMC->Read(addr+2) << 16);      }      if (addr >= 0x04004A00 && addr < 0x04004C00)      { +        if (addr == 0x04004B0C) return SDIO->ReadFIFO32();          return SDIO->Read(addr) | (SDIO->Read(addr+2) << 16);      } @@ -1184,12 +1186,14 @@ void ARM7IOWrite32(u32 addr, u32 val)      if (addr >= 0x04004800 && addr < 0x04004A00)      { +        if (addr == 0x0400490C) { SDMMC->WriteFIFO32(val); return; }          SDMMC->Write(addr, val & 0xFFFF);          SDMMC->Write(addr+2, val >> 16);          return;      }      if (addr >= 0x04004A00 && addr < 0x04004C00)      { +        if (addr == 0x04004B0C) { SDIO->WriteFIFO32(val); return; }          SDIO->Write(addr, val & 0xFFFF);          SDIO->Write(addr+2, val >> 16);          return; diff --git a/src/DSi_SD.cpp b/src/DSi_SD.cpp index 2e16140..42b515c 100644 --- a/src/DSi_SD.cpp +++ b/src/DSi_SD.cpp @@ -281,8 +281,53 @@ u16 DSi_SDHost::Read(u32 addr)  u32 DSi_SDHost::ReadFIFO32()  { -    // -    return 0; +    if (DataMode != 1) return 0; + +    // TODO: decrement BlockLen???? + +    u32 f = CurFIFO; +    if (DataFIFO[f]->IsEmpty()) +    { +        // TODO +        return 0; +    } + +    DSi_SDDevice* dev = Ports[PortSelect & 0x1]; +    u32 ret = DataFIFO[f]->Read(); +    ret |= (DataFIFO[f]->Read() << 16); + +    if (DataFIFO[f]->IsEmpty()) +    { +        ClearIRQ(24); + +        if (BlockCountInternal == 0) +        { +            printf("%s: data32 RX complete", SD_DESC); + +            if (StopAction & (1<<8)) +            { +                printf(", sending CMD12"); +                if (dev) dev->SendCMD(12, 0); +            } + +            printf("\n"); + +            // CHECKME: presumably IRQ2 should not trigger here, but rather +            // when the data transfer is done +            //SetIRQ(0); +            //SetIRQ(2); +        } +        else +        { +            BlockCountInternal--; + +            if (dev) dev->ContinueTransfer(); +        } + +        SetIRQ(25); +    } + +    return ret;  }  void DSi_SDHost::Write(u32 addr, u16 val) |