mirror of
https://github.com/rvtr/GodMode9i.git
synced 2025-11-02 00:11:07 -04:00
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:
parent
d75ab87bfb
commit
7b105c09a1
@ -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);
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user