mirror of
https://github.com/sanni/cartreader.git
synced 2024-11-30 16:34:14 +01:00
Fix SRAM overflow in N64/MD, turn LED red if CRC not found
This commit is contained in:
parent
03935a3af0
commit
2f71d0572e
@ -4,7 +4,7 @@
|
|||||||
This project represents a community-driven effort to provide
|
This project represents a community-driven effort to provide
|
||||||
an easy to build and easy to modify cartridge dumper.
|
an easy to build and easy to modify cartridge dumper.
|
||||||
|
|
||||||
Date: 06.02.2023
|
Date: 10.02.2023
|
||||||
Version: 12.2
|
Version: 12.2
|
||||||
|
|
||||||
SD lib: https://github.com/greiman/SdFat
|
SD lib: https://github.com/greiman/SdFat
|
||||||
@ -863,12 +863,12 @@ boolean compareCRC(const char* database, char* crcString, boolean renamerom, int
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (strcmp(crc_search, crcStr) != 0) {
|
if (strcmp(crc_search, crcStr) != 0) {
|
||||||
println_Msg(F(" -> Not found"));
|
print_Error(F(" -> Not found"));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
println_Msg(F(" -> Error"));
|
println_Msg(F(" -> Error"));
|
||||||
println_Msg(F("Database missing"));
|
print_Error(F("Database missing"));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#else // nointro
|
#else // nointro
|
||||||
|
@ -306,6 +306,12 @@ void mdCartMenu() {
|
|||||||
readRealtec_MD();
|
readRealtec_MD();
|
||||||
} else {
|
} else {
|
||||||
readROM_MD();
|
readROM_MD();
|
||||||
|
// Calculate and compare CRC32 with nointro
|
||||||
|
if (is32x)
|
||||||
|
//database, crcString, renamerom, offset
|
||||||
|
compareCRC("32x.txt", 0, 1, 0);
|
||||||
|
else
|
||||||
|
compareCRC("md.txt", 0, 1, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
print_Error(F("Cart has no ROM"));
|
print_Error(F("Cart has no ROM"));
|
||||||
@ -1476,13 +1482,6 @@ void readROM_MD() {
|
|||||||
display_Update();
|
display_Update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate and compare CRC32 with nointro
|
|
||||||
if (is32x)
|
|
||||||
//database, crcString, renamerom, offset
|
|
||||||
compareCRC("32x.txt", 0, 1, 0);
|
|
||||||
else
|
|
||||||
compareCRC("md.txt", 0, 1, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************
|
/******************************************
|
||||||
|
@ -237,8 +237,21 @@ void n64CartMenu() {
|
|||||||
// wait for user choice to come back from the question box menu
|
// wait for user choice to come back from the question box menu
|
||||||
switch (mainMenu) {
|
switch (mainMenu) {
|
||||||
case 0:
|
case 0:
|
||||||
|
display_Clear();
|
||||||
sd.chdir("/");
|
sd.chdir("/");
|
||||||
readRom_N64();
|
readRom_N64();
|
||||||
|
#ifndef fastcrc
|
||||||
|
sd.chdir("/");
|
||||||
|
// CRC32
|
||||||
|
compareCRC("n64.txt", 0, 1, 0);
|
||||||
|
#endif
|
||||||
|
#ifdef global_log
|
||||||
|
save_log();
|
||||||
|
#endif
|
||||||
|
// Prints string out of the common strings array either with or without newline
|
||||||
|
print_STR(press_button_STR, 1);
|
||||||
|
display_Update();
|
||||||
|
wait();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
@ -2772,14 +2785,14 @@ void readRom_N64() {
|
|||||||
strcpy(fileName, romName);
|
strcpy(fileName, romName);
|
||||||
strcat(fileName, ".Z64");
|
strcat(fileName, ".Z64");
|
||||||
|
|
||||||
redumpnewfolder:
|
|
||||||
// create a new folder
|
// create a new folder
|
||||||
EEPROM_readAnything(0, foldern);
|
EEPROM_readAnything(0, foldern);
|
||||||
sprintf(folder, "N64/ROM/%s/%d", romName, foldern);
|
sprintf(folder, "N64/ROM/%s/%d", romName, foldern);
|
||||||
sd.mkdir(folder, true);
|
sd.mkdir(folder, true);
|
||||||
sd.chdir(folder);
|
sd.chdir(folder);
|
||||||
|
|
||||||
display_Clear();
|
// clear the screen
|
||||||
|
// display_Clear();
|
||||||
print_STR(saving_to_STR, 0);
|
print_STR(saving_to_STR, 0);
|
||||||
print_Msg(folder);
|
print_Msg(folder);
|
||||||
println_Msg(F("/..."));
|
println_Msg(F("/..."));
|
||||||
@ -2789,17 +2802,19 @@ redumpnewfolder:
|
|||||||
foldern = foldern + 1;
|
foldern = foldern + 1;
|
||||||
EEPROM_writeAnything(0, foldern);
|
EEPROM_writeAnything(0, foldern);
|
||||||
|
|
||||||
redumpsamefolder:
|
|
||||||
// Open file on sd card
|
// Open file on sd card
|
||||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||||
print_FatalError(sd_error_STR);
|
print_FatalError(create_file_STR);
|
||||||
}
|
}
|
||||||
|
|
||||||
// get current time
|
|
||||||
unsigned long startTime = millis();
|
|
||||||
#ifndef fastcrc
|
#ifndef fastcrc
|
||||||
// dumping rom slow
|
// dumping rom slow
|
||||||
|
|
||||||
|
//Initialize progress bar
|
||||||
|
uint32_t processedProgressBar = 0;
|
||||||
|
uint32_t totalProgressBar = (uint32_t)(cartSize)*1024 * 1024;
|
||||||
|
draw_progressbar(0, totalProgressBar);
|
||||||
|
|
||||||
for (unsigned long currByte = romBase; currByte < (romBase + (cartSize * 1024 * 1024)); currByte += 512) {
|
for (unsigned long currByte = romBase; currByte < (romBase + (cartSize * 1024 * 1024)); currByte += 512) {
|
||||||
// Blink led
|
// Blink led
|
||||||
if ((currByte & 0x3FFF) == 0)
|
if ((currByte & 0x3FFF) == 0)
|
||||||
@ -2808,17 +2823,18 @@ redumpsamefolder:
|
|||||||
// Set the address for the next 512 bytes
|
// Set the address for the next 512 bytes
|
||||||
setAddress_N64(currByte);
|
setAddress_N64(currByte);
|
||||||
|
|
||||||
for (word c = 0; c < sizeof(sdBuffer); c += 2) {
|
for (word c = 0; c < 512; c += 2) {
|
||||||
word myWord = readWord_N64();
|
word myWord = readWord_N64();
|
||||||
sdBuffer[c] = myWord >> 8;
|
sdBuffer[c] = myWord >> 8;
|
||||||
sdBuffer[c + 1] = myWord & 0xFF;
|
sdBuffer[c + 1] = myWord & 0xFF;
|
||||||
}
|
}
|
||||||
myFile.write(sdBuffer, sizeof(sdBuffer));
|
myFile.write(sdBuffer, 512);
|
||||||
|
|
||||||
|
processedProgressBar += 512;
|
||||||
|
draw_progressbar(processedProgressBar, totalProgressBar);
|
||||||
}
|
}
|
||||||
// Close the file:
|
// Close the file:
|
||||||
myFile.close();
|
myFile.close();
|
||||||
|
|
||||||
if (compareCRC("n64.txt", 0, 1, 0)) {
|
|
||||||
#else
|
#else
|
||||||
// dumping rom fast
|
// dumping rom fast
|
||||||
byte buffer[1024];
|
byte buffer[1024];
|
||||||
@ -2906,84 +2922,8 @@ redumpsamefolder:
|
|||||||
sprintf(crcStr, "%08lX", ~oldcrc32);
|
sprintf(crcStr, "%08lX", ~oldcrc32);
|
||||||
|
|
||||||
// Search n64.txt for crc
|
// Search n64.txt for crc
|
||||||
if (compareCRC("n64.txt", crcStr, 1, 0)) {
|
compareCRC("n64.txt", crcStr, 1, 0);
|
||||||
#endif
|
#endif
|
||||||
unsigned long timeElapsed = (millis() - startTime) / 1000; // seconds
|
|
||||||
print_Msg(F("Done ("));
|
|
||||||
print_Msg(timeElapsed); // include elapsed time
|
|
||||||
println_Msg(F("s)"));
|
|
||||||
println_Msg(F(""));
|
|
||||||
// Prints string out of the common strings array either with or without newline
|
|
||||||
print_STR(press_button_STR, 1);
|
|
||||||
display_Update();
|
|
||||||
// This saves a tt file with rom info next to the dumped rom
|
|
||||||
#ifdef savesummarytotxt
|
|
||||||
savesummary_N64(1, crcStr, timeElapsed);
|
|
||||||
#endif
|
|
||||||
#ifdef global_log
|
|
||||||
save_log();
|
|
||||||
#endif
|
|
||||||
wait();
|
|
||||||
} else {
|
|
||||||
// Dump was bad or unknown
|
|
||||||
errorLvl = 1;
|
|
||||||
setColor_RGB(255, 0, 0);
|
|
||||||
println_Msg(F(""));
|
|
||||||
// Prints string out of the common strings array either with or without newline
|
|
||||||
print_STR(press_button_STR, 1);
|
|
||||||
display_Update();
|
|
||||||
// This saves a tt file with rom info next to the dumped rom
|
|
||||||
#ifdef savesummarytotxt
|
|
||||||
savesummary_N64(0, crcStr, timeElapsed);
|
|
||||||
#endif
|
|
||||||
wait();
|
|
||||||
|
|
||||||
// N64 CRC32 error Menu
|
|
||||||
unsigned char CRCMenu;
|
|
||||||
// Copy menuOptions out of progmem
|
|
||||||
convertPgm(menuOptionsN64CRC, 4);
|
|
||||||
|
|
||||||
CRCMenu = question_box(F("Redump cartridge?"), menuOptions, 4, 0);
|
|
||||||
|
|
||||||
// wait for user choice to come back from the question box menu
|
|
||||||
switch (CRCMenu) {
|
|
||||||
case 0:
|
|
||||||
// Return to N64 menu
|
|
||||||
display_Clear();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
// Dump again into new folder
|
|
||||||
display_Clear();
|
|
||||||
setColor_RGB(0, 0, 0);
|
|
||||||
goto redumpnewfolder;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
// Dump again into same folder
|
|
||||||
// Change to last directory
|
|
||||||
sd.chdir(folder);
|
|
||||||
// Delete old file
|
|
||||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
|
||||||
print_FatalError(sd_error_STR);
|
|
||||||
}
|
|
||||||
if (!myFile.remove()) {
|
|
||||||
print_FatalError(F("Delete Error"));
|
|
||||||
}
|
|
||||||
// Dump again
|
|
||||||
display_Clear();
|
|
||||||
println_Msg(F("Reading Rom..."));
|
|
||||||
display_Update();
|
|
||||||
setColor_RGB(0, 0, 0);
|
|
||||||
goto redumpsamefolder;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
// Reset
|
|
||||||
resetArduino();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef savesummarytotxt
|
#ifdef savesummarytotxt
|
||||||
|
Loading…
Reference in New Issue
Block a user