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 id = cardReadID(CARD_CLK_SLOW);
u16 flags = id >> 16;
if ((id & 0xFF) == 0xEC) { // Samsung
switch(flags) {
case 0x8801:
return 8 << 20; // 8MByte - Jam with the Band
break;
case 0x8800:
return 16 << 20; // 16MByte - WarioWare D.I.Y.
break;
case 0xE800:
return 82 << 20; // 82MByte - Face Training
break;
}
switch(*(u32*)ndsCardHeader.gameCode & 0x00FFFFFF) {
case 0x00425855: // 'UXB'
return 8 << 20; // 8MByte - Jam with the Band
case 0x00524F55: // 'UOR'
return 16 << 20; // 16MByte - WarioWare D.I.Y.
case 0x004B5355: // 'USK'
return 82 << 20; // 82MByte - Face Training
}
return 0;
@ -207,13 +198,6 @@ void ndsCardSaveDump(const char* filename) {
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;
FILE* destinationFile = fopen(filename, "wb");
if (destinationFile) {
@ -231,7 +215,7 @@ void ndsCardSaveDump(const char* filename) {
font->update(false);
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) {
dumpFailMsg(true);
@ -680,6 +664,11 @@ void ndsCardDump(void) {
font->print(-1, 0, true, RetTime(), Alignment::right, Palette::blackGreen);
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->printf(0, 6, false, Alignment::left, Palette::white, "%d/%d Bytes", src, romSize);
font->update(false);
@ -697,7 +686,8 @@ void ndsCardDump(void) {
} else {
dumpFailMsg(false);
}
ndsCardSaveDump(destSavPath);
// TODO: Uncomment, just commented for testing
// ndsCardSaveDump(destSavPath);
//}
}
}

View File

@ -300,7 +300,7 @@ int cardInit (sNDSHeaderExt* ndsHeader)
twlBlowfish = false;
sysSetCardOwner (BUS_OWNER_ARM9); // Allow arm9 to access NDS cart
if (isDSiMode()) {
if (isDSiMode()) {
// Reset card slot
disableSlot1();
for(i = 0; i < 25; i++) { swiWaitForVBlank(); }
@ -311,18 +311,21 @@ int cardInit (sNDSHeaderExt* ndsHeader)
cardParamCommand (CARD_CMD_DUMMY, 0,
CARD_ACTIVATE | CARD_nRESET | CARD_CLK_SLOW | CARD_BLK_SIZE(1) | CARD_DELAY1(0x1FFF) | CARD_DELAY2(0x3F),
NULL, 0);
} else {
REG_ROMCTRL=0;
REG_AUXSPICNT=0;
//ioDelay2(167550);
for(i = 0; i < 25; i++) { swiWaitForVBlank(); }
REG_AUXSPICNT=CARD_CR1_ENABLE|CARD_CR1_IRQ;
REG_ROMCTRL=CARD_nRESET|CARD_SEC_SEED;
while(REG_ROMCTRL&CARD_BUSY) ;
cardReset();
while(REG_ROMCTRL&CARD_BUSY) ;
}
// 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_AUXSPICNT=0;
//ioDelay2(167550);
for(i = 0; i < 25; i++) { swiWaitForVBlank(); }
REG_AUXSPICNT=CARD_CR1_ENABLE|CARD_CR1_IRQ;
REG_ROMCTRL=CARD_nRESET|CARD_SEC_SEED;
while(REG_ROMCTRL&CARD_BUSY) ;
cardReset();
while(REG_ROMCTRL&CARD_BUSY) ;
toncset(headerData, 0, 0x1000);
u32 iCardId=cardReadID(CARD_CLK_SLOW);
@ -332,7 +335,7 @@ int cardInit (sNDSHeaderExt* ndsHeader)
// Check if NAND
nandChip = (iCardId >> 24) & BIT(3);
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;
}
@ -346,9 +349,17 @@ int cardInit (sNDSHeaderExt* ndsHeader)
if ((ndsHeader->unitCode != 0) || (ndsHeader->dsi_flags != 0))
{
// Extended header found
cardParamCommand (CARD_CMD_HEADER_READ, 0,
CARD_ACTIVATE | CARD_nRESET | CARD_CLK_SLOW | CARD_BLK_SIZE(4) | CARD_DELAY1(0x1FFF) | CARD_DELAY2(0x3F),
(void*)headerData, 0x1000/sizeof(u32));
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,
CARD_ACTIVATE | CARD_nRESET | CARD_CLK_SLOW | CARD_BLK_SIZE(4) | CARD_DELAY1(0x1FFF) | CARD_DELAY2(0x3F),
(void*)headerData, 0x1000/sizeof(u32));
}
if (ndsHeader->dsi1[0]==0xFFFFFFFF && ndsHeader->dsi1[1]==0xFFFFFFFF
&& ndsHeader->dsi1[2]==0xFFFFFFFF && ndsHeader->dsi1[3]==0xFFFFFFFF)
{
@ -488,10 +499,10 @@ void cardRead (u32 src, void* dest)
if (nandChip) {
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;
} 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;
}
}