MMU: add some extremely basic Ninja SD support, based on libfat code.

This was my first attempt at getting ndsmail working properly.
All the needed init code is here, but reading and writing operations
are seriously lacking for now.
This commit is contained in:
luigi__ 2009-09-10 18:46:42 +00:00
parent dd321a27e1
commit 8e53ad6bd7
2 changed files with 119 additions and 10 deletions

View File

@ -1167,6 +1167,70 @@ void FASTCALL MMU_writeToGCControl(u32 val)
} }
break; break;
// --- Ninja SD commands -------------------------------------
// NJSD init/reset
case 0x20:
{
card.address = 0;
card.transfer_count = 0;
}
break;
// NJSD_sendCLK()
case 0xE0:
{
card.address = 0;
card.transfer_count = 0;
NDS_makeInt(PROCNUM, 20);
}
break;
// NJSD_sendCMDN() / NJSD_sendCMDR()
case 0xF0:
case 0xF1:
switch (card.command[2])
{
// GO_IDLE_STATE
case 0x40:
card.address = 0;
card.transfer_count = 0;
NDS_makeInt(PROCNUM, 20);
break;
case 0x42: // ALL_SEND_CID
case 0x43: // SEND_RELATIVE_ADDR
case 0x47: // SELECT_CARD
case 0x49: // SEND_CSD
case 0x4D:
case 0x77: // APP_CMD
case 0x69: // SD_APP_OP_COND
card.address = 0;
card.transfer_count = 6;
NDS_makeInt(PROCNUM, 20);
break;
// SET_BLOCKLEN
case 0x50:
card.address = 0;
card.transfer_count = 6;
card.blocklen = card.command[6] | (card.command[5] << 8) | (card.command[4] << 16) | (card.command[3] << 24);
NDS_makeInt(PROCNUM, 20);
break;
// READ_SINGLE_BLOCK
case 0x51:
card.address = card.command[6] | (card.command[5] << 8) | (card.command[4] << 16) | (card.command[3] << 24);
card.transfer_count = (card.blocklen + 3) >> 2;
NDS_makeInt(PROCNUM, 20);
break;
}
break;
// --- Ninja SD commands end ---------------------------------
default: default:
{ {
LOG("WRITE CARD command: %02X%02X%02X%02X%02X%02X%02X%02X\t", LOG("WRITE CARD command: %02X%02X%02X%02X%02X%02X%02X%02X\t",
@ -1210,23 +1274,17 @@ u32 MMU_readFromGC()
{ {
// Dummy // Dummy
case 0x9F: case 0x9F:
{ val = 0xFFFFFFFF;
val = 0xFFFFFFFF;
}
break; break;
// Nand Init? // Nand Init?
case 0x94: case 0x94:
{ val = 0; //Unsure what to return here so return 0 for now
val = 0; //Unsure what to return here so return 0 for now
}
break; break;
// Nand Error? // Nand Error?
case 0xD6: case 0xD6:
{ val = 0x80; //0x80 == ok?
val = 0x80; //0x80 == ok?
}
break; break;
// Data read // Data read
@ -1263,11 +1321,55 @@ u32 MMU_readFromGC()
// Switch to KEY1 mode // Switch to KEY1 mode
case 0x3C: case 0x3C:
val = 0xFFFFFFFF;
break;
// --- Ninja SD commands -------------------------------------
// NJSD_sendCMDN() / NJSD_sendCMDR()
case 0xF0:
case 0xF1:
switch (card.command[2])
{ {
val = 0xFFFFFFFF; // ALL_SEND_CID
case 0x42:
if (card.transfer_count == 2) val = 0x44534A4E;
else val = 0x00000000;
// SEND_RELATIVE_ADDR
case 0x43:
case 0x47:
case 0x49:
case 0x50:
val = 0x00000000;
break;
case 0x4D:
if (card.transfer_count == 2) val = 0x09000000;
else val = 0x00000000;
break;
// APP_CMD
case 0x77:
if (card.transfer_count == 2) val = 0x00000037;
else val = 0x00000000;
break;
// SD_APP_OP_COND
case 0x69:
if (card.transfer_count == 2) val = 0x00008000;
else val = 0x00000000;
break;
// READ_SINGLE_BLOCK
case 0x51:
val = 0x00000000;
break;
} }
break; break;
// --- Ninja SD commands end ---------------------------------
default: default:
LOG("READ CARD command: %02X%02X%02X%02X%02X%02X%02X%02X\t", LOG("READ CARD command: %02X%02X%02X%02X%02X%02X%02X%02X\t",
card.command[0], card.command[1], card.command[2], card.command[3], card.command[0], card.command[1], card.command[2], card.command[3],
@ -1306,6 +1408,10 @@ void FASTCALL MMU_doDMA(u32 num)
u32 taille = 0; u32 taille = 0;
bool paused = false; bool paused = false;
//if (dst == 0x022DD4E0)
// printf("proc %i dma %i: src=%08X, dst=%08X, size=%i, repmode=%i\n",
// PROCNUM, num, src, dst, (MMU.DMACrt[PROCNUM][num]&0x1FFFFF), MMU.DMAStartTime[PROCNUM][num]);
#ifdef USE_GEOMETRY_FIFO_EMULATION #ifdef USE_GEOMETRY_FIFO_EMULATION
if (MMU.DMAStartTime[PROCNUM][num]== EDMAMode_GXFifo) if (MMU.DMAStartTime[PROCNUM][num]== EDMAMode_GXFifo)
{ {

View File

@ -52,6 +52,9 @@ typedef struct
u32 transfer_count; u32 transfer_count;
ECardMode mode; ECardMode mode;
// NJSD stuff
int blocklen;
} nds_dscard; } nds_dscard;