diff --git a/Makefile b/Makefile index 4433dbe..147e609 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ TARGET := GodMode9i BUILD := build SOURCES := source INCLUDES := include source -DATA := data +DATA := data dldi GRAPHICS := gfx #--------------------------------------------------------------------------------- diff --git a/arm9/source/driveMenu.cpp b/arm9/source/driveMenu.cpp index 9f7adfa..d4aa415 100644 --- a/arm9/source/driveMenu.cpp +++ b/arm9/source/driveMenu.cpp @@ -24,6 +24,7 @@ #include "main.h" #include "date.h" +#include "driveOperations.h" #define SCREEN_COLS 32 #define ENTRIES_PER_SCREEN 22 @@ -86,8 +87,20 @@ void driveMenu (void) { if (dmCursorPosition > 1) dmCursorPosition = 0; // Wrap around to top of list if (pressed & KEY_A) { - screenMode = 1; - break; + if (dmCursorPosition == 0 && isDSiMode()) { + chdir("sd:/"); + screenMode = 1; + break; + } else { + if (isDSiMode()) { + flashcardMount(); + } + if (flashcardFound()) { + chdir("fat:/"); + screenMode = 1; + break; + } + } } } } diff --git a/arm9/source/driveOperations.cpp b/arm9/source/driveOperations.cpp new file mode 100644 index 0000000..8e5de25 --- /dev/null +++ b/arm9/source/driveOperations.cpp @@ -0,0 +1,119 @@ +#include +#include +#include +#include +#include + +#include "r4idsn_sd_bin.h" +#include "ak2_sd_bin.h" + +static sNDSHeader nds; + +bool sdFound(void) { + if (access("sd:/", F_OK) == 0) { + return true; + } else { + return false; + } +} + +bool flashcardFound(void) { + if (access("fat:/", F_OK) == 0) { + return true; + } else { + return false; + } +} + +bool bothSDandFlashcard(void) { + if ((access("sd:/", F_OK) == 0) && (access("fat:/", F_OK) == 0)) { + return true; + } else { + return false; + } +} + +DLDI_INTERFACE* dldiLoadFromBin (void* dldiAddr, u16 size) { + DLDI_INTERFACE* device; + + if ((device = (DLDI_INTERFACE*)malloc (sizeof(DLDI_INTERFACE))) == NULL) { + return NULL; + } + + // Load entire DLDI + memcpy(device, dldiAddr, size); + + // Check that it is a valid DLDI + if (!dldiIsValid (device)) { + free (device); + return NULL; + } + + dldiFixDriverAddresses (device); + + if (device->ioInterface.features & FEATURE_SLOT_GBA) { + sysSetCartOwner(BUS_OWNER_ARM9); + } + if (device->ioInterface.features & FEATURE_SLOT_NDS) { + sysSetCardOwner(BUS_OWNER_ARM9); + } + + return device; +} + +bool UpdateCardInfo(sNDSHeader* nds, char* gameid, char* gamename) { + cardReadHeader((uint8*)nds); + memcpy(gameid, nds->gameCode, 4); + gameid[4] = 0x00; + memcpy(gamename, nds->gameTitle, 12); + gamename[12] = 0x00; + return true; +} + +void ShowGameInfo(const char gameid[], const char gamename[]) { + iprintf("Game id: %s\nName: %s", gameid, gamename); +} + +void flashcardMount(void) { + if (!flashcardFound() && REG_SCFG_MC != 0x11) { + // Reset Slot-1 to allow reading title name and ID + sysSetCardOwner (BUS_OWNER_ARM9); + disableSlot1(); + for(int i = 0; i < 25; i++) { swiWaitForVBlank(); } + enableSlot1(); + for(int i = 0; i < 15; i++) { swiWaitForVBlank(); } + + nds.gameCode[0] = 0; + nds.gameTitle[0] = 0; + char gamename[13]; + char gameid[5]; + + /*fifoSendValue32(FIFO_USER_04, 1); + for (int i = 0; i < 10; i++) { + swiWaitForVBlank(); + } + memcpy(&nds, (void*)0x02000000, sizeof(nds));*/ + UpdateCardInfo(&nds, &gameid[0], &gamename[0]); + + /*SetBrightness(0, 0); + SetBrightness(1, 0); + consoleDemoInit(); + iprintf("REG_SCFG_MC: %x\n", REG_SCFG_MC); + ShowGameInfo(gameid, gamename); + + for (int i = 0; i < 60*5; i++) { + swiWaitForVBlank(); + }*/ + + sysSetCardOwner (BUS_OWNER_ARM7); // 3DS fix + + // Read a DLDI driver specific to the cart + if (!memcmp(gamename, "R4DSULTRA", 9)) { + io_dldi_data = dldiLoadFromBin((void*)r4idsn_sd_bin, r4idsn_sd_bin_size); + fatMountSimple("fat", &io_dldi_data->ioInterface); + } else if (!memcmp(gameid, "YCEP", 4) || !memcmp(gameid, "AHZH", 4)) { + io_dldi_data = dldiLoadFromBin((void*)ak2_sd_bin, ak2_sd_bin_size); + fatMountSimple("fat", &io_dldi_data->ioInterface); + } + } +} \ No newline at end of file diff --git a/arm9/source/driveOperations.h b/arm9/source/driveOperations.h new file mode 100644 index 0000000..9884d10 --- /dev/null +++ b/arm9/source/driveOperations.h @@ -0,0 +1,9 @@ +#ifndef FLASHCARD_H +#define FLASHCARD_H + +bool sdFound(void); +bool flashcardFound(void); +bool bothSDandFlashcard(void); +void flashcardMount(void); + +#endif //FLASHCARD_H diff --git a/arm9/source/main.cpp b/arm9/source/main.cpp index a65be89..bc2c9a7 100644 --- a/arm9/source/main.cpp +++ b/arm9/source/main.cpp @@ -34,7 +34,7 @@ //#include "iconTitle.h" -char titleName[32]; +char titleName[32] = {" "}; int screenMode = 0; diff --git a/dldi/ak2_sd.bin b/dldi/ak2_sd.bin new file mode 100644 index 0000000..d94261a Binary files /dev/null and b/dldi/ak2_sd.bin differ diff --git a/dldi/r4idsn_sd.bin b/dldi/r4idsn_sd.bin new file mode 100644 index 0000000..9bb350b Binary files /dev/null and b/dldi/r4idsn_sd.bin differ