mirror of
https://github.com/rvtr/GodMode9i.git
synced 2025-11-02 00:11:07 -04:00
Implement GBA ROM dumping
This commit is contained in:
parent
9c0415adb0
commit
3aa9c24992
@ -21,6 +21,10 @@
|
|||||||
------------------------------------------------------------------*/
|
------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include <nds.h>
|
#include <nds.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "date.h"
|
#include "date.h"
|
||||||
@ -38,6 +42,73 @@ static bool flashcardMountRan = true;
|
|||||||
static bool dmTextPrinted = false;
|
static bool dmTextPrinted = false;
|
||||||
int dmCursorPosition = 0;
|
int dmCursorPosition = 0;
|
||||||
|
|
||||||
|
static u8 gbaFixedValue = 0;
|
||||||
|
|
||||||
|
void gbaCartDump(void) {
|
||||||
|
int pressed = 0;
|
||||||
|
|
||||||
|
printf ("\x1b[0;27H");
|
||||||
|
printf (" "); // Clear time
|
||||||
|
consoleInit(NULL, 1, BgType_Text4bpp, BgSize_T_256x256, 15, 0, false, true);
|
||||||
|
printf("Dump GBA cart ROM to\n");
|
||||||
|
printf("\"fat:/gm9i/out\"?\n");
|
||||||
|
printf("(<A> yes, <B> no)");
|
||||||
|
while (true) {
|
||||||
|
// Power saving loop. Only poll the keys once per frame and sleep the CPU if there is nothing else to do
|
||||||
|
do {
|
||||||
|
scanKeys();
|
||||||
|
pressed = keysDownRepeat();
|
||||||
|
swiWaitForVBlank();
|
||||||
|
} while (!(pressed & KEY_A) && !(pressed & KEY_B));
|
||||||
|
|
||||||
|
if (pressed & KEY_A) {
|
||||||
|
consoleClear();
|
||||||
|
if (access("fat:/gm9i", F_OK) != 0) {
|
||||||
|
printf("Creating directory...");
|
||||||
|
mkdir("fat:/gm9i", 0777);
|
||||||
|
}
|
||||||
|
if (access("fat:/gm9i/out", F_OK) != 0) {
|
||||||
|
printf ("\x1b[0;0H");
|
||||||
|
printf("Creating directory...");
|
||||||
|
mkdir("fat:/gm9i/out", 0777);
|
||||||
|
}
|
||||||
|
char gbaHeaderGameTitle[13] = "/0";
|
||||||
|
char gbaHeaderGameCode[5] = "/0";
|
||||||
|
char gbaHeaderMakerCode[3] = "/0";
|
||||||
|
for (int i = 0; i < 12; i++) {
|
||||||
|
gbaHeaderGameTitle[i] = *(char*)(0x080000A0+i);
|
||||||
|
if (*(u8*)(0x080000A0+i) == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
gbaHeaderGameCode[i] = *(char*)(0x080000AC+i);
|
||||||
|
if (*(u8*)(0x080000AC+i) == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 2; i++) {
|
||||||
|
gbaHeaderMakerCode[i] = *(char*)(0x080000B0+i);
|
||||||
|
}
|
||||||
|
char destPath[256];
|
||||||
|
snprintf(destPath, sizeof(destPath), "fat:/gm9i/out/%s_%s_%s.gba", gbaHeaderGameTitle, gbaHeaderGameCode, gbaHeaderMakerCode);
|
||||||
|
consoleClear();
|
||||||
|
printf("Dumping...\n");
|
||||||
|
printf("This may take a while.\n");
|
||||||
|
printf("\n");
|
||||||
|
printf("Do not remove the GBA cart.\n");
|
||||||
|
remove(destPath);
|
||||||
|
FILE* destinationFile = fopen(destPath, "wb");
|
||||||
|
fwrite((void*)0x08000000, 1, 0x400000, destinationFile);
|
||||||
|
fclose(destinationFile);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (pressed & KEY_B) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void driveMenu (void) {
|
void driveMenu (void) {
|
||||||
int pressed = 0;
|
int pressed = 0;
|
||||||
int held = 0;
|
int held = 0;
|
||||||
@ -54,14 +125,26 @@ void driveMenu (void) {
|
|||||||
flashcardMountRan = false;
|
flashcardMountRan = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gbaFixedValue = *(u8*)(0x080000B2);
|
||||||
|
|
||||||
if (!dmTextPrinted) {
|
if (!dmTextPrinted) {
|
||||||
consoleInit(NULL, 1, BgType_Text4bpp, BgSize_T_256x256, 15, 0, false, true);
|
consoleInit(NULL, 1, BgType_Text4bpp, BgSize_T_256x256, 15, 0, false, true);
|
||||||
if (dmCursorPosition == 0 && isDSiMode()) {
|
if (isDSiMode()) {
|
||||||
printf ("[sd:] SDCARD\n");
|
if (dmCursorPosition == 0) {
|
||||||
printf ("(SD FAT)");
|
printf ("[sd:] SDCARD\n");
|
||||||
|
printf ("(SD FAT)");
|
||||||
|
} else {
|
||||||
|
printf ("[fat:] GAMECART\n");
|
||||||
|
printf ("(Flashcart FAT)");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
printf ("[fat:] GAMECART\n");
|
if (dmCursorPosition == 0) {
|
||||||
printf ("(Flashcart FAT)");
|
printf ("[fat:] GAMECART\n");
|
||||||
|
printf ("(Flashcart FAT)");
|
||||||
|
} else if (!isDSiMode() && isRegularDS) {
|
||||||
|
printf ("GBA GAMECART\n");
|
||||||
|
printf ("(GBA Game)");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
iprintf ("\x1b[%i;0H", 22-isDSiMode());
|
iprintf ("\x1b[%i;0H", 22-isDSiMode());
|
||||||
printf (titleName);
|
printf (titleName);
|
||||||
@ -102,6 +185,14 @@ void driveMenu (void) {
|
|||||||
iprintf ("\x1b[%i;29H", 2+isDSiMode());
|
iprintf ("\x1b[%i;29H", 2+isDSiMode());
|
||||||
printf ("[x]");
|
printf ("[x]");
|
||||||
}
|
}
|
||||||
|
if (!isDSiMode() && isRegularDS) {
|
||||||
|
printf ("\x1b[3;1H");
|
||||||
|
printf ("GBA GAMECART");
|
||||||
|
if (gbaFixedValue != 0x96) {
|
||||||
|
printf ("\x1b[3;29H");
|
||||||
|
printf ("[x]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dmTextPrinted = true;
|
dmTextPrinted = true;
|
||||||
}
|
}
|
||||||
@ -120,38 +211,57 @@ void driveMenu (void) {
|
|||||||
held = keysHeld();
|
held = keysHeld();
|
||||||
swiWaitForVBlank();
|
swiWaitForVBlank();
|
||||||
|
|
||||||
if (REG_SCFG_MC != stored_SCFG_MC) {
|
if ((REG_SCFG_MC != stored_SCFG_MC)
|
||||||
|
|| (*(u8*)(0x080000B2) != gbaFixedValue)) {
|
||||||
dmTextPrinted = false;
|
dmTextPrinted = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} while (!(pressed & KEY_UP) && !(pressed & KEY_DOWN) && !(pressed & KEY_A) && !(held & KEY_R));
|
} while (!(pressed & KEY_UP) && !(pressed & KEY_DOWN) && !(pressed & KEY_A) && !(held & KEY_R));
|
||||||
|
|
||||||
if ((pressed & KEY_UP) && isDSiMode()) {
|
if (pressed & KEY_UP) {
|
||||||
dmCursorPosition -= 1;
|
if (isDSiMode() || isRegularDS) {
|
||||||
dmTextPrinted = false;
|
dmCursorPosition -= 1;
|
||||||
|
dmTextPrinted = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ((pressed & KEY_DOWN) && isDSiMode()) {
|
if (pressed & KEY_DOWN) {
|
||||||
dmCursorPosition += 1;
|
if (isDSiMode() || isRegularDS) {
|
||||||
dmTextPrinted = false;
|
dmCursorPosition += 1;
|
||||||
|
dmTextPrinted = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dmCursorPosition < 0) dmCursorPosition = 1; // Wrap around to bottom of list
|
if (dmCursorPosition < 0) dmCursorPosition = 1; // Wrap around to bottom of list
|
||||||
if (dmCursorPosition > 1) dmCursorPosition = 0; // Wrap around to top of list
|
if (dmCursorPosition > 1) dmCursorPosition = 0; // Wrap around to top of list
|
||||||
|
|
||||||
if (pressed & KEY_A) {
|
if (pressed & KEY_A) {
|
||||||
if (dmCursorPosition == 0 && isDSiMode()) {
|
if (dmCursorPosition == 0) {
|
||||||
if (sdMounted) {
|
if (isDSiMode()) {
|
||||||
dmTextPrinted = false;
|
if (sdMounted) {
|
||||||
chdir("sd:/");
|
dmTextPrinted = false;
|
||||||
screenMode = 1;
|
chdir("sd:/");
|
||||||
break;
|
screenMode = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (flashcardMounted) {
|
||||||
|
dmTextPrinted = false;
|
||||||
|
chdir("fat:/");
|
||||||
|
screenMode = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (flashcardMounted) {
|
if (isDSiMode()) {
|
||||||
|
if (flashcardMounted) {
|
||||||
|
dmTextPrinted = false;
|
||||||
|
chdir("fat:/");
|
||||||
|
screenMode = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (isRegularDS && flashcardMounted && gbaFixedValue == 0x96) {
|
||||||
dmTextPrinted = false;
|
dmTextPrinted = false;
|
||||||
chdir("fat:/");
|
gbaCartDump();
|
||||||
screenMode = 1;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -122,6 +122,8 @@ int main(int argc, char **argv) {
|
|||||||
printf ("\x1b[22;11H");
|
printf ("\x1b[22;11H");
|
||||||
printf ("mounting drive(s)...");
|
printf ("mounting drive(s)...");
|
||||||
|
|
||||||
|
sysSetCartOwner (BUS_OWNER_ARM9); // Allow arm9 to access GBA ROM
|
||||||
|
|
||||||
if (isDSiMode()) {
|
if (isDSiMode()) {
|
||||||
sdMounted = sdMount();
|
sdMounted = sdMount();
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user