diff --git a/arm9/source/ndsheaderbanner.h b/arm9/source/ndsheaderbanner.h index 88f5546..7d0c42f 100644 --- a/arm9/source/ndsheaderbanner.h +++ b/arm9/source/ndsheaderbanner.h @@ -117,7 +117,7 @@ typedef struct { // 0x200 // TODO: More DSi-specific fields. - u8 dsi1[0x10]; + u32 dsi1[0x10/4]; u32 twlRomSize; u32 dsi_unk3; u32 dsi_unk4; diff --git a/arm9/source/read_card.c b/arm9/source/read_card.c index a61ab87..f122bf3 100644 --- a/arm9/source/read_card.c +++ b/arm9/source/read_card.c @@ -290,23 +290,24 @@ int cardInit (sNDSHeaderExt* ndsHeader) u32 iCardId=cardReadID(CARD_CLK_SLOW); while(REG_ROMCTRL & CARD_BUSY); - u32 iCheapCard=iCardId&0x80000000; + //u32 iCheapCard=iCardId&0x80000000; // Read the header - if(iCheapCard) - { - //this is magic of wood goblins - for(size_t ii=0;ii<8;++ii) { - cardParamCommand (CARD_CMD_HEADER_READ, ii*0x200, - CARD_ACTIVATE | CARD_nRESET | CARD_CLK_SLOW | CARD_BLK_SIZE(1) | CARD_DELAY1(0x1FFF) | CARD_DELAY2(0x3F), - (u32*)(void*)(ndsHeader+ii*0x200), 0x200/sizeof(u32)); - } - } - else + cardParamCommand (CARD_CMD_HEADER_READ, 0, + CARD_ACTIVATE | CARD_nRESET | CARD_CLK_SLOW | CARD_BLK_SIZE(1) | CARD_DELAY1(0x1FFF) | CARD_DELAY2(0x3F), + (void*)ndsHeader, 0x200/sizeof(u32)); + + 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), - (u32*)(void*)ndsHeader, 0x1000/sizeof(u32)); + (void*)ndsHeader, 0x1000/sizeof(u32)); + if (ndsHeader->dsi1[0]==0xFFFFFFFF && ndsHeader->dsi1[1]==0xFFFFFFFF + && ndsHeader->dsi1[2]==0xFFFFFFFF && ndsHeader->dsi1[3]==0xFFFFFFFF) + { + toncset((u8*)ndsHeader+0x200, 0, 0xE00); + } } // Check header CRC