diff --git a/arm9/source/dumpOperations.cpp b/arm9/source/dumpOperations.cpp index 97b711c..0bf4057 100644 --- a/arm9/source/dumpOperations.cpp +++ b/arm9/source/dumpOperations.cpp @@ -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); //} } } diff --git a/arm9/source/read_card.c b/arm9/source/read_card.c index dcfa798..4d5a275 100644 --- a/arm9/source/read_card.c +++ b/arm9/source/read_card.c @@ -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; } }