Fix NAND card header reading

It now tries to dump, but the rest of the dump is garbage. It tries the save too, but I think that's also garbage.

This breaks some things that worked before, marked with TODOs. I'll fix them once NAND works.
This commit is contained in:
Pk11 2021-10-04 18:08:12 -05:00
parent d75ab87bfb
commit 7b105c09a1
2 changed files with 43 additions and 42 deletions

View File

@ -168,22 +168,13 @@ void cardEepromChipEraseFixed(void) {
} }
u32 cardNandGetSaveSize(void) { u32 cardNandGetSaveSize(void) {
u32 id = cardReadID(CARD_CLK_SLOW); switch(*(u32*)ndsCardHeader.gameCode & 0x00FFFFFF) {
case 0x00425855: // 'UXB'
u16 flags = id >> 16;
if ((id & 0xFF) == 0xEC) { // Samsung
switch(flags) {
case 0x8801:
return 8 << 20; // 8MByte - Jam with the Band return 8 << 20; // 8MByte - Jam with the Band
break; case 0x00524F55: // 'UOR'
case 0x8800:
return 16 << 20; // 16MByte - WarioWare D.I.Y. return 16 << 20; // 16MByte - WarioWare D.I.Y.
break; case 0x004B5355: // 'USK'
case 0xE800:
return 82 << 20; // 82MByte - Face Training return 82 << 20; // 82MByte - Face Training
break;
}
} }
return 0; return 0;
@ -207,13 +198,6 @@ void ndsCardSaveDump(const char* filename) {
return; return;
} }
// testing print
font->clear(false);
font->printf(0, 0, false, Alignment::left, Palette::white, "Found NAND save: Size: %d MiB", saveSize >> 20);
font->update(false);
for(int i = 0; i < 120; i++)
swiWaitForVBlank();
u32 currentSize = saveSize; u32 currentSize = saveSize;
FILE* destinationFile = fopen(filename, "wb"); FILE* destinationFile = fopen(filename, "wb");
if (destinationFile) { if (destinationFile) {
@ -231,7 +215,7 @@ void ndsCardSaveDump(const char* filename) {
font->update(false); font->update(false);
for (u32 i = 0; i < 0x8000; i += 0x200) { for (u32 i = 0; i < 0x8000; i += 0x200) {
cardRead(src+i, copyBuf+i); cardRead(ndsCardHeader.nandRwStart + src + i, copyBuf + i);
} }
if (fwrite(copyBuf, 1, (currentSize >= 0x8000 ? 0x8000 : currentSize), destinationFile) < 1) { if (fwrite(copyBuf, 1, (currentSize >= 0x8000 ? 0x8000 : currentSize), destinationFile) < 1) {
dumpFailMsg(true); dumpFailMsg(true);
@ -680,6 +664,11 @@ void ndsCardDump(void) {
font->print(-1, 0, true, RetTime(), Alignment::right, Palette::blackGreen); font->print(-1, 0, true, RetTime(), Alignment::right, Palette::blackGreen);
font->update(true); font->update(true);
// TODO: Remove, just for testing
scanKeys();
if(keysDown() & KEY_B)
break;
font->print((src / (romSize / (SCREEN_COLS - 2))) + 1, 5, false, "="); font->print((src / (romSize / (SCREEN_COLS - 2))) + 1, 5, false, "=");
font->printf(0, 6, false, Alignment::left, Palette::white, "%d/%d Bytes", src, romSize); font->printf(0, 6, false, Alignment::left, Palette::white, "%d/%d Bytes", src, romSize);
font->update(false); font->update(false);
@ -697,7 +686,8 @@ void ndsCardDump(void) {
} else { } else {
dumpFailMsg(false); dumpFailMsg(false);
} }
ndsCardSaveDump(destSavPath); // TODO: Uncomment, just commented for testing
// ndsCardSaveDump(destSavPath);
//} //}
} }
} }

View File

@ -311,7 +311,11 @@ int cardInit (sNDSHeaderExt* ndsHeader)
cardParamCommand (CARD_CMD_DUMMY, 0, cardParamCommand (CARD_CMD_DUMMY, 0,
CARD_ACTIVATE | CARD_nRESET | CARD_CLK_SLOW | CARD_BLK_SIZE(1) | CARD_DELAY1(0x1FFF) | CARD_DELAY2(0x3F), CARD_ACTIVATE | CARD_nRESET | CARD_CLK_SLOW | CARD_BLK_SIZE(1) | CARD_DELAY1(0x1FFF) | CARD_DELAY2(0x3F),
NULL, 0); NULL, 0);
} else { }
// TODO: This was only done in DS mode, but fixes NAND in DSi mode
// see if only part of this is needed or if it causes problems to do
// all of it in DSi mode.
REG_ROMCTRL=0; REG_ROMCTRL=0;
REG_AUXSPICNT=0; REG_AUXSPICNT=0;
//ioDelay2(167550); //ioDelay2(167550);
@ -321,7 +325,6 @@ int cardInit (sNDSHeaderExt* ndsHeader)
while(REG_ROMCTRL&CARD_BUSY) ; while(REG_ROMCTRL&CARD_BUSY) ;
cardReset(); cardReset();
while(REG_ROMCTRL&CARD_BUSY) ; while(REG_ROMCTRL&CARD_BUSY) ;
}
toncset(headerData, 0, 0x1000); toncset(headerData, 0, 0x1000);
@ -332,7 +335,7 @@ int cardInit (sNDSHeaderExt* ndsHeader)
// Check if NAND // Check if NAND
nandChip = (iCardId >> 24) & BIT(3); nandChip = (iCardId >> 24) & BIT(3);
if (nandChip) { if (nandChip) {
cardParamCommand(CARD_CMD_NAND_ROM_MODE, 0, portFlags | CARD_ACTIVATE | CARD_nRESET | CARD_BLK_SIZE(1), NULL, 0); // cardParamCommand(CARD_CMD_NAND_ROM_MODE, 0, CARD_ACTIVATE | CARD_nRESET | CARD_CLK_SLOW | CARD_BLK_SIZE(7) | CARD_DELAY1(0x1FFF) | CARD_DELAY2(0x3F), NULL, 0);
nandRomMode = true; nandRomMode = true;
} }
@ -346,9 +349,17 @@ int cardInit (sNDSHeaderExt* ndsHeader)
if ((ndsHeader->unitCode != 0) || (ndsHeader->dsi_flags != 0)) if ((ndsHeader->unitCode != 0) || (ndsHeader->dsi_flags != 0))
{ {
// Extended header found // Extended header found
if(true) { // TODO: some need single 1000h?
for(int i = 0; i < 8; i++) {
cardParamCommand (CARD_CMD_HEADER_READ, i * 0x200,
CARD_ACTIVATE | CARD_nRESET | CARD_CLK_SLOW | CARD_BLK_SIZE(1) | CARD_DELAY1(0x1FFF) | CARD_DELAY2(0x3F),
headerData + i * 0x200 / sizeof(u32), 0x200/sizeof(u32));
}
} else {
cardParamCommand (CARD_CMD_HEADER_READ, 0, cardParamCommand (CARD_CMD_HEADER_READ, 0,
CARD_ACTIVATE | CARD_nRESET | CARD_CLK_SLOW | CARD_BLK_SIZE(4) | CARD_DELAY1(0x1FFF) | CARD_DELAY2(0x3F), CARD_ACTIVATE | CARD_nRESET | CARD_CLK_SLOW | CARD_BLK_SIZE(4) | CARD_DELAY1(0x1FFF) | CARD_DELAY2(0x3F),
(void*)headerData, 0x1000/sizeof(u32)); (void*)headerData, 0x1000/sizeof(u32));
}
if (ndsHeader->dsi1[0]==0xFFFFFFFF && ndsHeader->dsi1[1]==0xFFFFFFFF if (ndsHeader->dsi1[0]==0xFFFFFFFF && ndsHeader->dsi1[1]==0xFFFFFFFF
&& ndsHeader->dsi1[2]==0xFFFFFFFF && ndsHeader->dsi1[3]==0xFFFFFFFF) && ndsHeader->dsi1[2]==0xFFFFFFFF && ndsHeader->dsi1[3]==0xFFFFFFFF)
{ {
@ -488,10 +499,10 @@ void cardRead (u32 src, void* dest)
if (nandChip) { if (nandChip) {
if (src < ndsHeader->nandRomEnd * 0x20000 /*dsi: 80000h?*/ && !nandRomMode) { if (src < ndsHeader->nandRomEnd * 0x20000 /*dsi: 80000h?*/ && !nandRomMode) {
cardParamCommand(CARD_CMD_NAND_ROM_MODE, 0, portFlags | CARD_ACTIVATE | CARD_nRESET | CARD_BLK_SIZE(1), NULL, 0); cardParamCommand(CARD_CMD_NAND_ROM_MODE, 0, CARD_ACTIVATE | CARD_nRESET | CARD_CLK_SLOW | CARD_BLK_SIZE(7) | CARD_DELAY1(0x1FFF) | CARD_DELAY2(0x3F), NULL, 0);
nandRomMode = true; nandRomMode = true;
} else if (src > ndsHeader->nandRwStart * 0x20000 /*dsi: 80000h?*/ && nandRomMode) { } else if (src > ndsHeader->nandRwStart * 0x20000 /*dsi: 80000h?*/ && nandRomMode) {
cardParamCommand(CARD_CMD_NAND_RW_MODE, 0, portFlags | CARD_ACTIVATE | CARD_nRESET | CARD_BLK_SIZE(1), NULL, 0); cardParamCommand(CARD_CMD_NAND_RW_MODE, 0, CARD_ACTIVATE | CARD_nRESET | CARD_CLK_SLOW | CARD_BLK_SIZE(7) | CARD_DELAY1(0x1FFF) | CARD_DELAY2(0x3F), NULL, 0);
nandRomMode = false; nandRomMode = false;
} }
} }