mirror of
https://github.com/sanni/cartreader.git
synced 2024-12-28 14:01:52 +01:00
Merge pull request #596 from vpelletier/trim
Free some program and global ram space
This commit is contained in:
commit
202e5ff25e
@ -51,8 +51,8 @@ byte newcolsize;
|
||||
static const char colMenuItem1[] PROGMEM = "Select Cart";
|
||||
static const char colMenuItem2[] PROGMEM = "Read ROM";
|
||||
static const char colMenuItem3[] PROGMEM = "Set Size";
|
||||
static const char colMenuItem4[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsCOL[] PROGMEM = { colMenuItem1, colMenuItem2, colMenuItem3, colMenuItem4 };
|
||||
//static const char colMenuItem4[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsCOL[] PROGMEM = { colMenuItem1, colMenuItem2, colMenuItem3, string_reset2 };
|
||||
|
||||
void setup_COL() {
|
||||
// Set Address Pins to Output
|
||||
@ -175,14 +175,14 @@ void readROM_COL() {
|
||||
sd.chdir(folder);
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("Saving to "));
|
||||
print_STR(saving_to_STR, 0);
|
||||
print_Msg(folder);
|
||||
println_Msg(F("/..."));
|
||||
display_Update();
|
||||
|
||||
// open file on sdcard
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT))
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
|
||||
// write new folder number back to EEPROM
|
||||
foldern++;
|
||||
@ -216,7 +216,8 @@ void readROM_COL() {
|
||||
compareCRC("colv.txt", 0, 1, 0);
|
||||
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
@ -239,11 +240,11 @@ void setROMSize_COL() {
|
||||
println_Msg(COL[i]);
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to Change"));
|
||||
println_Msg(F("and right to Select"));
|
||||
print_STR(press_to_change_STR, 1);
|
||||
print_STR(right_to_select_STR, 1);
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to Change"));
|
||||
println_Msg(F("Press to Select"));
|
||||
print_STR(rotate_to_change_STR, 1);
|
||||
print_STR(press_to_select_STR, 1);
|
||||
#endif
|
||||
display_Update();
|
||||
|
||||
@ -261,11 +262,11 @@ void setROMSize_COL() {
|
||||
println_Msg(COL[i]);
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to Change"));
|
||||
println_Msg(F("and right to Select"));
|
||||
print_STR(press_to_change_STR, 1);
|
||||
print_STR(right_to_select_STR, 1);
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to Change"));
|
||||
println_Msg(F("Press to Select"));
|
||||
print_STR(rotate_to_change_STR, 1);
|
||||
print_STR(press_to_select_STR, 1);
|
||||
#endif
|
||||
display_Update();
|
||||
}
|
||||
@ -281,11 +282,11 @@ void setROMSize_COL() {
|
||||
println_Msg(COL[i]);
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to Change"));
|
||||
println_Msg(F("and right to Select"));
|
||||
print_STR(press_to_change_STR, 1);
|
||||
print_STR(right_to_select_STR, 1);
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to Change"));
|
||||
println_Msg(F("Press to Select"));
|
||||
print_STR(rotate_to_change_STR, 1);
|
||||
print_STR(press_to_select_STR, 1);
|
||||
#endif
|
||||
display_Update();
|
||||
}
|
||||
@ -349,7 +350,8 @@ void checkStatus_COL() {
|
||||
print_Msg(COL[colsize]);
|
||||
println_Msg(F("K"));
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
#else
|
||||
@ -392,20 +394,7 @@ void setCart_COL() {
|
||||
}
|
||||
|
||||
// Rewind one line
|
||||
for (byte count_newline = 0; count_newline < 2; count_newline++) {
|
||||
while (1) {
|
||||
if (myFile.curPosition() == 0) {
|
||||
break;
|
||||
} else if (myFile.peek() == '\n') {
|
||||
myFile.seekSet(myFile.curPosition() - 1);
|
||||
break;
|
||||
} else {
|
||||
myFile.seekSet(myFile.curPosition() - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (myFile.curPosition() != 0)
|
||||
myFile.seekSet(myFile.curPosition() + 2);
|
||||
rewind_line(myFile);
|
||||
}
|
||||
|
||||
// Display database
|
||||
@ -423,7 +412,7 @@ void setCart_COL() {
|
||||
}
|
||||
|
||||
// Skip over semicolon
|
||||
myFile.seekSet(myFile.curPosition() + 1);
|
||||
myFile.seekCur(1);
|
||||
|
||||
// Read CRC32 of first 512 bytes
|
||||
sprintf(crc_search, "%c", myFile.read());
|
||||
@ -433,7 +422,7 @@ void setCart_COL() {
|
||||
}
|
||||
|
||||
// Skip over semicolon
|
||||
myFile.seekSet(myFile.curPosition() + 1);
|
||||
myFile.seekCur(1);
|
||||
|
||||
// Read rom size
|
||||
// Read the next ascii character and subtract 48 to convert to decimal
|
||||
@ -447,7 +436,7 @@ void setCart_COL() {
|
||||
}
|
||||
|
||||
// Skip rest of line
|
||||
myFile.seekSet(myFile.curPosition() + 2);
|
||||
myFile.seekCur(2);
|
||||
|
||||
// Skip every 3rd line
|
||||
skip_line(&myFile);
|
||||
@ -460,11 +449,11 @@ void setCart_COL() {
|
||||
println_Msg(F("KB"));
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to Change"));
|
||||
println_Msg(F("and right to Select"));
|
||||
print_STR(press_to_change_STR, 1);
|
||||
print_STR(right_to_select_STR, 1);
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to Change"));
|
||||
println_Msg(F("Press to Select"));
|
||||
print_STR(rotate_to_change_STR, 1);
|
||||
print_STR(press_to_select_STR, 1);
|
||||
#elif defined(SERIAL_MONITOR)
|
||||
println_Msg(F("U/D to Change"));
|
||||
println_Msg(F("Space to Select"));
|
||||
@ -483,20 +472,7 @@ void setCart_COL() {
|
||||
|
||||
// Previous
|
||||
else if (b == 2) {
|
||||
for (byte count_newline = 0; count_newline < 7; count_newline++) {
|
||||
while (1) {
|
||||
if (myFile.curPosition() == 0) {
|
||||
break;
|
||||
} else if (myFile.peek() == '\n') {
|
||||
myFile.seekSet(myFile.curPosition() - 1);
|
||||
break;
|
||||
} else {
|
||||
myFile.seekSet(myFile.curPosition() - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (myFile.curPosition() != 0)
|
||||
myFile.seekSet(myFile.curPosition() + 2);
|
||||
rewind_line(myFile, 6);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -56,7 +56,7 @@
|
||||
|
||||
**********************************************************************************/
|
||||
|
||||
char ver[5] = "10.3";
|
||||
char ver[5] = "10.4";
|
||||
|
||||
//******************************************
|
||||
// !!! CHOOSE HARDWARE VERSION !!!
|
||||
@ -176,7 +176,6 @@ char ver[5] = "10.3";
|
||||
// SD Card
|
||||
#include "SdFat.h"
|
||||
SdFs sd;
|
||||
FsFile myDir;
|
||||
FsFile myFile;
|
||||
#ifdef global_log
|
||||
FsFile myLog;
|
||||
@ -263,6 +262,57 @@ bool i2c_found;
|
||||
#include "FreqCount.h"
|
||||
#endif
|
||||
|
||||
/******************************************
|
||||
Common Strings
|
||||
*****************************************/
|
||||
#define press_button_STR 0
|
||||
#define sd_error_STR 1
|
||||
#define reset_STR 2
|
||||
#define did_not_verify_STR 3
|
||||
#define _bytes_STR 4
|
||||
#define error_STR 5
|
||||
#define create_file_STR 6
|
||||
#define open_file_STR 7
|
||||
#define file_too_big_STR 8
|
||||
#define done_STR 9
|
||||
#define saving_to_STR 10
|
||||
#define verifying_STR 11
|
||||
#define flashing_file_STR 12
|
||||
#define press_to_change_STR 13
|
||||
#define right_to_select_STR 14
|
||||
#define rotate_to_change_STR 15
|
||||
#define press_to_select_STR 16
|
||||
|
||||
// This arrays holds the most often uses strings
|
||||
static const char string_press_button0[] PROGMEM = "Press Button...";
|
||||
static const char string_sd_error1[] PROGMEM = "SD Error";
|
||||
static const char string_reset2[] PROGMEM = "Reset";
|
||||
static const char string_did_not_verify3[] PROGMEM = "did not verify";
|
||||
static const char string_bytes4[] PROGMEM = " bytes ";
|
||||
static const char string_error5[] PROGMEM = "Error: ";
|
||||
static const char string_create_file6[] PROGMEM = "Can't create file";
|
||||
static const char string_open_file7[] PROGMEM = "Can't open file";
|
||||
static const char string_file_too_big8[] PROGMEM = "File too big";
|
||||
static const char string_done9[] PROGMEM = "Done";
|
||||
static const char string_saving_to10[] PROGMEM = "Saving to ";
|
||||
static const char string_verifying11[] PROGMEM = "Verifying...";
|
||||
static const char string_flashing_file12[] PROGMEM = "Flashing file ";
|
||||
static const char string_press_to_change13[] PROGMEM = "Press left to Change";
|
||||
static const char string_right_to_select14[] PROGMEM = "and right to Select";
|
||||
static const char string_rotate_to_change15[] PROGMEM = "Rotate to Change";
|
||||
static const char string_press_to_select16[] PROGMEM = "Press to Select";
|
||||
|
||||
static const char* const string_table[] PROGMEM = { string_press_button0, string_sd_error1, string_reset2, string_did_not_verify3, string_bytes4, string_error5, string_create_file6, string_open_file7, string_file_too_big8, string_done9, string_saving_to10, string_verifying11, string_flashing_file12, string_press_to_change13, string_right_to_select14, string_rotate_to_change15, string_press_to_select16 };
|
||||
|
||||
void print_STR(byte string_number, boolean newline) {
|
||||
char string_buffer[22];
|
||||
strcpy_P(string_buffer, (char*)pgm_read_word(&(string_table[string_number])));
|
||||
if (newline)
|
||||
println_Msg(string_buffer);
|
||||
else
|
||||
print_Msg(string_buffer);
|
||||
}
|
||||
|
||||
/******************************************
|
||||
Defines
|
||||
*****************************************/
|
||||
@ -380,7 +430,8 @@ bool errorLvl = 0;
|
||||
byte romVersion = 0;
|
||||
char cartID[5];
|
||||
unsigned long cartSize;
|
||||
char flashid[5];
|
||||
unsigned int flashid;
|
||||
char flashid_str[5];
|
||||
char vendorID[5];
|
||||
unsigned long fileSize;
|
||||
unsigned long sramBase;
|
||||
@ -480,32 +531,48 @@ static const uint32_t crc_32_tab[] PROGMEM = { /* CRC polynomial 0xedb88320 */
|
||||
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
|
||||
};
|
||||
|
||||
inline uint32_t updateCRC(uint8_t ch, uint32_t crc) {
|
||||
uint32_t idx = ((crc) ^ (ch)) & 0xff;
|
||||
uint32_t tab_value = pgm_read_dword(crc_32_tab + idx);
|
||||
return tab_value ^ ((crc) >> 8);
|
||||
// Defined as a macros, as compiler disregards inlining requests and these are
|
||||
// performance-critical functions.
|
||||
#define UPDATE_CRC(crc, ch) do { \
|
||||
uint8_t idx = ((crc) ^ (ch)) & 0xff; \
|
||||
uint32_t tab_value = pgm_read_dword(crc_32_tab + idx); \
|
||||
(crc) = tab_value ^ ((crc) >> 8); \
|
||||
} while (0)
|
||||
|
||||
uint32_t updateCRC(const byte *buffer, size_t length, uint32_t crc) {
|
||||
for (size_t c = 0; c < length; c++) {
|
||||
UPDATE_CRC(crc, buffer[c]);
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
uint32_t calculateCRC(const byte *buffer, size_t length) {
|
||||
uint32_t crc = 0xFFFFFFFF;
|
||||
updateCRC(buffer, length, crc);
|
||||
return ~crc;
|
||||
}
|
||||
|
||||
uint32_t calculateCRC(FsFile &infile) {
|
||||
uint32_t byte_count;
|
||||
uint32_t crc = 0xFFFFFFFF;
|
||||
|
||||
while((byte_count = infile.read(sdBuffer, sizeof(sdBuffer))) != 0) {
|
||||
updateCRC(sdBuffer, byte_count, crc);
|
||||
}
|
||||
return ~crc;
|
||||
}
|
||||
|
||||
// Calculate rom's CRC32 from SD
|
||||
uint32_t calculateCRC(char* fileName, char* folder, int offset) {
|
||||
// Open folder
|
||||
FsFile infile;
|
||||
uint32_t result;
|
||||
|
||||
sd.chdir(folder);
|
||||
// Open file
|
||||
if (myFile.open(fileName, O_READ)) {
|
||||
uint32_t oldcrc32 = 0xFFFFFFFF;
|
||||
|
||||
// Skip iNES header
|
||||
myFile.seek(offset);
|
||||
|
||||
for (unsigned long currByte = 0; currByte < ((myFile.fileSize() - offset) / 512); currByte++) {
|
||||
myFile.read(sdBuffer, 512);
|
||||
for (int c = 0; c < 512; c++) {
|
||||
oldcrc32 = updateCRC(sdBuffer[c], oldcrc32);
|
||||
}
|
||||
}
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
return ~oldcrc32;
|
||||
if (infile.open(fileName, O_READ)) {
|
||||
infile.seek(offset);
|
||||
result = calculateCRC(infile);
|
||||
infile.close();
|
||||
return result;
|
||||
} else {
|
||||
display_Clear();
|
||||
print_Msg(F("File "));
|
||||
@ -513,6 +580,7 @@ uint32_t calculateCRC(char* fileName, char* folder, int offset) {
|
||||
//print_Msg(F("/"));
|
||||
//print_Msg(fileName);
|
||||
print_Error(F(" not found"), true);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -539,32 +607,47 @@ void skip_line(FsFile* readfile) {
|
||||
|
||||
//Get line from file
|
||||
void get_line(char* str_buf, FsFile* readfile, uint8_t maxi) {
|
||||
int read_len;
|
||||
|
||||
// Status LED on
|
||||
statusLED(true);
|
||||
|
||||
int i = 0;
|
||||
|
||||
while (readfile->available()) {
|
||||
//If line size is more than maximum array, limit it.
|
||||
if (i >= maxi) {
|
||||
i = maxi - 1;
|
||||
}
|
||||
|
||||
//Read 1 byte from file
|
||||
str_buf[i] = readfile->read();
|
||||
read_len = readfile->read(str_buf, maxi - 1);
|
||||
|
||||
for (int i = 0; i < read_len; i++) {
|
||||
//if end of file or newline found, execute command
|
||||
if (str_buf[i] == '\r') {
|
||||
str_buf[i] = '\0';
|
||||
readfile->read(); //dispose \n because \r\n
|
||||
str_buf[i] = 0;
|
||||
readfile->seekCur(i - read_len + 2); // +2 to skip over \n because \r\n
|
||||
return;
|
||||
}
|
||||
}
|
||||
str_buf[maxi - 1] = 0;
|
||||
// EOL was not found, keep looking (slower)
|
||||
while (readfile->available()) {
|
||||
if (readfile->read() == '\r') {
|
||||
readfile->read(); // read \n because \r\n
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
} //End while
|
||||
}
|
||||
}
|
||||
|
||||
void rewind_line(FsFile &readfile, byte count=1) {
|
||||
uint32_t position = readfile.curPosition();
|
||||
count++;
|
||||
for (byte count_newline = 0; count_newline < count; count_newline++) {
|
||||
while (position--) {
|
||||
readfile.seekCur(-1);
|
||||
if (readfile.peek() == '\n')
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (position)
|
||||
readfile.seekCur(1);
|
||||
}
|
||||
|
||||
// Calculate CRC32 if needed and compare it to CRC read from database
|
||||
boolean compareCRC(char* database, char* crcString, boolean renamerom, int offset) {
|
||||
boolean compareCRC(const char* database, char* crcString, boolean renamerom, int offset) {
|
||||
#ifdef nointro
|
||||
char crcStr[9];
|
||||
if (crcString == 0) {
|
||||
@ -577,7 +660,6 @@ boolean compareCRC(char* database, char* crcString, boolean renamerom, int offse
|
||||
} else {
|
||||
// Use precalculated crc
|
||||
print_Msg(F("CRC32... "));
|
||||
display_Update();
|
||||
strcpy(crcStr, crcString);
|
||||
}
|
||||
// Print checksum
|
||||
@ -585,7 +667,7 @@ boolean compareCRC(char* database, char* crcString, boolean renamerom, int offse
|
||||
display_Update();
|
||||
|
||||
//Search for CRC32 in file
|
||||
char gamename[100];
|
||||
char gamename[96];
|
||||
char crc_search[9];
|
||||
|
||||
//go to root
|
||||
@ -594,8 +676,8 @@ boolean compareCRC(char* database, char* crcString, boolean renamerom, int offse
|
||||
//Search for same CRC in list
|
||||
while (myFile.available()) {
|
||||
//Read 2 lines (game name and CRC)
|
||||
get_line(gamename, &myFile, 96);
|
||||
get_line(crc_search, &myFile, 9);
|
||||
get_line(gamename, &myFile, sizeof(gamename));
|
||||
get_line(crc_search, &myFile, sizeof(crc_search));
|
||||
skip_line(&myFile); //Skip every 3rd line
|
||||
|
||||
//if checksum search successful, rename the file and end search
|
||||
@ -603,22 +685,22 @@ boolean compareCRC(char* database, char* crcString, boolean renamerom, int offse
|
||||
#ifdef enable_NES
|
||||
if ((mode == mode_NES) && (offset != 0)) {
|
||||
// Rewind to iNES Header
|
||||
myFile.seekSet(myFile.curPosition() - 36);
|
||||
myFile.seekCur(-36);
|
||||
|
||||
char iNES_STR[33];
|
||||
// Read iNES header
|
||||
get_line(iNES_STR, &myFile, 33);
|
||||
|
||||
// Convert "4E4553" to (0x4E, 0x45, 0x53)
|
||||
byte iNES_BUF[2];
|
||||
unsigned int iNES_BUF;
|
||||
for (byte j = 0; j < 16; j++) {
|
||||
sscanf(iNES_STR + j * 2, "%2X", iNES_BUF);
|
||||
iNES_HEADER[j] = iNES_BUF[0];
|
||||
sscanf(iNES_STR + j * 2, "%2X", &iNES_BUF);
|
||||
iNES_HEADER[j] = iNES_BUF;
|
||||
}
|
||||
//Skip CRLF
|
||||
myFile.seekSet(myFile.curPosition() + 4);
|
||||
myFile.seekCur(4);
|
||||
}
|
||||
#endif
|
||||
#endif // enable_NES
|
||||
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
@ -629,14 +711,14 @@ boolean compareCRC(char* database, char* crcString, boolean renamerom, int offse
|
||||
// Write iNES header
|
||||
sd.chdir(folder);
|
||||
if (!myFile.open(fileName, O_RDWR)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
for (byte z = 0; z < 16; z++) {
|
||||
myFile.write(iNES_HEADER[z]);
|
||||
}
|
||||
myFile.close();
|
||||
}
|
||||
#endif
|
||||
#endif // enable_NES
|
||||
print_Msg(F(" -> "));
|
||||
display_Update();
|
||||
|
||||
@ -667,9 +749,10 @@ boolean compareCRC(char* database, char* crcString, boolean renamerom, int offse
|
||||
println_Msg(F("Database missing"));
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
#else // nointro
|
||||
println_Msg("");
|
||||
#endif
|
||||
#endif // !nointro
|
||||
return 0;
|
||||
}
|
||||
|
||||
byte starting_letter() {
|
||||
@ -802,17 +885,17 @@ void mainMenu() {
|
||||
while (1) {
|
||||
if (currPage == 1) {
|
||||
// Copy menuOptions out of progmem
|
||||
convertPgm(modeOptions, 0, 7);
|
||||
convertPgm(modeOptions + 0, 7);
|
||||
modeMenu = question_box(F("OPEN SOURCE CART READER"), menuOptions, 7, 0);
|
||||
}
|
||||
if (currPage == 2) {
|
||||
// Copy menuOptions out of progmem
|
||||
convertPgm(modeOptions, 7, 7);
|
||||
convertPgm(modeOptions + 7, 7);
|
||||
modeMenu = question_box(F("OPEN SOURCE CART READER"), menuOptions, 7, 0);
|
||||
}
|
||||
if (currPage == 3) {
|
||||
// Copy menuOptions out of progmem
|
||||
convertPgm(modeOptions, 14, 2);
|
||||
convertPgm(modeOptions + 14, 2);
|
||||
modeMenu = question_box(F("OPEN SOURCE CART READER"), menuOptions, 2, 0);
|
||||
}
|
||||
if (numPages == 0) {
|
||||
@ -839,11 +922,6 @@ void mainMenu() {
|
||||
display_Clear();
|
||||
display_Update();
|
||||
setup_NES();
|
||||
#ifdef nointro
|
||||
if (getMapping() == 0) {
|
||||
selectMapping();
|
||||
}
|
||||
#endif
|
||||
checkStatus_NES();
|
||||
nesMenu();
|
||||
break;
|
||||
@ -973,15 +1051,15 @@ static const char modeItem4[] PROGMEM = "Nintendo 64(3V EEP)";
|
||||
#endif
|
||||
static const char modeItem5[] PROGMEM = "Game Boy";
|
||||
static const char modeItem6[] PROGMEM = "About";
|
||||
static const char modeItem7[] PROGMEM = "Reset";
|
||||
static const char* const modeOptions[] PROGMEM = { modeItem1, modeItem2, modeItem3, modeItem4, modeItem5, modeItem6, modeItem7 };
|
||||
// static const char modeItem7[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const modeOptions[] PROGMEM = { modeItem1, modeItem2, modeItem3, modeItem4, modeItem5, modeItem6, string_reset2 };
|
||||
|
||||
// Add-ons submenu
|
||||
static const char addonsItem1[] PROGMEM = "Consoles";
|
||||
static const char addonsItem2[] PROGMEM = "Handhelds";
|
||||
static const char addonsItem3[] PROGMEM = "Flashrom Programmer";
|
||||
static const char addonsItem4[] PROGMEM = "Reset";
|
||||
static const char* const addonsOptions[] PROGMEM = { addonsItem1, addonsItem2, addonsItem3, addonsItem4 };
|
||||
//static const char addonsItem4[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const addonsOptions[] PROGMEM = { addonsItem1, addonsItem2, addonsItem3, string_reset2 };
|
||||
|
||||
// Consoles submenu
|
||||
static const char consolesItem1[] PROGMEM = "NES/Famicom";
|
||||
@ -989,8 +1067,8 @@ static const char consolesItem2[] PROGMEM = "PC Engine/TG16";
|
||||
static const char consolesItem3[] PROGMEM = "SMS/GG/MIII/SG-1000";
|
||||
static const char consolesItem4[] PROGMEM = "Intellivision";
|
||||
static const char consolesItem5[] PROGMEM = "Colecovision";
|
||||
static const char consolesItem6[] PROGMEM = "Reset";
|
||||
static const char* const consolesOptions[] PROGMEM = { consolesItem1, consolesItem2, consolesItem3, consolesItem4, consolesItem5, consolesItem6 };
|
||||
//static const char consolesItem6[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const consolesOptions[] PROGMEM = { consolesItem1, consolesItem2, consolesItem3, consolesItem4, consolesItem5, string_reset2 };
|
||||
|
||||
// Handhelds submenu
|
||||
static const char handheldsItem1[] PROGMEM = "Virtual Boy";
|
||||
@ -998,8 +1076,8 @@ static const char handheldsItem2[] PROGMEM = "WonderSwan";
|
||||
static const char handheldsItem3[] PROGMEM = "NeoGeo Pocket";
|
||||
static const char handheldsItem4[] PROGMEM = "Watara Supervision";
|
||||
static const char handheldsItem5[] PROGMEM = "Pocket Challenge W";
|
||||
static const char handheldsItem6[] PROGMEM = "Reset";
|
||||
static const char* const handheldsOptions[] PROGMEM = { handheldsItem1, handheldsItem2, handheldsItem3, handheldsItem4, handheldsItem5, handheldsItem6 };
|
||||
//static const char handheldsItem6[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const handheldsOptions[] PROGMEM = { handheldsItem1, handheldsItem2, handheldsItem3, handheldsItem4, handheldsItem5, string_reset2 };
|
||||
|
||||
// All included slots
|
||||
void mainMenu() {
|
||||
@ -1103,11 +1181,6 @@ void consoleMenu() {
|
||||
display_Clear();
|
||||
display_Update();
|
||||
setup_NES();
|
||||
#ifdef nointro
|
||||
if (getMapping() == 0) {
|
||||
selectMapping();
|
||||
}
|
||||
#endif
|
||||
checkStatus_NES();
|
||||
nesMenu();
|
||||
break;
|
||||
@ -1227,7 +1300,8 @@ void aboutScreen() {
|
||||
println_Msg(F(""));
|
||||
println_Msg(F(""));
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
|
||||
while (1) {
|
||||
@ -1539,14 +1613,14 @@ void savetofile() {
|
||||
delay(2000);
|
||||
|
||||
if (!myFile.open("/snes_clk.txt", O_WRITE | O_CREAT | O_TRUNC)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
// Write calibration factor to file
|
||||
myFile.print(cal_factor);
|
||||
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
println_Msg(F("Done"));
|
||||
print_STR(done_STR, 1);
|
||||
display_Update();
|
||||
delay(1000);
|
||||
resetArduino();
|
||||
@ -1726,12 +1800,12 @@ void setup() {
|
||||
// Init SD card
|
||||
if (!sd.begin(SS)) {
|
||||
display_Clear();
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
|
||||
#ifdef global_log
|
||||
if (!myLog.open("OSCR_LOG.txt", O_RDWR | O_CREAT | O_APPEND)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
println_Msg(F(""));
|
||||
#if defined(HW1)
|
||||
@ -1810,11 +1884,30 @@ void setColor_RGB(byte r, byte g, byte b) {
|
||||
#endif
|
||||
}
|
||||
|
||||
// Converts a progmem array into a ram array
|
||||
void convertPgm(const char* const pgmOptions[], byte startArray, byte numArrays) {
|
||||
for (int i = 0; i < numArrays; i++) {
|
||||
strlcpy_P(menuOptions[i], (char*)pgm_read_word(&(pgmOptions[i + startArray])), 20);
|
||||
// Extract ASCII printable characters from input, collapsing underscores and spaces.
|
||||
// Use when extracting titles from cartridges, to build a rom title.
|
||||
byte buildRomName(char *output, const byte *input, byte length) {
|
||||
byte input_char;
|
||||
byte output_len = 0;
|
||||
for (unsigned int i = 0; i < length; i++) {
|
||||
input_char = input[i];
|
||||
if (isprint(input_char) && input_char != '<' && input_char != '>' && input_char != ':' && input_char != '"' && input_char != '/' && input_char != '\\' && input_char != '|' && input_char != '?' && input_char != '*') {
|
||||
output[output_len++] = input_char;
|
||||
} else {
|
||||
if (output_len == 0 || output[output_len - 1] != '_') {
|
||||
output[output_len++] = '_';
|
||||
}
|
||||
}
|
||||
}
|
||||
while (
|
||||
output_len && (
|
||||
output[output_len - 1] == '_' || output[output_len - 1] == ' '
|
||||
)
|
||||
) {
|
||||
output_len--;
|
||||
}
|
||||
output[output_len] = 0;
|
||||
return output_len;
|
||||
}
|
||||
|
||||
// Converts a progmem array into a ram array
|
||||
@ -1832,7 +1925,33 @@ void print_Error(const __FlashStringHelper* errorMessage, boolean forceReset) {
|
||||
|
||||
if (forceReset) {
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
if (ignoreError == 0) {
|
||||
resetArduino();
|
||||
} else {
|
||||
ignoreError = 0;
|
||||
display_Clear();
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Error Overwrite"));
|
||||
println_Msg(F(""));
|
||||
display_Update();
|
||||
delay(2000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void print_Error(byte errorMessage, boolean forceReset) {
|
||||
errorLvl = 1;
|
||||
setColor_RGB(255, 0, 0);
|
||||
print_STR(errorMessage, 1);
|
||||
display_Update();
|
||||
|
||||
if (forceReset) {
|
||||
println_Msg(F(""));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
if (ignoreError == 0) {
|
||||
@ -1916,7 +2035,7 @@ void save_log() {
|
||||
strcpy(fileName, romName);
|
||||
strcat(fileName, ".txt");
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
|
||||
while (myLog.available()) {
|
||||
@ -1926,8 +2045,8 @@ void save_log() {
|
||||
}
|
||||
myFile.write(sdBuffer, 512);
|
||||
} else {
|
||||
word i = 0;
|
||||
for (i = 0; i < myLog.available(); i++) {
|
||||
int i = 0;
|
||||
for (; i < myLog.available(); i++) {
|
||||
sdBuffer[i] = myLog.read();
|
||||
}
|
||||
myFile.write(sdBuffer, i);
|
||||
@ -1960,7 +2079,7 @@ void print_Msg(const char myString[]) {
|
||||
#if (defined(enable_LCD) || defined(enable_OLED))
|
||||
// test for word wrap
|
||||
if ((display.tx + strlen(myString) * 6) > 128) {
|
||||
int strPos = 0;
|
||||
unsigned int strPos = 0;
|
||||
// Print until end of display
|
||||
while (display.tx < 122) {
|
||||
display.print(myString[strPos]);
|
||||
@ -2103,7 +2222,7 @@ void println_Msg(const char myString[]) {
|
||||
#if (defined(enable_LCD) || defined(enable_OLED))
|
||||
// test for word wrap
|
||||
if ((display.tx + strlen(myString) * 6) > 128) {
|
||||
int strPos = 0;
|
||||
unsigned int strPos = 0;
|
||||
// Print until end of display
|
||||
while ((display.tx < 122) && (myString[strPos] != '\0')) {
|
||||
display.print(myString[strPos]);
|
||||
@ -2234,8 +2353,8 @@ void blinkLED() {
|
||||
#endif
|
||||
}
|
||||
|
||||
void statusLED(boolean on) {
|
||||
#if defined(HW5)
|
||||
void statusLED(boolean on) {
|
||||
if (!on)
|
||||
PORTD |= (1 << 7);
|
||||
else
|
||||
@ -2263,8 +2382,11 @@ void statusLED(boolean on) {
|
||||
PORTB &= ~(1 << 7);
|
||||
}
|
||||
*/
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
void statusLED(boolean on __attribute__ ((unused))) {
|
||||
}
|
||||
#endif
|
||||
|
||||
/******************************************
|
||||
Menu system
|
||||
@ -2310,7 +2432,7 @@ byte questionBox_Serial(const __FlashStringHelper* question, char answers[7][20]
|
||||
EEPROM_readAnything(0, foldern);
|
||||
sprintf(fileName, "IMPORT/%d.bin", foldern);
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
}
|
||||
|
||||
// Read file from serial
|
||||
@ -2577,7 +2699,7 @@ void wait_serial() {
|
||||
myFile.close();
|
||||
}
|
||||
else {
|
||||
print_Error(F("Can't open file"), true);
|
||||
print_Error(open_file_STR, true);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
@ -2893,6 +3015,9 @@ void wait_encoder() {
|
||||
void fileBrowser(const __FlashStringHelper* browserTitle) {
|
||||
char fileNames[7][FILENAME_LENGTH];
|
||||
int currFile;
|
||||
FsFile myDir;
|
||||
div_t page_layout;
|
||||
|
||||
filebrowse = 1;
|
||||
|
||||
// Root
|
||||
@ -2915,37 +3040,20 @@ browserstart:
|
||||
// Open filepath directory
|
||||
if (!myDir.open(filePath)) {
|
||||
display_Clear();
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
|
||||
// Count files in directory
|
||||
while (myFile.openNext(&myDir, O_READ)) {
|
||||
// Ignore if hidden
|
||||
if (myFile.isHidden()) {
|
||||
}
|
||||
// Indicate a directory.
|
||||
else if (myFile.isDir()) {
|
||||
currFile++;
|
||||
}
|
||||
// It's just a file
|
||||
else if (myFile.isFile()) {
|
||||
if (!myFile.isHidden() && (myFile.isDir() || myFile.isFile())) {
|
||||
currFile++;
|
||||
}
|
||||
myFile.close();
|
||||
}
|
||||
myDir.close();
|
||||
|
||||
// "Calculate number of needed pages"
|
||||
if (currFile < 8)
|
||||
numPages = 1;
|
||||
else if (currFile < 15)
|
||||
numPages = 2;
|
||||
else if (currFile < 22)
|
||||
numPages = 3;
|
||||
else if (currFile < 29)
|
||||
numPages = 4;
|
||||
else if (currFile < 36)
|
||||
numPages = 5;
|
||||
page_layout = div(currFile, 7);
|
||||
numPages = page_layout.quot + 1;
|
||||
|
||||
// Fill the array "answers" with 7 options to choose from in the file browser
|
||||
char answers[7][20];
|
||||
@ -2953,35 +3061,12 @@ browserstart:
|
||||
page:
|
||||
|
||||
// If there are less than 7 entries, set count to that number so no empty options appear
|
||||
byte count;
|
||||
if (currFile < 8)
|
||||
count = currFile;
|
||||
else if (currPage == 1)
|
||||
count = 7;
|
||||
else if (currFile < 15)
|
||||
count = currFile - 7;
|
||||
else if (currPage == 2)
|
||||
count = 7;
|
||||
else if (currFile < 22)
|
||||
count = currFile - 14;
|
||||
else if (currPage == 3)
|
||||
count = 7;
|
||||
else if (currFile < 29)
|
||||
count = currFile - 21;
|
||||
else {
|
||||
display_Clear();
|
||||
println_Msg(F("Too many files"));
|
||||
display_Update();
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
byte count = currPage == numPages ? page_layout.rem : 7;
|
||||
|
||||
// Open filepath directory
|
||||
if (!myDir.open(filePath)) {
|
||||
display_Clear();
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
|
||||
int countFile = 0;
|
||||
@ -3231,7 +3316,8 @@ void loop() {
|
||||
print_Msg(F("Mode = "));
|
||||
print_Msg(mode);
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
resetArduino();
|
||||
@ -3240,4 +3326,4 @@ void loop() {
|
||||
|
||||
//******************************************
|
||||
// End of File
|
||||
//******************************************
|
||||
//******************************************
|
||||
|
@ -27,16 +27,16 @@ static const char flash8MenuItem3[] PROGMEM = "Read";
|
||||
static const char flash8MenuItem4[] PROGMEM = "Write";
|
||||
static const char flash8MenuItem5[] PROGMEM = "ID";
|
||||
static const char flash8MenuItem6[] PROGMEM = "Print";
|
||||
static const char flash8MenuItem7[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsFLASH8[] PROGMEM = { flash8MenuItem1, flash8MenuItem2, flash8MenuItem3, flash8MenuItem4, flash8MenuItem5, flash8MenuItem6, flash8MenuItem7 };
|
||||
//static const char flash8MenuItem7[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsFLASH8[] PROGMEM = { flash8MenuItem1, flash8MenuItem2, flash8MenuItem3, flash8MenuItem4, flash8MenuItem5, flash8MenuItem6, string_reset2 };
|
||||
|
||||
#ifdef enable_FLASH16
|
||||
// Flash start menu
|
||||
static const char flashMenuItem1[] PROGMEM = "8bit Flash adapter";
|
||||
static const char flashMenuItem2[] PROGMEM = "Eprom adapter";
|
||||
static const char flashMenuItem3[] PROGMEM = "MX26L6420 adapter";
|
||||
static const char flashMenuItem4[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsFlash[] PROGMEM = { flashMenuItem1, flashMenuItem2, flashMenuItem3, flashMenuItem4 };
|
||||
// static const char flashMenuItem4[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsFlash[] PROGMEM = { flashMenuItem1, flashMenuItem2, flashMenuItem3, string_reset2 };
|
||||
|
||||
// 16bit Flash menu items
|
||||
static const char flash16MenuItem1[] PROGMEM = "Blankcheck";
|
||||
@ -45,8 +45,8 @@ static const char flash16MenuItem3[] PROGMEM = "Read";
|
||||
static const char flash16MenuItem4[] PROGMEM = "Write";
|
||||
static const char flash16MenuItem5[] PROGMEM = "ID";
|
||||
static const char flash16MenuItem6[] PROGMEM = "Print";
|
||||
static const char flash16MenuItem7[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsFLASH16[] PROGMEM = { flash16MenuItem1, flash16MenuItem2, flash16MenuItem3, flash16MenuItem4, flash16MenuItem5, flash16MenuItem6, flash16MenuItem7 };
|
||||
//static const char flash16MenuItem7[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsFLASH16[] PROGMEM = { flash16MenuItem1, flash16MenuItem2, flash16MenuItem3, flash16MenuItem4, flash16MenuItem5, flash16MenuItem6, string_reset2 };
|
||||
|
||||
// Eprom menu items
|
||||
static const char epromMenuItem1[] PROGMEM = "Blankcheck";
|
||||
@ -54,8 +54,8 @@ static const char epromMenuItem2[] PROGMEM = "Read";
|
||||
static const char epromMenuItem3[] PROGMEM = "Write";
|
||||
static const char epromMenuItem4[] PROGMEM = "Verify";
|
||||
static const char epromMenuItem5[] PROGMEM = "Print";
|
||||
static const char epromMenuItem6[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsEprom[] PROGMEM = { epromMenuItem1, epromMenuItem2, epromMenuItem3, epromMenuItem4, epromMenuItem5, epromMenuItem6 };
|
||||
// static const char epromMenuItem6[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsEprom[] PROGMEM = { epromMenuItem1, epromMenuItem2, epromMenuItem3, epromMenuItem4, epromMenuItem5, string_reset2 };
|
||||
|
||||
void flashMenu() {
|
||||
// create menu with title and 3 options to choose from
|
||||
@ -153,16 +153,16 @@ void flashromMenu8() {
|
||||
writeFlash29F032();
|
||||
break;
|
||||
case 2:
|
||||
if (strcmp(flashid, "C2F3") == 0)
|
||||
if (flashid == 0xC2F3)
|
||||
writeFlash29F1601();
|
||||
else if ((strcmp(flashid, "C2F1") == 0) || (strcmp(flashid, "C2F9") == 0))
|
||||
else if ((flashid == 0xC2F1) || (flashid == 0xC2F9))
|
||||
writeFlash29F1610();
|
||||
else if ((strcmp(flashid, "C2C4") == 0) || (strcmp(flashid, "C249") == 0) || (strcmp(flashid, "C2A7") == 0) || (strcmp(flashid, "C2A8") == 0) || (strcmp(flashid, "C2C9") == 0) || (strcmp(flashid, "C2CB") == 0))
|
||||
else if ((flashid == 0xC2C4) || (flashid == 0xC249) || (flashid == 0xC2A7) || (flashid == 0xC2A8) || (flashid == 0xC2C9) || (flashid == 0xC2CB))
|
||||
writeFlash29LV640();
|
||||
else if (strcmp(flashid, "017E") == 0) {
|
||||
else if (flashid == 0x017E) {
|
||||
// sector size, write buffer size
|
||||
writeFlash29GL(sectorSize, bufferSize);
|
||||
} else if ((strcmp(flashid, "0458") == 0) || (strcmp(flashid, "0158") == 0) || (strcmp(flashid, "01AB") == 0))
|
||||
} else if ((flashid == 0x0458) || (flashid == 0x0158) || (flashid == 0x01AB))
|
||||
writeFlash29F800();
|
||||
|
||||
break;
|
||||
@ -222,7 +222,8 @@ void flashromMenu8() {
|
||||
println_Msg(F("s"));
|
||||
display_Update();
|
||||
}
|
||||
print_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 0);
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
@ -270,9 +271,9 @@ void flashromMenu16() {
|
||||
fileBrowser(F("Select file"));
|
||||
display_Clear();
|
||||
time = millis();
|
||||
if (strcmp(flashid, "C2F3") == 0) {
|
||||
if (flashid == 0xC2F3) {
|
||||
writeFlash16_29F1601();
|
||||
} else if ((strcmp(flashid, "C2C4") == 0) || (strcmp(flashid, "C249") == 0) || (strcmp(flashid, "C2A7") == 0) || (strcmp(flashid, "C2A8") == 0) || (strcmp(flashid, "C2C9") == 0) || (strcmp(flashid, "C2CB") == 0) || (strcmp(flashid, "C2FC") == 0)) {
|
||||
} else if ((flashid == 0xC2C4) || (flashid == 0xC249) || (flashid == 0xC2A7) || (flashid == 0xC2A8) || (flashid == 0xC2C9) || (flashid == 0xC2CB) || (flashid == 0xC2FC)) {
|
||||
writeFlash16_29LV640();
|
||||
} else {
|
||||
writeFlash16();
|
||||
@ -403,77 +404,77 @@ idtheflash:
|
||||
println_Msg("");
|
||||
println_Msg("");
|
||||
print_Msg(F("Flash ID: "));
|
||||
println_Msg(flashid);
|
||||
println_Msg(flashid_str);
|
||||
|
||||
if (strcmp(flashid, "C2F1") == 0) {
|
||||
if (flashid == 0xC2F1) {
|
||||
println_Msg(F("MX29F1610 detected"));
|
||||
flashSize = 2097152;
|
||||
flashromType = 2;
|
||||
} else if (strcmp(flashid, "C2F3") == 0) {
|
||||
} else if (flashid == 0xC2F3) {
|
||||
println_Msg(F("MX29F1601 detected"));
|
||||
flashSize = 2097152;
|
||||
flashromType = 2;
|
||||
} else if (strcmp(flashid, "C2F9") == 0) {
|
||||
} else if (flashid == 0xC2F9) {
|
||||
println_Msg(F("MX29L3211 detected"));
|
||||
println_Msg(F("ATTENTION 3.3V"));
|
||||
flashSize = 4194304;
|
||||
flashromType = 2;
|
||||
} else if ((strcmp(flashid, "C2C4") == 0) || (strcmp(flashid, "C249") == 0)) {
|
||||
} else if ((flashid == 0xC2C4) || (flashid == 0xC249)) {
|
||||
println_Msg(F("MX29LV160 detected"));
|
||||
println_Msg(F("ATTENTION 3.3V"));
|
||||
flashSize = 2097152;
|
||||
flashromType = 2;
|
||||
} else if ((strcmp(flashid, "C2A7") == 0) || (strcmp(flashid, "C2A8") == 0)) {
|
||||
} else if ((flashid == 0xC2A7) || (flashid == 0xC2A8)) {
|
||||
println_Msg(F("MX29LV320 detected"));
|
||||
println_Msg(F("ATTENTION 3.3V"));
|
||||
flashSize = 4194304;
|
||||
flashromType = 2;
|
||||
} else if ((strcmp(flashid, "C2C9") == 0) || (strcmp(flashid, "C2CB") == 0)) {
|
||||
} else if ((flashid == 0xC2C9) || (flashid == 0xC2CB)) {
|
||||
println_Msg(F("MX29LV640 detected"));
|
||||
println_Msg(F("ATTENTION 3.3V"));
|
||||
flashSize = 8388608;
|
||||
flashromType = 2;
|
||||
} else if (strcmp(flashid, "0141") == 0) {
|
||||
} else if (flashid == 0x0141) {
|
||||
println_Msg(F("AM29F032B detected"));
|
||||
flashSize = 4194304;
|
||||
flashromType = 1;
|
||||
} else if (strcmp(flashid, "01AD") == 0) {
|
||||
} else if (flashid == 0x01AD) {
|
||||
println_Msg(F("AM29F016B detected"));
|
||||
flashSize = 2097152;
|
||||
flashromType = 1;
|
||||
} else if (strcmp(flashid, "20AD") == 0) {
|
||||
} else if (flashid == 0x20AD) {
|
||||
println_Msg(F("AM29F016D detected"));
|
||||
flashSize = 2097152;
|
||||
flashromType = 1;
|
||||
} else if (strcmp(flashid, "04AD") == 0) {
|
||||
} else if (flashid == 0x04AD) {
|
||||
println_Msg(F("AM29F016D detected"));
|
||||
flashSize = 2097152;
|
||||
flashromType = 1;
|
||||
} else if (strcmp(flashid, "04D4") == 0) {
|
||||
} else if (flashid == 0x04D4) {
|
||||
println_Msg(F("MBM29F033C detected"));
|
||||
flashSize = 4194304;
|
||||
flashromType = 1;
|
||||
} else if (strcmp(flashid, "04D5") == 0) {
|
||||
} else if (flashid == 0x04D5) {
|
||||
println_Msg(F("MBM29F080C detected"));
|
||||
flashSize = 1048576;
|
||||
flashromType = 1;
|
||||
} else if (strcmp(flashid, "0458") == 0) {
|
||||
} else if (flashid == 0x0458) {
|
||||
println_Msg(F("MBM29F800BA detected"));
|
||||
flashSize = 1048576;
|
||||
flashromType = 2;
|
||||
} else if (strcmp(flashid, "01AB") == 0) {
|
||||
} else if (flashid == 0x01AB) {
|
||||
println_Msg(F("AM29F400AB detected"));
|
||||
flashSize = 131072 * 4;
|
||||
flashromType = 2;
|
||||
} else if (strcmp(flashid, "0158") == 0) {
|
||||
} else if (flashid == 0x0158) {
|
||||
println_Msg(F("AM29F800BB detected"));
|
||||
flashSize = 1048576;
|
||||
flashromType = 2;
|
||||
} else if (strcmp(flashid, "01A3") == 0) {
|
||||
} else if (flashid == 0x01A3) {
|
||||
println_Msg(F("AM29LV033C detected"));
|
||||
flashSize = 131072 * 32;
|
||||
flashromType = 1;
|
||||
} else if (strcmp(flashid, "017E") == 0) {
|
||||
} else if (flashid == 0x017E) {
|
||||
// S29GL032M
|
||||
if (readByte_Flash(28) == 0x1A) {
|
||||
println_Msg(F("S29GL032M detected"));
|
||||
@ -497,7 +498,7 @@ idtheflash:
|
||||
}
|
||||
println_Msg(F("ATTENTION 3.3V"));
|
||||
flashromType = 2;
|
||||
} else if (strcmp(flashid, "B088") == 0) {
|
||||
} else if (flashid == 0xB088) {
|
||||
// LH28F016SUT
|
||||
println_Msg(F("LH28F016SUT detected"));
|
||||
println_Msg(F("ATTENTION 3/5 setting"));
|
||||
@ -505,20 +506,20 @@ idtheflash:
|
||||
sectorSize = 65536;
|
||||
bufferSize = 256;
|
||||
flashromType = 3;
|
||||
} else if ((strcmp(flashid, "8916") == 0) || (strcmp(flashid, "8917") == 0) || (strcmp(flashid, "8918") == 0)) {
|
||||
} else if ((flashid == 0x8916) || (flashid == 0x8917) || (flashid == 0x8918)) {
|
||||
// E28FXXXJ3A
|
||||
print_Msg(F("E28F"));
|
||||
|
||||
switch (flashid[3]) {
|
||||
case '6':
|
||||
switch (flashid & 0x00f0) {
|
||||
case 0x60:
|
||||
flashSize = 131072 * 32;
|
||||
print_Msg(F("320"));
|
||||
break;
|
||||
case '7':
|
||||
case 0x70:
|
||||
flashSize = 131072 * 64;
|
||||
print_Msg(F("640"));
|
||||
break;
|
||||
case '8':
|
||||
case 0x80:
|
||||
flashSize = 131072 * 128;
|
||||
print_Msg(F("128"));
|
||||
break;
|
||||
@ -536,7 +537,7 @@ idtheflash:
|
||||
goto idtheflash;
|
||||
} else if (secondID == 2) {
|
||||
// Backup first ID read-out
|
||||
strncpy(vendorID, flashid, 5);
|
||||
strncpy(vendorID, flashid_str, 5);
|
||||
|
||||
// Read ID a third time using a different command (type 2 flashrom)
|
||||
resetFlash8();
|
||||
@ -551,11 +552,12 @@ idtheflash:
|
||||
print_Msg(F("ID Type 1: "));
|
||||
println_Msg(vendorID);
|
||||
print_Msg(F("ID Type 2: "));
|
||||
println_Msg(flashid);
|
||||
println_Msg(flashid_str);
|
||||
println_Msg("");
|
||||
println_Msg(F("UNKNOWN FLASHROM"));
|
||||
println_Msg("");
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
|
||||
@ -570,7 +572,8 @@ idtheflash:
|
||||
print_Error(F("Press Button to reset"), true);
|
||||
}
|
||||
println_Msg("");
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
|
||||
resetFlash8();
|
||||
@ -585,37 +588,37 @@ void id_Flash16() {
|
||||
println_Msg(F("Flashrom Writer 16bit"));
|
||||
println_Msg("");
|
||||
print_Msg(F("Flash ID: "));
|
||||
println_Msg(flashid);
|
||||
if (strcmp(flashid, "C2F1") == 0) {
|
||||
println_Msg(flashid_str);
|
||||
if (flashid == 0xC2F1) {
|
||||
println_Msg(F("MX29F1610 detected"));
|
||||
println_Msg("");
|
||||
flashSize = 2097152;
|
||||
flashromType = 2;
|
||||
} else if (strcmp(flashid, "C2F3") == 0) {
|
||||
} else if (flashid == 0xC2F3) {
|
||||
println_Msg(F("MX29F1601 detected"));
|
||||
flashSize = 2097152;
|
||||
flashromType = 2;
|
||||
} else if (strcmp(flashid, "C2F9") == 0) {
|
||||
} else if (flashid == 0xC2F9) {
|
||||
println_Msg(F("MX29L3211 detected"));
|
||||
println_Msg(F("ATTENTION 3.3V"));
|
||||
flashSize = 4194304;
|
||||
flashromType = 2;
|
||||
} else if ((strcmp(flashid, "C2C4") == 0) || (strcmp(flashid, "C249") == 0)) {
|
||||
} else if ((flashid == 0xC2C4) || (flashid == 0xC249)) {
|
||||
println_Msg(F("MX29LV160 detected"));
|
||||
println_Msg(F("ATTENTION 3.3V"));
|
||||
flashSize = 2097152;
|
||||
flashromType = 2;
|
||||
} else if ((strcmp(flashid, "C2A7") == 0) || (strcmp(flashid, "C2A8") == 0)) {
|
||||
} else if ((flashid == 0xC2A7) || (flashid == 0xC2A8)) {
|
||||
println_Msg(F("MX29LV320 detected"));
|
||||
println_Msg(F("ATTENTION 3.3V"));
|
||||
flashSize = 4194304;
|
||||
flashromType = 2;
|
||||
} else if ((strcmp(flashid, "C2C9") == 0) || (strcmp(flashid, "C2CB") == 0)) {
|
||||
} else if ((flashid == 0xC2C9) || (flashid == 0xC2CB)) {
|
||||
println_Msg(F("MX29LV640 detected"));
|
||||
println_Msg(F("ATTENTION 3.3V"));
|
||||
flashSize = 8388608;
|
||||
flashromType = 2;
|
||||
} else if (strcmp(flashid, "C2FC") == 0) {
|
||||
} else if (flashid == 0xC2FC) {
|
||||
println_Msg(F("MX26L6420 detected"));
|
||||
println_Msg(F("ATTENTION 3.3V"));
|
||||
flashSize = 8388608;
|
||||
@ -625,7 +628,8 @@ void id_Flash16() {
|
||||
println_Msg("");
|
||||
}
|
||||
println_Msg("");
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
}
|
||||
#endif
|
||||
@ -1004,7 +1008,9 @@ void idFlash29F032() {
|
||||
dataIn8();
|
||||
|
||||
// Read the two id bytes into a string
|
||||
sprintf(flashid, "%02X%02X", readByte_Flash(0), readByte_Flash(1));
|
||||
flashid = readByte_Flash(0) << 8;
|
||||
flashid |= readByte_Flash(1);
|
||||
sprintf(flashid_str, "%04X", flashid);
|
||||
}
|
||||
|
||||
void eraseFlash29F032() {
|
||||
@ -1038,7 +1044,7 @@ void eraseFlash29F032() {
|
||||
void writeFlash29F032() {
|
||||
// Create filepath
|
||||
sprintf(filePath, "%s/%s", filePath, fileName);
|
||||
print_Msg(F("Flashing file "));
|
||||
print_STR(flashing_file_STR, 0);
|
||||
print_Msg(filePath);
|
||||
println_Msg(F("..."));
|
||||
display_Update();
|
||||
@ -1048,7 +1054,7 @@ void writeFlash29F032() {
|
||||
// Get rom size from file
|
||||
fileSize = myFile.fileSize();
|
||||
if (fileSize > flashSize)
|
||||
print_Error(F("File size exceeds flash size."), true);
|
||||
print_Error(file_too_big_STR, true);
|
||||
|
||||
// Set data pins to output
|
||||
dataOut();
|
||||
@ -1113,7 +1119,7 @@ void writeFlash29F032() {
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
} else {
|
||||
println_Msg(F("Can't open file"));
|
||||
print_STR(open_file_STR, 1);
|
||||
display_Update();
|
||||
}
|
||||
}
|
||||
@ -1179,7 +1185,7 @@ void resetFlash29F1610() {
|
||||
void writeFlash29F1610() {
|
||||
// Create filepath
|
||||
sprintf(filePath, "%s/%s", filePath, fileName);
|
||||
println_Msg(F("Flashing file "));
|
||||
print_STR(flashing_file_STR, 1);
|
||||
println_Msg(filePath);
|
||||
display_Update();
|
||||
|
||||
@ -1188,7 +1194,7 @@ void writeFlash29F1610() {
|
||||
// Get rom size from file
|
||||
fileSize = myFile.fileSize();
|
||||
if (fileSize > flashSize)
|
||||
print_Error(F("File size exceeds flash size."), true);
|
||||
print_Error(file_too_big_STR, true);
|
||||
|
||||
// Set data pins to output
|
||||
dataOut();
|
||||
@ -1225,7 +1231,7 @@ void writeFlash29F1610() {
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
} else {
|
||||
println_Msg(F("Can't open file on SD"));
|
||||
print_STR(open_file_STR, 1);
|
||||
display_Update();
|
||||
}
|
||||
}
|
||||
@ -1233,7 +1239,7 @@ void writeFlash29F1610() {
|
||||
void writeFlash29F1601() {
|
||||
// Create filepath
|
||||
sprintf(filePath, "%s/%s", filePath, fileName);
|
||||
println_Msg(F("Flashing file "));
|
||||
print_STR(flashing_file_STR, 1);
|
||||
println_Msg(filePath);
|
||||
display_Update();
|
||||
|
||||
@ -1242,7 +1248,7 @@ void writeFlash29F1601() {
|
||||
// Get rom size from file
|
||||
fileSize = myFile.fileSize();
|
||||
if (fileSize > flashSize)
|
||||
print_Error(F("File size exceeds flash size."), true);
|
||||
print_Error(file_too_big_STR, true);
|
||||
|
||||
// Set data pins to output
|
||||
dataOut();
|
||||
@ -1284,7 +1290,7 @@ void writeFlash29F1601() {
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
} else {
|
||||
println_Msg(F("Can't open file on SD"));
|
||||
print_STR(open_file_STR, 1);
|
||||
display_Update();
|
||||
}
|
||||
}
|
||||
@ -1302,7 +1308,9 @@ void idFlash29F1610() {
|
||||
dataIn8();
|
||||
|
||||
// Read the two id bytes into a string
|
||||
sprintf(flashid, "%02X%02X", readByte_Flash(0), readByte_Flash(2));
|
||||
flashid = readByte_Flash(0) << 8;
|
||||
flashid |= readByte_Flash(2);
|
||||
sprintf(flashid_str, "%04X", flashid);
|
||||
}
|
||||
|
||||
byte readStatusReg() {
|
||||
@ -1376,7 +1384,7 @@ void busyCheck29LV640(unsigned long myAddress, byte myData) {
|
||||
void writeFlash29LV640() {
|
||||
// Create filepath
|
||||
sprintf(filePath, "%s/%s", filePath, fileName);
|
||||
println_Msg(F("Flashing file "));
|
||||
print_STR(flashing_file_STR, 1);
|
||||
println_Msg(filePath);
|
||||
display_Update();
|
||||
|
||||
@ -1385,7 +1393,7 @@ void writeFlash29LV640() {
|
||||
// Get rom size from file
|
||||
fileSize = myFile.fileSize();
|
||||
if (fileSize > flashSize)
|
||||
print_Error(F("File size exceeds flash size."), true);
|
||||
print_Error(file_too_big_STR, true);
|
||||
|
||||
// Set data pins to output
|
||||
dataOut();
|
||||
@ -1412,7 +1420,7 @@ void writeFlash29LV640() {
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
} else {
|
||||
println_Msg(F("Can't open file on SD"));
|
||||
print_STR(open_file_STR, 1);
|
||||
display_Update();
|
||||
}
|
||||
}
|
||||
@ -1423,7 +1431,7 @@ void writeFlash29LV640() {
|
||||
void writeFlash29GL(unsigned long sectorSize, byte bufferSize) {
|
||||
// Create filepath
|
||||
sprintf(filePath, "%s/%s", filePath, fileName);
|
||||
println_Msg(F("Flashing file "));
|
||||
print_STR(flashing_file_STR, 1);
|
||||
println_Msg(filePath);
|
||||
display_Update();
|
||||
|
||||
@ -1432,7 +1440,7 @@ void writeFlash29GL(unsigned long sectorSize, byte bufferSize) {
|
||||
// Get rom size from file
|
||||
fileSize = myFile.fileSize();
|
||||
if (fileSize > flashSize)
|
||||
print_Error(F("File size exceeds flash size."), true);
|
||||
print_Error(file_too_big_STR, true);
|
||||
|
||||
// Set data pins to output
|
||||
dataOut();
|
||||
@ -1479,7 +1487,7 @@ void writeFlash29GL(unsigned long sectorSize, byte bufferSize) {
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
} else {
|
||||
println_Msg(F("Can't open file on SD"));
|
||||
print_STR(open_file_STR, 1);
|
||||
display_Update();
|
||||
}
|
||||
}
|
||||
@ -1490,7 +1498,7 @@ void writeFlash29GL(unsigned long sectorSize, byte bufferSize) {
|
||||
void writeFlash29F800() {
|
||||
// Create filepath
|
||||
sprintf(filePath, "%s/%s", filePath, fileName);
|
||||
println_Msg(F("Flashing file "));
|
||||
print_STR(flashing_file_STR, 1);
|
||||
println_Msg(filePath);
|
||||
display_Update();
|
||||
|
||||
@ -1499,7 +1507,7 @@ void writeFlash29F800() {
|
||||
// Get rom size from file
|
||||
fileSize = myFile.fileSize();
|
||||
if (fileSize > flashSize)
|
||||
print_Error(F("File size exceeds flash size."), true);
|
||||
print_Error(file_too_big_STR, true);
|
||||
|
||||
// Set data pins to output
|
||||
dataOut();
|
||||
@ -1528,7 +1536,7 @@ void writeFlash29F800() {
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
} else {
|
||||
println_Msg(F("Can't open file on SD"));
|
||||
print_STR(open_file_STR, 1);
|
||||
display_Update();
|
||||
}
|
||||
}
|
||||
@ -1543,7 +1551,9 @@ void idFlash28FXXX() {
|
||||
dataIn8();
|
||||
|
||||
// Read the two id bytes into a string
|
||||
sprintf(flashid, "%02X%02X", readByte_Flash(0), readByte_Flash(1));
|
||||
flashid = readByte_Flash(0) << 8;
|
||||
flashid |= readByte_Flash(1);
|
||||
sprintf(flashid_str, "%04X", flashid);
|
||||
}
|
||||
|
||||
void resetFlash28FXXX() {
|
||||
@ -1580,21 +1590,21 @@ void eraseFlash28FXXX() {
|
||||
|
||||
void writeFlash28FXXX() {
|
||||
sprintf(filePath, "%s/%s", filePath, fileName);
|
||||
print_Msg(F("Flashing file "));
|
||||
print_STR(flashing_file_STR, 0);
|
||||
println_Msg(filePath);
|
||||
display_Update();
|
||||
|
||||
// Open file on sd card
|
||||
if (myFile.open(filePath, O_READ)) {
|
||||
if ((strcmp(flashid, "B088") == 0))
|
||||
if ((flashid == 0xB088))
|
||||
writeFlashLH28F0XX();
|
||||
else if ((strcmp(flashid, "8916") == 0) || (strcmp(flashid, "8917") == 0) || (strcmp(flashid, "8918") == 0)) {
|
||||
else if ((flashid == 0x8916) || (flashid == 0x8917) || (flashid == 0x8918)) {
|
||||
writeFlashE28FXXXJ3A();
|
||||
}
|
||||
|
||||
myFile.close();
|
||||
} else {
|
||||
println_Msg(F("Can't open file on SD"));
|
||||
print_STR(open_file_STR, 1);
|
||||
display_Update();
|
||||
}
|
||||
}
|
||||
@ -1602,7 +1612,7 @@ void writeFlash28FXXX() {
|
||||
void writeFlashE28FXXXJ3A() {
|
||||
fileSize = myFile.fileSize();
|
||||
if (fileSize > flashSize) {
|
||||
print_Error(F("File size exceeds flash size."), false);
|
||||
print_Error(file_too_big_STR, false);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1653,7 +1663,7 @@ void writeFlashE28FXXXJ3A() {
|
||||
void writeFlashLH28F0XX() {
|
||||
fileSize = myFile.fileSize();
|
||||
if (fileSize > flashSize) {
|
||||
print_Error(F("File size exceeds flash size."), false);
|
||||
print_Error(file_too_big_STR, false);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1713,7 +1723,7 @@ void blankcheck_Flash() {
|
||||
}
|
||||
|
||||
void verifyFlash() {
|
||||
println_Msg(F("Verifying..."));
|
||||
print_STR(verifying_STR, 1);
|
||||
display_Update();
|
||||
|
||||
// Open file on sd card
|
||||
@ -1721,7 +1731,7 @@ void verifyFlash() {
|
||||
// Get rom size from file
|
||||
fileSize = myFile.fileSize();
|
||||
if (fileSize > flashSize)
|
||||
print_Error(F("File size exceeds flash size."), true);
|
||||
print_Error(file_too_big_STR, true);
|
||||
|
||||
blank = 0;
|
||||
for (unsigned long currByte = 0; currByte < fileSize; currByte += 512) {
|
||||
@ -1737,15 +1747,15 @@ void verifyFlash() {
|
||||
println_Msg(F("Flashrom verified OK"));
|
||||
display_Update();
|
||||
} else {
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(blank);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
} else {
|
||||
println_Msg(F("Can't open file on SD"));
|
||||
print_STR(open_file_STR, 1);
|
||||
display_Update();
|
||||
}
|
||||
}
|
||||
@ -1772,7 +1782,7 @@ void readFlash() {
|
||||
|
||||
// Open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
}
|
||||
for (unsigned long currByte = 0; currByte < flashSize; currByte += 512) {
|
||||
for (int c = 0; c < 512; c++) {
|
||||
@ -1793,7 +1803,7 @@ void printFlash(int numBytes) {
|
||||
for (int currByte = 0; currByte < numBytes; currByte += 10) {
|
||||
for (int c = 0; c < 10; c++) {
|
||||
itoa(readByte_Flash(currByte + c), myBuffer, 16);
|
||||
for (int i = 0; i < 2 - strlen(myBuffer); i++) {
|
||||
for (size_t i = 0; i < 2 - strlen(myBuffer); i++) {
|
||||
print_Msg(F("0"));
|
||||
}
|
||||
// Now print the significant bits
|
||||
@ -1834,7 +1844,7 @@ void resetFlash16() {
|
||||
void writeFlash16() {
|
||||
// Create filepath
|
||||
sprintf(filePath, "%s/%s", filePath, fileName);
|
||||
println_Msg(F("Flashing file "));
|
||||
print_STR(flashing_file_STR, 1);
|
||||
println_Msg(filePath);
|
||||
display_Update();
|
||||
|
||||
@ -1843,7 +1853,7 @@ void writeFlash16() {
|
||||
// Get rom size from file
|
||||
fileSize = myFile.fileSize();
|
||||
if (fileSize > flashSize)
|
||||
print_Error(F("File size exceeds flash size."), true);
|
||||
print_Error(file_too_big_STR, true);
|
||||
|
||||
// Set data pins to output
|
||||
dataOut16();
|
||||
@ -1892,7 +1902,7 @@ void writeFlash16() {
|
||||
void writeFlash16_29F1601() {
|
||||
// Create filepath
|
||||
sprintf(filePath, "%s/%s", filePath, fileName);
|
||||
println_Msg(F("Flashing file "));
|
||||
print_STR(flashing_file_STR, 1);
|
||||
println_Msg(filePath);
|
||||
display_Update();
|
||||
|
||||
@ -1901,7 +1911,7 @@ void writeFlash16_29F1601() {
|
||||
// Get rom size from file
|
||||
fileSize = myFile.fileSize();
|
||||
if (fileSize > flashSize)
|
||||
print_Error(F("File size exceeds flash size."), true);
|
||||
print_Error(file_too_big_STR, true);
|
||||
|
||||
// Set data pins to output
|
||||
dataOut16();
|
||||
@ -1965,7 +1975,9 @@ void idFlash16() {
|
||||
dataIn16();
|
||||
|
||||
// Read the two id bytes into a string
|
||||
sprintf(flashid, "%02X%02X", readWord_Flash(0) & 0xFF, readWord_Flash(1) & 0xFF);
|
||||
flashid = (readWord_Flash(0) & 0xFF) << 8;
|
||||
flashid |= readWord_Flash(1) & 0xFF;
|
||||
sprintf(flashid_str, "%04X", flashid);
|
||||
}
|
||||
|
||||
byte readStatusReg16() {
|
||||
@ -2024,7 +2036,7 @@ void blankcheck16() {
|
||||
}
|
||||
|
||||
void verifyFlash16() {
|
||||
println_Msg(F("Verifying..."));
|
||||
print_STR(verifying_STR, 1);
|
||||
display_Update();
|
||||
|
||||
// Open file on sd card
|
||||
@ -2032,7 +2044,7 @@ void verifyFlash16() {
|
||||
// Get rom size from file
|
||||
fileSize = myFile.fileSize();
|
||||
if (fileSize > flashSize) {
|
||||
print_Error(F("File size exceeds flash size."), true);
|
||||
print_Error(file_too_big_STR, true);
|
||||
}
|
||||
|
||||
blank = 0;
|
||||
@ -2135,14 +2147,14 @@ void printFlash16(int numBytes) {
|
||||
|
||||
|
||||
sprintf(buf, "%x", left_byte);
|
||||
for (int i = 0; i < 2 - strlen(buf); i++) {
|
||||
for (size_t i = 0; i < 2 - strlen(buf); i++) {
|
||||
print_Msg(F("0"));
|
||||
}
|
||||
// Now print the significant bits
|
||||
print_Msg(buf);
|
||||
|
||||
sprintf(buf, "%x", right_byte);
|
||||
for (int i = 0; i < 2 - strlen(buf); i++) {
|
||||
for (size_t i = 0; i < 2 - strlen(buf); i++) {
|
||||
print_Msg(F("0"));
|
||||
}
|
||||
// Now print the significant bits
|
||||
@ -2190,7 +2202,7 @@ void busyCheck16_29LV640(unsigned long myAddress, word myData) {
|
||||
void writeFlash16_29LV640() {
|
||||
// Create filepath
|
||||
sprintf(filePath, "%s/%s", filePath, fileName);
|
||||
println_Msg(F("Flashing file "));
|
||||
print_STR(flashing_file_STR, 1);
|
||||
println_Msg(filePath);
|
||||
display_Update();
|
||||
|
||||
@ -2199,7 +2211,7 @@ void writeFlash16_29LV640() {
|
||||
// Get rom size from file
|
||||
fileSize = myFile.fileSize();
|
||||
if (fileSize > flashSize)
|
||||
print_Error(F("File size exceeds flash size."), true);
|
||||
print_Error(file_too_big_STR, true);
|
||||
|
||||
// Set data pins to output
|
||||
dataOut16();
|
||||
@ -2417,7 +2429,7 @@ void read_Eprom() {
|
||||
void write_Eprom() {
|
||||
// Create filepath
|
||||
sprintf(filePath, "%s/%s", filePath, fileName);
|
||||
println_Msg(F("Flashing file "));
|
||||
print_STR(flashing_file_STR, 1);
|
||||
println_Msg(filePath);
|
||||
display_Update();
|
||||
|
||||
@ -2426,7 +2438,7 @@ void write_Eprom() {
|
||||
// Get rom size from file
|
||||
fileSize = myFile.fileSize();
|
||||
if (fileSize > flashSize)
|
||||
print_Error(F("File size exceeds flash size."), true);
|
||||
print_Error(file_too_big_STR, true);
|
||||
|
||||
// Switch VPP/OE(PH5) to HIGH
|
||||
PORTH |= (1 << 5);
|
||||
@ -2477,7 +2489,7 @@ void write_Eprom() {
|
||||
}
|
||||
|
||||
void verify_Eprom() {
|
||||
println_Msg(F("Verifying..."));
|
||||
print_STR(verifying_STR, 1);
|
||||
display_Update();
|
||||
|
||||
// Open file on sd card
|
||||
@ -2485,7 +2497,7 @@ void verify_Eprom() {
|
||||
// Get rom size from file
|
||||
fileSize = myFile.fileSize();
|
||||
if (fileSize > flashSize) {
|
||||
print_Error(F("File size exceeds flash size."), true);
|
||||
print_Error(file_too_big_STR, true);
|
||||
}
|
||||
|
||||
blank = 0;
|
||||
@ -2534,14 +2546,14 @@ void print_Eprom(int numBytes) {
|
||||
|
||||
|
||||
sprintf(buf, "%x", left_byte);
|
||||
for (int i = 0; i < 2 - strlen(buf); i++) {
|
||||
for (size_t i = 0; i < 2 - strlen(buf); i++) {
|
||||
print_Msg(F("0"));
|
||||
}
|
||||
// Now print the significant bits
|
||||
print_Msg(buf);
|
||||
|
||||
sprintf(buf, "%x", right_byte);
|
||||
for (int i = 0; i < 2 - strlen(buf); i++) {
|
||||
for (size_t i = 0; i < 2 - strlen(buf); i++) {
|
||||
print_Msg(F("0"));
|
||||
}
|
||||
// Now print the significant bits
|
||||
|
@ -7,8 +7,8 @@
|
||||
Variables
|
||||
*****************************************/
|
||||
// Game Boy
|
||||
int sramBanks;
|
||||
int romBanks;
|
||||
word sramBanks;
|
||||
word romBanks;
|
||||
word lastByte = 0;
|
||||
|
||||
/******************************************
|
||||
@ -19,15 +19,15 @@ static const char gbxMenuItem1[] PROGMEM = "Game Boy (Color)";
|
||||
static const char gbxMenuItem2[] PROGMEM = "GB Advance (3V)";
|
||||
static const char gbxMenuItem3[] PROGMEM = "Flash GBC Cart";
|
||||
static const char gbxMenuItem4[] PROGMEM = "NPower GB Memory";
|
||||
static const char gbxMenuItem5[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsGBx[] PROGMEM = { gbxMenuItem1, gbxMenuItem2, gbxMenuItem3, gbxMenuItem4, gbxMenuItem5 };
|
||||
//static const char gbxMenuItem5[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsGBx[] PROGMEM = { gbxMenuItem1, gbxMenuItem2, gbxMenuItem3, gbxMenuItem4, string_reset2 };
|
||||
|
||||
// GB menu items
|
||||
static const char GBMenuItem1[] PROGMEM = "Read ROM";
|
||||
static const char GBMenuItem2[] PROGMEM = "Read Save";
|
||||
static const char GBMenuItem3[] PROGMEM = "Write Save";
|
||||
static const char GBMenuItem4[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsGB[] PROGMEM = { GBMenuItem1, GBMenuItem2, GBMenuItem3, GBMenuItem4 };
|
||||
//static const char GBMenuItem4[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsGB[] PROGMEM = { GBMenuItem1, GBMenuItem2, GBMenuItem3, string_reset2 };
|
||||
|
||||
// GB Flash items
|
||||
static const char GBFlashItem1[] PROGMEM = "29F Cart (MBC3)";
|
||||
@ -36,8 +36,8 @@ static const char GBFlashItem3[] PROGMEM = "29F Cart (CAM)";
|
||||
static const char GBFlashItem4[] PROGMEM = "CFI Cart";
|
||||
static const char GBFlashItem5[] PROGMEM = "CFI Cart and Save";
|
||||
static const char GBFlashItem6[] PROGMEM = "GB Smart";
|
||||
static const char GBFlashItem7[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsGBFlash[] PROGMEM = { GBFlashItem1, GBFlashItem2, GBFlashItem3, GBFlashItem4, GBFlashItem5, GBFlashItem6, GBFlashItem7 };
|
||||
//static const char GBFlashItem7[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsGBFlash[] PROGMEM = { GBFlashItem1, GBFlashItem2, GBFlashItem3, GBFlashItem4, GBFlashItem5, GBFlashItem6, string_reset2 };
|
||||
|
||||
// Start menu for both GB and GBA
|
||||
void gbxMenu() {
|
||||
@ -84,7 +84,8 @@ void gbxMenu() {
|
||||
//MBC3
|
||||
writeFlash29F_GB(3, 1);
|
||||
// Reset
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
resetArduino();
|
||||
@ -102,7 +103,8 @@ void gbxMenu() {
|
||||
//MBC5
|
||||
writeFlash29F_GB(5, 1);
|
||||
// Reset
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
resetArduino();
|
||||
@ -120,7 +122,8 @@ void gbxMenu() {
|
||||
sd.chdir("/");
|
||||
//MBC3
|
||||
writeFlash29F_GB(3, 1);
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
|
||||
@ -131,7 +134,8 @@ void gbxMenu() {
|
||||
println_Msg(F("if you want to flash"));
|
||||
println_Msg(F("a second game"));
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
|
||||
@ -143,7 +147,8 @@ void gbxMenu() {
|
||||
|
||||
// Reset
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
resetArduino();
|
||||
@ -167,7 +172,8 @@ void gbxMenu() {
|
||||
if (!writeCFI_GB()) {
|
||||
display_Clear();
|
||||
println_Msg(F("Flashing failed, time out!"));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
@ -194,7 +200,8 @@ void gbxMenu() {
|
||||
if (!writeCFI_GB()) {
|
||||
display_Clear();
|
||||
println_Msg(F("Flashing failed, time out!"));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
resetArduino();
|
||||
@ -230,10 +237,10 @@ void gbxMenu() {
|
||||
println_Msg(F("Verified OK"));
|
||||
display_Update();
|
||||
} else {
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(wrErrors);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -333,10 +340,10 @@ void gbMenu() {
|
||||
println_Msg(F("Verified OK"));
|
||||
display_Update();
|
||||
} else {
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(wrErrors);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@ -349,7 +356,8 @@ void gbMenu() {
|
||||
resetArduino();
|
||||
break;
|
||||
}
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
@ -534,7 +542,8 @@ void showCartInfo_GB() {
|
||||
|
||||
// Wait for user input
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
} else {
|
||||
@ -873,12 +882,10 @@ void getCartInfo_GB() {
|
||||
for (int addr = 0x0134; addr <= 0x0143 - x; addr++) {
|
||||
myByte = sdBuffer[addr];
|
||||
if (isprint(myByte) && myByte != '<' && myByte != '>' && myByte != ':' && myByte != '"' && myByte != '/' && myByte != '\\' && myByte != '|' && myByte != '?' && myByte != '*') {
|
||||
romName[myLength] = char(myByte);
|
||||
} else {
|
||||
if (romName[myLength - 1] == 0x5F) myLength--;
|
||||
romName[myLength] = 0x5F;
|
||||
romName[myLength++] = char(myByte);
|
||||
} else if (myLength == 0 || romName[myLength - 1] != '_') {
|
||||
romName[myLength++] = '_';
|
||||
}
|
||||
myLength++;
|
||||
}
|
||||
|
||||
// Find Game Serial
|
||||
@ -895,26 +902,50 @@ void getCartInfo_GB() {
|
||||
}
|
||||
|
||||
// Strip trailing white space
|
||||
for (unsigned int i = myLength - 1; i > 0; i--) {
|
||||
if ((romName[i] != 0x5F) && (romName[i] != 0x20)) break;
|
||||
romName[i] = 0x00;
|
||||
while (
|
||||
myLength &&
|
||||
(romName[myLength - 1] == '_' || romName[myLength - 1] == ' ')
|
||||
) {
|
||||
myLength--;
|
||||
}
|
||||
romName[myLength] = 0;
|
||||
|
||||
// M161 (Mani 4 in 1)
|
||||
if ((strncmp(romName, "TETRIS SET", 10) == 0) && (sdBuffer[0x14D] == 0x3F)) {
|
||||
if (strncmp(romName, "TETRIS SET", 10) == 0 && sdBuffer[0x14D] == 0x3F) {
|
||||
romType = 0x104;
|
||||
}
|
||||
|
||||
// MMM01 (Mani 4 in 1)
|
||||
if (
|
||||
(strncmp(romName, "BOUKENJIMA2 SET", 15) == 0) && (sdBuffer[0x14D] == 0) || (strncmp(romName, "BUBBLEBOBBLE SET", 16) == 0) && (sdBuffer[0x14D] == 0xC6) || (strncmp(romName, "GANBARUGA SET", 13) == 0) && (sdBuffer[0x14D] == 0x90) || (strncmp(romName, "RTYPE 2 SET", 11) == 0) && (sdBuffer[0x14D] == 0x32)) {
|
||||
(
|
||||
strncmp(romName, "BOUKENJIMA2 SET", 15) == 0 && sdBuffer[0x14D] == 0
|
||||
) || (
|
||||
strncmp(romName, "BUBBLEBOBBLE SET", 16) == 0 && sdBuffer[0x14D] == 0xC6
|
||||
) || (
|
||||
strncmp(romName, "GANBARUGA SET", 13) == 0 && sdBuffer[0x14D] == 0x90
|
||||
) || (
|
||||
strncmp(romName, "RTYPE 2 SET", 11) == 0 && sdBuffer[0x14D] == 0x32
|
||||
)
|
||||
) {
|
||||
romType = 0x0B;
|
||||
}
|
||||
|
||||
// MBC1M
|
||||
if (
|
||||
(strncmp(romName, "MOMOCOL", 7) == 0) && (sdBuffer[0x14D] == 0x28) || (strncmp(romName, "BOMCOL", 6) == 0) && (sdBuffer[0x14D] == 0x86) || (strncmp(romName, "GENCOL", 6) == 0) && (sdBuffer[0x14D] == 0x8A) || (strncmp(romName, "SUPERCHINESE 123", 16) == 0) && (sdBuffer[0x14D] == 0xE4) || (strncmp(romName, "MORTALKOMBATI&II", 16) == 0) && (sdBuffer[0x14D] == 0xB9) || (strncmp(romName, "MORTALKOMBAT DUO", 16) == 0) && (sdBuffer[0x14D] == 0xA7)) {
|
||||
(
|
||||
strncmp(romName, "MOMOCOL", 7) == 0 && sdBuffer[0x14D] == 0x28
|
||||
) || (
|
||||
strncmp(romName, "BOMCOL", 6) == 0 && sdBuffer[0x14D] == 0x86
|
||||
) || (
|
||||
strncmp(romName, "GENCOL", 6) == 0 && sdBuffer[0x14D] == 0x8A
|
||||
) || (
|
||||
strncmp(romName, "SUPERCHINESE 123", 16) == 0 && sdBuffer[0x14D] == 0xE4
|
||||
) || (
|
||||
strncmp(romName, "MORTALKOMBATI&II", 16) == 0 && sdBuffer[0x14D] == 0xB9
|
||||
) || (
|
||||
strncmp(romName, "MORTALKOMBAT DUO", 16) == 0 && sdBuffer[0x14D] == 0xA7
|
||||
)
|
||||
) {
|
||||
romType += 0x100;
|
||||
}
|
||||
|
||||
@ -938,7 +969,7 @@ void readROM_GB() {
|
||||
sd.chdir(folder);
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("Saving to "));
|
||||
print_STR(saving_to_STR, 0);
|
||||
print_Msg(folder);
|
||||
println_Msg(F("/..."));
|
||||
display_Update();
|
||||
@ -949,10 +980,10 @@ void readROM_GB() {
|
||||
|
||||
//open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
}
|
||||
|
||||
int endAddress = 0x7FFF;
|
||||
word endAddress = 0x7FFF;
|
||||
word romAddress = 0;
|
||||
word startBank = 1;
|
||||
|
||||
@ -1073,7 +1104,7 @@ void readROM_GB() {
|
||||
}
|
||||
|
||||
// Calculate checksum
|
||||
unsigned int calc_checksum_GB(char* fileName, char* folder) {
|
||||
unsigned int calc_checksum_GB(char* fileName) {
|
||||
unsigned int calcChecksum = 0;
|
||||
// int calcFilesize = 0; // unused
|
||||
unsigned long i = 0;
|
||||
@ -1117,7 +1148,7 @@ void compare_checksums_GB() {
|
||||
|
||||
// Internal ROM checksum
|
||||
char calcsumStr[5];
|
||||
sprintf(calcsumStr, "%04X", calc_checksum_GB(fileName, folder));
|
||||
sprintf(calcsumStr, "%04X", calc_checksum_GB(fileName));
|
||||
|
||||
print_Msg(F("Checksum: "));
|
||||
print_Msg(calcsumStr);
|
||||
@ -1158,7 +1189,7 @@ void readSRAM_GB() {
|
||||
|
||||
//open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
|
||||
// MBC2 Fix
|
||||
@ -1289,7 +1320,8 @@ unsigned long verifySRAM_GB() {
|
||||
myFile.close();
|
||||
return writeErrors;
|
||||
} else {
|
||||
print_Error(F("Can't open file"), true);
|
||||
print_Error(open_file_STR, true);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1306,7 +1338,7 @@ void readSRAMFLASH_MBC6_GB() {
|
||||
sd.chdir(folder);
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("Saving to "));
|
||||
print_STR(saving_to_STR, 0);
|
||||
print_Msg(folder);
|
||||
println_Msg(F("/..."));
|
||||
display_Update();
|
||||
@ -1317,7 +1349,7 @@ void readSRAMFLASH_MBC6_GB() {
|
||||
|
||||
//open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
|
||||
//Initialize progress bar
|
||||
@ -1599,33 +1631,34 @@ void writeFlash29F_GB(byte MBC, boolean flashErase) {
|
||||
writeByte_GB(0x555, 0x90);
|
||||
|
||||
// Read the two id bytes into a string
|
||||
sprintf(flashid, "%02X%02X", readByte_GB(0), readByte_GB(1));
|
||||
flashid = readByte_GB(0) << 8;
|
||||
flashid |= readByte_GB(1);
|
||||
|
||||
if (strcmp(flashid, "04D4") == 0) {
|
||||
if (flashid == 0x04D4) {
|
||||
println_Msg(F("MBM29F033C"));
|
||||
print_Msg(F("Banks: "));
|
||||
print_Msg(romBanks);
|
||||
println_Msg(F("/256"));
|
||||
display_Update();
|
||||
} else if (strcmp(flashid, "0141") == 0) {
|
||||
} else if (flashid == 0x0141) {
|
||||
println_Msg(F("AM29F032B"));
|
||||
print_Msg(F("Banks: "));
|
||||
print_Msg(romBanks);
|
||||
println_Msg(F("/256"));
|
||||
display_Update();
|
||||
} else if (strcmp(flashid, "01AD") == 0) {
|
||||
} else if (flashid == 0x01AD) {
|
||||
println_Msg(F("AM29F016B"));
|
||||
print_Msg(F("Banks: "));
|
||||
print_Msg(romBanks);
|
||||
println_Msg(F("/128"));
|
||||
display_Update();
|
||||
} else if (strcmp(flashid, "04AD") == 0) {
|
||||
} else if (flashid == 0x04AD) {
|
||||
println_Msg(F("AM29F016D"));
|
||||
print_Msg(F("Banks: "));
|
||||
print_Msg(romBanks);
|
||||
println_Msg(F("/128"));
|
||||
display_Update();
|
||||
} else if (strcmp(flashid, "01D5") == 0) {
|
||||
} else if (flashid == 0x01D5) {
|
||||
println_Msg(F("AM29F080B"));
|
||||
print_Msg(F("Banks: "));
|
||||
print_Msg(romBanks);
|
||||
@ -1633,7 +1666,8 @@ void writeFlash29F_GB(byte MBC, boolean flashErase) {
|
||||
display_Update();
|
||||
} else {
|
||||
print_Msg(F("Flash ID: "));
|
||||
println_Msg(flashid);
|
||||
sprintf(flashid_str, "%04X", flashid);
|
||||
println_Msg(flashid_str);
|
||||
display_Update();
|
||||
print_Error(F("Unknown flashrom"), true);
|
||||
}
|
||||
@ -1668,7 +1702,7 @@ void writeFlash29F_GB(byte MBC, boolean flashErase) {
|
||||
display_Update();
|
||||
|
||||
// Read x number of banks
|
||||
for (int currBank = 0; currBank < romBanks; currBank++) {
|
||||
for (word currBank = 0; currBank < romBanks; currBank++) {
|
||||
// Blink led
|
||||
blinkLED();
|
||||
|
||||
@ -1702,7 +1736,7 @@ void writeFlash29F_GB(byte MBC, boolean flashErase) {
|
||||
uint32_t totalProgressBar = (uint32_t)(romBanks)*16384;
|
||||
draw_progressbar(0, totalProgressBar);
|
||||
|
||||
for (int currBank = 0; currBank < romBanks; currBank++) {
|
||||
for (word currBank = 0; currBank < romBanks; currBank++) {
|
||||
// Blink led
|
||||
blinkLED();
|
||||
|
||||
@ -1752,7 +1786,7 @@ void writeFlash29F_GB(byte MBC, boolean flashErase) {
|
||||
uint32_t totalProgressBar = (uint32_t)(romBanks)*16384;
|
||||
draw_progressbar(0, totalProgressBar);
|
||||
|
||||
for (int currBank = 0; currBank < romBanks; currBank++) {
|
||||
for (word currBank = 0; currBank < romBanks; currBank++) {
|
||||
// Blink led
|
||||
blinkLED();
|
||||
|
||||
@ -1788,7 +1822,7 @@ void writeFlash29F_GB(byte MBC, boolean flashErase) {
|
||||
}
|
||||
}
|
||||
|
||||
print_Msg(F("Verifying..."));
|
||||
print_STR(verifying_STR, 0);
|
||||
display_Update();
|
||||
|
||||
// Go back to file beginning
|
||||
@ -1837,11 +1871,11 @@ void writeFlash29F_GB(byte MBC, boolean flashErase) {
|
||||
} else {
|
||||
println_Msg(F("Error"));
|
||||
print_Msg(writeErrors);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), true);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, true);
|
||||
}
|
||||
} else {
|
||||
println_Msg(F("Can't open file"));
|
||||
print_STR(open_file_STR, 1);
|
||||
display_Update();
|
||||
}
|
||||
}
|
||||
@ -1874,7 +1908,7 @@ byte readByteCompensated(int address) {
|
||||
.
|
||||
address needs to be the x8 mode address of the flash register that should be read.
|
||||
*/
|
||||
byte writeByteCompensated(int address, byte data) {
|
||||
void writeByteCompensated(int address, byte data) {
|
||||
if (flashSwitchLastBits) {
|
||||
data = (data & 0b11111100) | ((data << 1) & 0b10) | ((data >> 1) & 0b01);
|
||||
}
|
||||
@ -2018,7 +2052,8 @@ bool writeCFI_GB() {
|
||||
print_Msg(F("but needs "));
|
||||
print_Msg(romBanks);
|
||||
println_Msg(F("."));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
resetArduino();
|
||||
@ -2066,7 +2101,7 @@ bool writeCFI_GB() {
|
||||
display_Update();
|
||||
|
||||
// Read x number of banks
|
||||
for (int currBank = 0; currBank < romBanks; currBank++) {
|
||||
for (word currBank = 0; currBank < romBanks; currBank++) {
|
||||
// Blink led
|
||||
blinkLED();
|
||||
|
||||
@ -2093,7 +2128,7 @@ bool writeCFI_GB() {
|
||||
word currAddr = 0;
|
||||
word endAddr = 0x3FFF;
|
||||
|
||||
for (int currBank = 0; currBank < romBanks; currBank++) {
|
||||
for (word currBank = 0; currBank < romBanks; currBank++) {
|
||||
// Blink led
|
||||
blinkLED();
|
||||
|
||||
@ -2194,13 +2229,13 @@ bool writeCFI_GB() {
|
||||
println_Msg(F("OK"));
|
||||
display_Update();
|
||||
} else {
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(writeErrors);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
} else {
|
||||
println_Msg(F("Can't open file"));
|
||||
print_STR(open_file_STR, 1);
|
||||
display_Update();
|
||||
}
|
||||
return true;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -42,7 +42,8 @@ void gbmMenu() {
|
||||
println_Msg(F("cartreader directly"));
|
||||
println_Msg(F("before reading"));
|
||||
println_Msg("");
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
// Clear screen
|
||||
@ -71,7 +72,8 @@ void gbmMenu() {
|
||||
println_Msg(F("NP Cartridge."));
|
||||
println_Msg("");
|
||||
println_Msg("");
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
// Clear screen
|
||||
@ -131,7 +133,8 @@ void gbmMenu() {
|
||||
println_Msg(F("NP Cartridge's"));
|
||||
println_Msg(F("mapping data"));
|
||||
println_Msg("");
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
|
||||
@ -171,7 +174,8 @@ void gbmMenu() {
|
||||
break;
|
||||
}
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
@ -304,7 +308,7 @@ void writeByte_GBM(word myAddress, byte myData) {
|
||||
HELPER FUNCTIONS
|
||||
**********************/
|
||||
void printSdBuffer(word startByte, word numBytes) {
|
||||
for (int currByte = 0; currByte < numBytes; currByte += 10) {
|
||||
for (word currByte = 0; currByte < numBytes; currByte += 10) {
|
||||
for (byte c = 0; c < 10; c++) {
|
||||
// Convert to char array so we don't lose leading zeros
|
||||
char currByteStr[2];
|
||||
@ -333,7 +337,7 @@ void readROM_GBM(word numBanks) {
|
||||
|
||||
// Open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
} else {
|
||||
// Read rom
|
||||
word currAddress = 0;
|
||||
@ -492,16 +496,18 @@ boolean readFlashID_GBM() {
|
||||
send_GBM(0x0F, 0x5555, 0x90);
|
||||
|
||||
// Read the two id bytes into a string
|
||||
sprintf(flashid, "%02X%02X", readByte_GBM(0), readByte_GBM(1));
|
||||
if (strcmp(flashid, "C289") == 0) {
|
||||
flashid = readByte_GBM(0) << 8;
|
||||
flashid |= readByte_GBM(1);
|
||||
sprintf(flashid_str, "%04X", flashid);
|
||||
if (flashid == 0xC289) {
|
||||
print_Msg(F("Flash ID: "));
|
||||
println_Msg(flashid);
|
||||
println_Msg(flashid_str);
|
||||
display_Update();
|
||||
resetFlash_GBM();
|
||||
return 1;
|
||||
} else {
|
||||
print_Msg(F("Flash ID: "));
|
||||
println_Msg(flashid);
|
||||
println_Msg(flashid_str);
|
||||
print_Error(F("Unknown Flash ID"), true);
|
||||
resetFlash_GBM();
|
||||
return 0;
|
||||
@ -677,7 +683,7 @@ void writeFlash_GBM() {
|
||||
}
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
println_Msg(F("Done"));
|
||||
print_STR(done_STR, 1);
|
||||
} else {
|
||||
print_Error(F("Can't open file"), false);
|
||||
}
|
||||
@ -716,7 +722,7 @@ void readMapping_GBM() {
|
||||
|
||||
// Open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
} else {
|
||||
for (byte currByte = 0; currByte < 128; currByte++) {
|
||||
sdBuffer[currByte] = readByte_GBM(currByte);
|
||||
@ -891,7 +897,7 @@ void writeMapping_GBM() {
|
||||
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
println_Msg(F("Done"));
|
||||
print_STR(done_STR, 1);
|
||||
} else {
|
||||
print_Error(F("Can't open file"), false);
|
||||
}
|
||||
|
@ -11,8 +11,8 @@
|
||||
// GB Smart menu items
|
||||
static const char gbSmartMenuItem1[] PROGMEM = "Game Menu";
|
||||
static const char gbSmartMenuItem2[] PROGMEM = "Flash Menu";
|
||||
static const char gbSmartMenuItem3[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsGBSmart[] PROGMEM = { gbSmartMenuItem1, gbSmartMenuItem2, gbSmartMenuItem3 };
|
||||
//static const char gbSmartMenuItem3[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsGBSmart[] PROGMEM = { gbSmartMenuItem1, gbSmartMenuItem2, string_reset2 };
|
||||
|
||||
static const char gbSmartFlashMenuItem1[] PROGMEM = "Read Flash";
|
||||
static const char gbSmartFlashMenuItem2[] PROGMEM = "Write Flash";
|
||||
@ -23,17 +23,17 @@ static const char gbSmartGameMenuItem1[] PROGMEM = "Read Game";
|
||||
static const char gbSmartGameMenuItem2[] PROGMEM = "Read SRAM";
|
||||
static const char gbSmartGameMenuItem3[] PROGMEM = "Write SRAM";
|
||||
static const char gbSmartGameMenuItem4[] PROGMEM = "Switch Game";
|
||||
static const char gbSmartGameMenuItem5[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsGBSmartGame[] PROGMEM = { gbSmartGameMenuItem1, gbSmartGameMenuItem2, gbSmartGameMenuItem3, gbSmartGameMenuItem4, gbSmartGameMenuItem5 };
|
||||
//static const char gbSmartGameMenuItem5[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsGBSmartGame[] PROGMEM = { gbSmartGameMenuItem1, gbSmartGameMenuItem2, gbSmartGameMenuItem3, gbSmartGameMenuItem4, string_reset2 };
|
||||
|
||||
typedef struct
|
||||
struct GBSmartGameInfo
|
||||
{
|
||||
uint8_t start_bank;
|
||||
uint8_t rom_type;
|
||||
uint8_t rom_size;
|
||||
uint8_t sram_size;
|
||||
char title[16];
|
||||
} GBSmartGameInfo;
|
||||
};
|
||||
|
||||
uint32_t gbSmartSize = 32 * 131072;
|
||||
uint16_t gbSmartBanks = 256;
|
||||
@ -46,19 +46,9 @@ uint8_t gbSmartRomSizeGB = 0x07;
|
||||
uint8_t gbSmartSramSizeGB = 0x04;
|
||||
uint8_t gbSmartFlashSizeGB = 0x06;
|
||||
|
||||
GBSmartGameInfo gbSmartGames[GB_SMART_GAMES_PER_PAGE];
|
||||
|
||||
byte signature[48];
|
||||
uint16_t gameMenuStartBank;
|
||||
|
||||
#ifdef enable_SFM
|
||||
extern boolean hasMenu;
|
||||
extern byte numGames;
|
||||
#else
|
||||
boolean hasMenu;
|
||||
byte numGames;
|
||||
#endif
|
||||
|
||||
// Compare checksum
|
||||
boolean compare_checksum_GBS() {
|
||||
println_Msg(F("Calculating Checksum"));
|
||||
@ -72,7 +62,7 @@ boolean compare_checksum_GBS() {
|
||||
sprintf(folder, "GB/ROM/%s/%d", romName, foldern - 1);
|
||||
|
||||
char calcsumStr[5];
|
||||
sprintf(calcsumStr, "%04X", calc_checksum_GB(fileName, folder));
|
||||
sprintf(calcsumStr, "%04X", calc_checksum_GB(fileName));
|
||||
|
||||
if (strcmp(calcsumStr, checksumStr) == 0) {
|
||||
print_Msg(F("Result: "));
|
||||
@ -150,8 +140,6 @@ void setup_GBSmart() {
|
||||
signature[i] = readByte_GBS(0x0104 + i);
|
||||
|
||||
gameMenuStartBank = 0x02;
|
||||
hasMenu = true;
|
||||
numGames = 0;
|
||||
|
||||
display_Clear();
|
||||
display_Update();
|
||||
@ -216,10 +204,10 @@ void gbSmartGameOptions() {
|
||||
println_Msg(F("Verified OK"));
|
||||
display_Update();
|
||||
} else {
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(wrErrors);
|
||||
println_Msg(F(" bytes"));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -238,19 +226,23 @@ void gbSmartGameOptions() {
|
||||
|
||||
if (gameSubMenu != 3) {
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
}
|
||||
|
||||
void gbSmartGameMenu() {
|
||||
boolean hasMenu;
|
||||
byte numGames;
|
||||
struct GBSmartGameInfo gbSmartGames[GB_SMART_GAMES_PER_PAGE];
|
||||
uint8_t gameSubMenu = 0;
|
||||
gb_smart_load_more_games:
|
||||
if (gameMenuStartBank > 0xfe)
|
||||
gameMenuStartBank = 0x02;
|
||||
|
||||
gbSmartGetGames();
|
||||
gbSmartGetGames(gbSmartGames, &hasMenu, &numGames);
|
||||
|
||||
if (hasMenu) {
|
||||
char menuOptionsGBSmartGames[7][20];
|
||||
@ -310,7 +302,8 @@ void gbSmartFlashMenu() {
|
||||
println_Msg(F("This will erase your"));
|
||||
println_Msg(F("GB Smart Cartridge."));
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
|
||||
@ -331,34 +324,50 @@ void gbSmartFlashMenu() {
|
||||
}
|
||||
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
|
||||
void gbSmartGetGames() {
|
||||
void gbSmartGetOneGame(struct GBSmartGameInfo *gbSmartGames, byte bank, word base) {
|
||||
uint8_t myByte, myLength = 0;
|
||||
word title_address = base + 0x0134;
|
||||
|
||||
for (uint8_t j = 0; j < 15; j++) {
|
||||
myByte = readByte_GBS(title_address++);
|
||||
|
||||
if (((myByte >= '0' && myByte <= '9') || (myByte >= 'A' && myByte <= 'z')))
|
||||
gbSmartGames->title[myLength++] = myByte;
|
||||
}
|
||||
|
||||
gbSmartGames->title[myLength] = 0x00;
|
||||
gbSmartGames->start_bank = bank;
|
||||
gbSmartGames->rom_type = readByte_GBS(base + 0x0147);
|
||||
gbSmartGames->rom_size = readByte_GBS(base + 0x0148);
|
||||
gbSmartGames->sram_size = readByte_GBS(base + 0x0149);
|
||||
}
|
||||
|
||||
void gbSmartGetGames(struct GBSmartGameInfo *gbSmartGames, boolean *hasMenu, byte *numGames) {
|
||||
static const byte menu_title[] = { 0x47, 0x42, 0x31, 0x36, 0x4d };
|
||||
|
||||
// reset remap setting
|
||||
gbSmartRemapStartBank(0x00, gbSmartRomSizeGB, gbSmartSramSizeGB);
|
||||
|
||||
uint16_t i;
|
||||
uint8_t myByte, myLength;
|
||||
|
||||
// check if contain menu
|
||||
hasMenu = true;
|
||||
*hasMenu = true;
|
||||
dataIn();
|
||||
for (i = 0; i < 5; i++) {
|
||||
if (readByte_GBS(0x0134 + i) != menu_title[i]) {
|
||||
hasMenu = false;
|
||||
*hasMenu = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (hasMenu) {
|
||||
for (i = gameMenuStartBank, numGames = 0; i < gbSmartBanks && numGames < GB_SMART_GAMES_PER_PAGE;) {
|
||||
myLength = 0;
|
||||
|
||||
if (*hasMenu) {
|
||||
for (i = gameMenuStartBank, *numGames = 0; i < gbSmartBanks && *numGames < GB_SMART_GAMES_PER_PAGE;) {
|
||||
// switch bank
|
||||
dataOut();
|
||||
writeByte_GB(0x2100, i);
|
||||
@ -368,46 +377,19 @@ void gbSmartGetGames() {
|
||||
for (uint8_t j = 0x00; j < 0x30; j++) {
|
||||
if (readByte_GBS(0x4104 + j) != signature[j]) {
|
||||
i += 0x02;
|
||||
goto gb_smart_get_game_loop_end;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
for (uint8_t j = 0; j < 15; j++) {
|
||||
myByte = readByte_GBS(0x4134 + j);
|
||||
|
||||
if (((char(myByte) >= 0x30 && char(myByte) <= 0x39) || (char(myByte) >= 0x41 && char(myByte) <= 0x7a)))
|
||||
gbSmartGames[numGames].title[myLength++] = char(myByte);
|
||||
}
|
||||
|
||||
gbSmartGames[numGames].title[myLength] = 0x00;
|
||||
gbSmartGames[numGames].start_bank = i;
|
||||
gbSmartGames[numGames].rom_type = readByte_GBS(0x4147);
|
||||
gbSmartGames[numGames].rom_size = readByte_GBS(0x4148);
|
||||
gbSmartGames[numGames].sram_size = readByte_GBS(0x4149);
|
||||
|
||||
myByte = (2 << gbSmartGames[numGames].rom_size);
|
||||
i += myByte;
|
||||
numGames++;
|
||||
gb_smart_get_game_loop_end:;
|
||||
gbSmartGetOneGame(&gbSmartGames[*numGames], i, 0x4000);
|
||||
i += (2 << gbSmartGames[(*numGames)++].rom_size);
|
||||
}
|
||||
|
||||
gameMenuStartBank = i;
|
||||
} else {
|
||||
dataIn();
|
||||
for (uint8_t j = 0; j < 15; j++) {
|
||||
myByte = readByte_GBS(0x0134 + j);
|
||||
gbSmartGetOneGame(&gbSmartGames[0], 0, 0);
|
||||
|
||||
if (((char(myByte) >= 0x30 && char(myByte) <= 0x39) || (char(myByte) >= 0x41 && char(myByte) <= 0x7a)))
|
||||
gbSmartGames[0].title[myLength++] = char(myByte);
|
||||
}
|
||||
|
||||
gbSmartGames[0].title[myLength] = 0x00;
|
||||
gbSmartGames[0].start_bank = 0x00;
|
||||
gbSmartGames[0].rom_type = readByte_GBS(0x0147);
|
||||
gbSmartGames[0].rom_size = readByte_GBS(0x0148);
|
||||
gbSmartGames[0].sram_size = readByte_GBS(0x0149);
|
||||
|
||||
numGames = 1;
|
||||
*numGames = 1;
|
||||
gameMenuStartBank = 0xfe;
|
||||
}
|
||||
}
|
||||
@ -419,10 +401,10 @@ void gbSmartReadFlash() {
|
||||
display_Update();
|
||||
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT))
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
|
||||
// reset flash to read array state
|
||||
for (int i = 0x00; i < gbSmartBanks; i += gbSmartBanksPerFlashChip)
|
||||
for (uint16_t i = 0x00; i < gbSmartBanks; i += gbSmartBanksPerFlashChip)
|
||||
gbSmartResetFlash(i);
|
||||
|
||||
// remaps mmc to full access
|
||||
@ -461,7 +443,7 @@ void gbSmartReadFlash() {
|
||||
}
|
||||
|
||||
void gbSmartWriteFlash() {
|
||||
for (int bank = 0x00; bank < gbSmartBanks; bank += gbSmartBanksPerFlashChip) {
|
||||
for (uint16_t bank = 0x00; bank < gbSmartBanks; bank += gbSmartBanksPerFlashChip) {
|
||||
display_Clear();
|
||||
|
||||
print_Msg(F("Erasing..."));
|
||||
@ -470,7 +452,7 @@ void gbSmartWriteFlash() {
|
||||
gbSmartEraseFlash(bank);
|
||||
gbSmartResetFlash(bank);
|
||||
|
||||
println_Msg(F("Done"));
|
||||
print_STR(done_STR, 1);
|
||||
print_Msg(F("Blankcheck..."));
|
||||
display_Update();
|
||||
|
||||
@ -487,7 +469,7 @@ void gbSmartWriteFlash() {
|
||||
gbSmartWriteFlashByte(0x0000, 0xff);
|
||||
}
|
||||
|
||||
print_Msg(F("Verifying..."));
|
||||
print_STR(verifying_STR, 0);
|
||||
display_Update();
|
||||
|
||||
writeErrors = gbSmartVerifyFlash();
|
||||
@ -495,16 +477,16 @@ void gbSmartWriteFlash() {
|
||||
println_Msg(F("OK"));
|
||||
display_Update();
|
||||
} else {
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(writeErrors);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), true);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, true);
|
||||
}
|
||||
}
|
||||
|
||||
void gbSmartWriteFlash(uint32_t start_bank) {
|
||||
if (!myFile.open(filePath, O_READ))
|
||||
print_Error(F("Can't open file on SD"), true);
|
||||
print_Error(open_file_STR, true);
|
||||
|
||||
// switch to flash base bank
|
||||
gbSmartRemapStartBank(start_bank, gbSmartFlashSizeGB, gbSmartSramSizeGB);
|
||||
|
@ -95,8 +95,8 @@ byte newintvsize;
|
||||
static const char intvMenuItem1[] PROGMEM = "Select Cart";
|
||||
static const char intvMenuItem2[] PROGMEM = "Read ROM";
|
||||
static const char intvMenuItem3[] PROGMEM = "Set Mapper + Size";
|
||||
static const char intvMenuItem4[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsINTV[] PROGMEM = { intvMenuItem1, intvMenuItem2, intvMenuItem3, intvMenuItem4 };
|
||||
//static const char intvMenuItem4[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsINTV[] PROGMEM = { intvMenuItem1, intvMenuItem2, intvMenuItem3, string_reset2 };
|
||||
|
||||
void setup_INTV() {
|
||||
// Set Address Pins to Output (UNUSED)
|
||||
@ -316,14 +316,14 @@ void readROM_INTV() {
|
||||
sd.chdir(folder);
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("Saving to "));
|
||||
print_STR(saving_to_STR, 0);
|
||||
print_Msg(folder);
|
||||
println_Msg(F("/..."));
|
||||
display_Update();
|
||||
|
||||
// open file on sdcard
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT))
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
|
||||
// write new folder number back to EEPROM
|
||||
foldern++;
|
||||
@ -423,7 +423,8 @@ void readROM_INTV() {
|
||||
compareCRC("intv.txt", 0, 1, 0);
|
||||
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
@ -528,11 +529,11 @@ void setMapper_INTV() {
|
||||
println_Msg(intvmapselect);
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to Change"));
|
||||
println_Msg(F("and right to Select"));
|
||||
print_STR(press_to_change_STR, 1);
|
||||
print_STR(right_to_select_STR, 1);
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to Change"));
|
||||
println_Msg(F("Press to Select"));
|
||||
print_STR(rotate_to_change_STR, 1);
|
||||
print_STR(press_to_select_STR, 1);
|
||||
#endif
|
||||
display_Update();
|
||||
|
||||
@ -553,11 +554,11 @@ void setMapper_INTV() {
|
||||
println_Msg(intvmapselect);
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to Change"));
|
||||
println_Msg(F("and right to Select"));
|
||||
print_STR(press_to_change_STR, 1);
|
||||
print_STR(right_to_select_STR, 1);
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to Change"));
|
||||
println_Msg(F("Press to Select"));
|
||||
print_STR(rotate_to_change_STR, 1);
|
||||
print_STR(press_to_select_STR, 1);
|
||||
#endif
|
||||
display_Update();
|
||||
}
|
||||
@ -575,11 +576,11 @@ void setMapper_INTV() {
|
||||
println_Msg(intvmapselect);
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to Change"));
|
||||
println_Msg(F("and right to Select"));
|
||||
print_STR(press_to_change_STR, 1);
|
||||
print_STR(right_to_select_STR, 1);
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to Change"));
|
||||
println_Msg(F("Press to Select"));
|
||||
print_STR(rotate_to_change_STR, 1);
|
||||
print_STR(press_to_select_STR, 1);
|
||||
#endif
|
||||
display_Update();
|
||||
}
|
||||
@ -647,11 +648,11 @@ void setROMSize_INTV() {
|
||||
println_Msg(INTV[i]);
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to Change"));
|
||||
println_Msg(F("and right to Select"));
|
||||
print_STR(press_to_change_STR, 1);
|
||||
print_STR(right_to_select_STR, 1);
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to Change"));
|
||||
println_Msg(F("Press to Select"));
|
||||
print_STR(rotate_to_change_STR, 1);
|
||||
print_STR(press_to_select_STR, 1);
|
||||
#endif
|
||||
display_Update();
|
||||
|
||||
@ -669,11 +670,11 @@ void setROMSize_INTV() {
|
||||
println_Msg(INTV[i]);
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to Change"));
|
||||
println_Msg(F("and right to Select"));
|
||||
print_STR(press_to_change_STR, 1);
|
||||
print_STR(right_to_select_STR, 1);
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to Change"));
|
||||
println_Msg(F("Press to Select"));
|
||||
print_STR(rotate_to_change_STR, 1);
|
||||
print_STR(press_to_select_STR, 1);
|
||||
#endif
|
||||
display_Update();
|
||||
}
|
||||
@ -688,11 +689,11 @@ void setROMSize_INTV() {
|
||||
println_Msg(INTV[i]);
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to Change"));
|
||||
println_Msg(F("and right to Select"));
|
||||
print_STR(press_to_change_STR, 1);
|
||||
print_STR(right_to_select_STR, 1);
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to Change"));
|
||||
println_Msg(F("Press to Select"));
|
||||
print_STR(rotate_to_change_STR, 1);
|
||||
print_STR(press_to_select_STR, 1);
|
||||
#endif
|
||||
display_Update();
|
||||
}
|
||||
@ -806,20 +807,7 @@ void setCart_INTV() {
|
||||
}
|
||||
|
||||
// Rewind one line
|
||||
for (byte count_newline = 0; count_newline < 2; count_newline++) {
|
||||
while (1) {
|
||||
if (myFile.curPosition() == 0) {
|
||||
break;
|
||||
} else if (myFile.peek() == '\n') {
|
||||
myFile.seekSet(myFile.curPosition() - 1);
|
||||
break;
|
||||
} else {
|
||||
myFile.seekSet(myFile.curPosition() - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (myFile.curPosition() != 0)
|
||||
myFile.seekSet(myFile.curPosition() + 2);
|
||||
rewind_line(myFile);
|
||||
}
|
||||
|
||||
// Display database
|
||||
@ -837,7 +825,7 @@ void setCart_INTV() {
|
||||
}
|
||||
|
||||
// Skip over semicolon
|
||||
myFile.seekSet(myFile.curPosition() + 1);
|
||||
myFile.seekCur(1);
|
||||
|
||||
// Read CRC32 of first 512 bytes
|
||||
sprintf(crc_search, "%c", myFile.read());
|
||||
@ -847,13 +835,13 @@ void setCart_INTV() {
|
||||
}
|
||||
|
||||
// Skip over semicolon
|
||||
myFile.seekSet(myFile.curPosition() + 1);
|
||||
myFile.seekCur(1);
|
||||
|
||||
// Read mapper
|
||||
intvmapper = myFile.read() - 48;
|
||||
|
||||
// Skip over semicolon
|
||||
myFile.seekSet(myFile.curPosition() + 1);
|
||||
myFile.seekCur(1);
|
||||
|
||||
// Read rom size
|
||||
// Read the next ascii character and subtract 48 to convert to decimal
|
||||
@ -867,13 +855,13 @@ void setCart_INTV() {
|
||||
}
|
||||
|
||||
// Skip over semicolon
|
||||
myFile.seekSet(myFile.curPosition() + 1);
|
||||
myFile.seekCur(1);
|
||||
|
||||
// Read SRAM size
|
||||
byte sramSize = myFile.read() - 48;
|
||||
byte sramSize __attribute__ ((unused)) = myFile.read() - 48;
|
||||
|
||||
// Skip rest of line
|
||||
myFile.seekSet(myFile.curPosition() + 2);
|
||||
myFile.seekCur(2);
|
||||
|
||||
// Skip every 3rd line
|
||||
skip_line(&myFile);
|
||||
@ -887,11 +875,11 @@ void setCart_INTV() {
|
||||
print_Msg(F("Mapper: "));
|
||||
println_Msg(intvmapper);
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to Change"));
|
||||
println_Msg(F("and right to Select"));
|
||||
print_STR(press_to_change_STR, 1);
|
||||
print_STR(right_to_select_STR, 1);
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to Change"));
|
||||
println_Msg(F("Press to Select"));
|
||||
print_STR(rotate_to_change_STR, 1);
|
||||
print_STR(press_to_select_STR, 1);
|
||||
#elif defined(SERIAL_MONITOR)
|
||||
println_Msg(F("U/D to Change"));
|
||||
println_Msg(F("Space to Select"));
|
||||
@ -910,20 +898,7 @@ void setCart_INTV() {
|
||||
|
||||
// Previous
|
||||
else if (b == 2) {
|
||||
for (byte count_newline = 0; count_newline < 7; count_newline++) {
|
||||
while (1) {
|
||||
if (myFile.curPosition() == 0) {
|
||||
break;
|
||||
} else if (myFile.peek() == '\n') {
|
||||
myFile.seekSet(myFile.curPosition() - 1);
|
||||
break;
|
||||
} else {
|
||||
myFile.seekSet(myFile.curPosition() - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (myFile.curPosition() != 0)
|
||||
myFile.seekSet(myFile.curPosition() + 2);
|
||||
rewind_line(myFile, 6);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
Variables
|
||||
*****************************************/
|
||||
unsigned long sramEnd;
|
||||
int eepSize;
|
||||
word eepSize;
|
||||
word addrhi;
|
||||
word addrlo;
|
||||
word chksum;
|
||||
@ -103,10 +103,6 @@ static unsigned long cartSizeLockon;
|
||||
static unsigned long cartSizeSonic2 = 262144;
|
||||
static word chksumLockon;
|
||||
static word chksumSonic2 = 0x0635;
|
||||
static char romNameLockon[12];
|
||||
static char id[15];
|
||||
static char idLockon[15];
|
||||
static char labelLockon[17];
|
||||
|
||||
/******************************************
|
||||
Configuration
|
||||
@ -192,8 +188,8 @@ void mdLoadConf() {
|
||||
static const char MDMenuItem1[] PROGMEM = "Game Cartridge";
|
||||
static const char MDMenuItem2[] PROGMEM = "SegaCD RamCart";
|
||||
static const char MDMenuItem3[] PROGMEM = "Flash Repro";
|
||||
static const char MDMenuItem4[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsMD[] PROGMEM = { MDMenuItem1, MDMenuItem2, MDMenuItem3, MDMenuItem4 };
|
||||
//static const char MDMenuItem4[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsMD[] PROGMEM = { MDMenuItem1, MDMenuItem2, MDMenuItem3, string_reset2 };
|
||||
|
||||
// Cart menu items
|
||||
static const char MDCartMenuItem1[] PROGMEM = "Read Rom";
|
||||
@ -202,14 +198,14 @@ static const char MDCartMenuItem3[] PROGMEM = "Write Sram";
|
||||
static const char MDCartMenuItem4[] PROGMEM = "Read EEPROM";
|
||||
static const char MDCartMenuItem5[] PROGMEM = "Write EEPROM";
|
||||
static const char MDCartMenuItem6[] PROGMEM = "Cycle cart";
|
||||
static const char MDCartMenuItem7[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsMDCart[] PROGMEM = { MDCartMenuItem1, MDCartMenuItem2, MDCartMenuItem3, MDCartMenuItem4, MDCartMenuItem5, MDCartMenuItem6, MDCartMenuItem7 };
|
||||
//static const char MDCartMenuItem7[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsMDCart[] PROGMEM = { MDCartMenuItem1, MDCartMenuItem2, MDCartMenuItem3, MDCartMenuItem4, MDCartMenuItem5, MDCartMenuItem6, string_reset2 };
|
||||
|
||||
// Sega CD Ram Backup Cartridge menu items
|
||||
static const char SCDMenuItem1[] PROGMEM = "Read Backup RAM";
|
||||
static const char SCDMenuItem2[] PROGMEM = "Write Backup RAM";
|
||||
static const char SCDMenuItem3[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsSCD[] PROGMEM = { SCDMenuItem1, SCDMenuItem2, SCDMenuItem3 };
|
||||
//static const char SCDMenuItem3[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsSCD[] PROGMEM = { SCDMenuItem1, SCDMenuItem2, string_reset2 };
|
||||
|
||||
// Sega start menu
|
||||
void mdMenu() {
|
||||
@ -254,8 +250,8 @@ void mdMenu() {
|
||||
idFlash_MD();
|
||||
resetFlash_MD();
|
||||
print_Msg(F("Flash ID: "));
|
||||
println_Msg(flashid);
|
||||
if (strcmp(flashid, "C2F1") == 0) {
|
||||
println_Msg(flashid_str);
|
||||
if (flashid == 0xC2F1) {
|
||||
println_Msg(F("MX29F1610 detected"));
|
||||
flashSize = 2097152;
|
||||
} else {
|
||||
@ -275,7 +271,8 @@ void mdMenu() {
|
||||
// Set CS(PH3) HIGH
|
||||
PORTH |= (1 << 3);
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
break;
|
||||
@ -350,10 +347,10 @@ void mdCartMenu() {
|
||||
println_Msg(F("Sram verified OK"));
|
||||
display_Update();
|
||||
} else {
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(writeErrors);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
} else {
|
||||
print_Error(F("Cart has no Sram"), false);
|
||||
@ -400,7 +397,8 @@ void mdCartMenu() {
|
||||
resetArduino();
|
||||
break;
|
||||
}
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
@ -441,7 +439,8 @@ void segaCDMenu() {
|
||||
break;
|
||||
}
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
@ -668,6 +667,23 @@ void dataIn_MD() {
|
||||
/******************************************
|
||||
MEGA DRIVE functions
|
||||
*****************************************/
|
||||
byte copyToRomName_MD(char *output, const byte *input, byte length) {
|
||||
byte myLength = 0;
|
||||
|
||||
for (byte i = 0; i < 48; i++) {
|
||||
if (
|
||||
(
|
||||
(input[i] >= '0' && input[i] <= '9') ||
|
||||
(input[i] >= 'A' && input[i] <= 'z')
|
||||
) && myLength < length
|
||||
) {
|
||||
output[myLength++] = input[i];
|
||||
}
|
||||
}
|
||||
|
||||
return myLength;
|
||||
}
|
||||
|
||||
void getCartInfo_MD() {
|
||||
// Set control
|
||||
dataIn_MD();
|
||||
@ -706,6 +722,7 @@ void getCartInfo_MD() {
|
||||
// Sonic & Knuckles Check
|
||||
SnKmode = 0;
|
||||
if (chksum == 0xDFB3) {
|
||||
char id[15];
|
||||
|
||||
// Get ID
|
||||
for (byte c = 0; c < 14; c += 2) {
|
||||
@ -715,15 +732,13 @@ void getCartInfo_MD() {
|
||||
byte hiByte = myWord >> 8;
|
||||
|
||||
// write to buffer
|
||||
sdBuffer[c] = hiByte;
|
||||
sdBuffer[c + 1] = loByte;
|
||||
}
|
||||
for (int i = 0; i < 14; i++) {
|
||||
id[i] = char(sdBuffer[i]);
|
||||
id[c] = hiByte;
|
||||
id[c + 1] = loByte;
|
||||
}
|
||||
|
||||
//Sonic & Knuckles ID:GM MK-1563 -00
|
||||
if (!strcmp("GM MK-1563 -00", id)) {
|
||||
char labelLockon[17];
|
||||
|
||||
// Get labelLockon
|
||||
for (byte c = 0; c < 16; c += 2) {
|
||||
@ -733,15 +748,13 @@ void getCartInfo_MD() {
|
||||
byte hiByte = myWord >> 8;
|
||||
|
||||
// write to buffer
|
||||
sdBuffer[c] = hiByte;
|
||||
sdBuffer[c + 1] = loByte;
|
||||
}
|
||||
for (int i = 0; i < 16; i++) {
|
||||
labelLockon[i] = char(sdBuffer[i]);
|
||||
labelLockon[c] = hiByte;
|
||||
labelLockon[c + 1] = loByte;
|
||||
}
|
||||
|
||||
// check Lock-on game presence
|
||||
if (!(strcmp("SEGA MEGA DRIVE ", labelLockon) & strcmp("SEGA GENESIS ", labelLockon))) {
|
||||
char idLockon[15];
|
||||
|
||||
// Lock-on cart checksum
|
||||
chksumLockon = readWord_MD(0x1000C7);
|
||||
@ -756,11 +769,8 @@ void getCartInfo_MD() {
|
||||
byte hiByte = myWord >> 8;
|
||||
|
||||
// write to buffer
|
||||
sdBuffer[c] = hiByte;
|
||||
sdBuffer[c + 1] = loByte;
|
||||
}
|
||||
for (int i = 0; i < 14; i++) {
|
||||
idLockon[i] = char(sdBuffer[i]);
|
||||
idLockon[c] = hiByte;
|
||||
idLockon[c + 1] = loByte;
|
||||
}
|
||||
|
||||
if (!(strncmp("GM 00001009-0", idLockon, 13) & strncmp("GM 00004049-0", idLockon, 13))) {
|
||||
@ -965,16 +975,11 @@ void getCartInfo_MD() {
|
||||
sdBuffer[c] = hiByte;
|
||||
sdBuffer[c + 1] = loByte;
|
||||
}
|
||||
byte myLength = 0;
|
||||
for (unsigned int i = 0; i < 48; i++) {
|
||||
if (((char(sdBuffer[i]) >= 48 && char(sdBuffer[i]) <= 57) || (char(sdBuffer[i]) >= 65 && char(sdBuffer[i]) <= 122)) && myLength < 15) {
|
||||
romName[myLength] = char(sdBuffer[i]);
|
||||
myLength++;
|
||||
}
|
||||
}
|
||||
romName[copyToRomName_MD(romName, sdBuffer, sizeof(romName) - 1)] = 0;
|
||||
|
||||
//Get Lock-on cart name
|
||||
if (SnKmode >= 2) {
|
||||
char romNameLockon[12];
|
||||
|
||||
//Change romName
|
||||
strcpy(romName, "SnK_");
|
||||
@ -989,13 +994,7 @@ void getCartInfo_MD() {
|
||||
sdBuffer[c] = hiByte;
|
||||
sdBuffer[c + 1] = loByte;
|
||||
}
|
||||
byte myLength = 0;
|
||||
for (unsigned int i = 0; i < 48; i++) {
|
||||
if (((char(sdBuffer[i]) >= 48 && char(sdBuffer[i]) <= 57) || (char(sdBuffer[i]) >= 65 && char(sdBuffer[i]) <= 122)) && myLength < 11) {
|
||||
romNameLockon[myLength] = char(sdBuffer[i]);
|
||||
myLength++;
|
||||
}
|
||||
}
|
||||
romNameLockon[copyToRomName_MD(romNameLockon, sdBuffer, sizeof(romNameLockon) - 1)] = 0;
|
||||
|
||||
switch (SnKmode) {
|
||||
case 2: strcat(romName, "SONIC1"); break;
|
||||
@ -1082,7 +1081,8 @@ void getCartInfo_MD() {
|
||||
|
||||
// Wait for user input
|
||||
#if (defined(enable_LCD) || defined(enable_OLED))
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
#endif
|
||||
@ -1155,7 +1155,7 @@ void readROM_MD() {
|
||||
sd.chdir(folder);
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("Saving to "));
|
||||
print_STR(saving_to_STR, 0);
|
||||
print_Msg(folder);
|
||||
println_Msg(F("/..."));
|
||||
display_Update();
|
||||
@ -1166,16 +1166,16 @@ void readROM_MD() {
|
||||
|
||||
// Open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
|
||||
byte buffer[1024] = { 0 };
|
||||
|
||||
// get current time
|
||||
unsigned long startTime = millis();
|
||||
// unsigned long startTime = millis();
|
||||
|
||||
// Phantasy Star/Beyond Oasis with 74HC74 and 74HC139 switch ROM/SRAM at address 0x200000
|
||||
if (0x200000 < cartSize < 0x400000) {
|
||||
if (0x200000 < cartSize && cartSize < 0x400000) {
|
||||
enableSram_MD(0);
|
||||
}
|
||||
|
||||
@ -1489,10 +1489,10 @@ void writeSram_MD() {
|
||||
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
println_Msg(F("Done"));
|
||||
print_STR(done_STR, 1);
|
||||
display_Update();
|
||||
} else {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
dataIn_MD();
|
||||
}
|
||||
@ -1517,7 +1517,7 @@ void readSram_MD() {
|
||||
|
||||
// Open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
|
||||
for (unsigned long currBuffer = sramBase; currBuffer < sramBase + sramSize; currBuffer += 256) {
|
||||
@ -1557,7 +1557,7 @@ void readSram_MD() {
|
||||
}
|
||||
unsigned long padsize = (1UL << 16) - (sramSize << 1);
|
||||
unsigned long padblockcount = padsize >> 9; // number of 512 byte blocks
|
||||
for (int i = 0; i < padblockcount; i++) {
|
||||
for (unsigned long i = 0; i < padblockcount; i++) {
|
||||
myFile.write(sdBuffer, 512);
|
||||
}
|
||||
}
|
||||
@ -1611,7 +1611,7 @@ unsigned long verifySram_MD() {
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
} else {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
// Return 0 if verified ok, or number of errors
|
||||
return writeErrors;
|
||||
@ -1637,7 +1637,7 @@ void resetFlash_MD() {
|
||||
void write29F1610_MD() {
|
||||
// Create filepath
|
||||
sprintf(filePath, "%s/%s", filePath, fileName);
|
||||
print_Msg(F("Flashing file "));
|
||||
print_STR(flashing_file_STR, 0);
|
||||
print_Msg(filePath);
|
||||
println_Msg(F("..."));
|
||||
display_Update();
|
||||
@ -1647,7 +1647,7 @@ void write29F1610_MD() {
|
||||
// Get rom size from file
|
||||
fileSize = myFile.fileSize();
|
||||
if (fileSize > flashSize) {
|
||||
print_Error(F("File size exceeds flash size."), true);
|
||||
print_Error(file_too_big_STR, true);
|
||||
}
|
||||
// Set data pins to output
|
||||
dataOut_MD();
|
||||
@ -1686,7 +1686,7 @@ void write29F1610_MD() {
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
} else {
|
||||
println_Msg(F("Can't open file"));
|
||||
print_STR(open_file_STR, 1);
|
||||
display_Update();
|
||||
}
|
||||
}
|
||||
@ -1704,7 +1704,9 @@ void idFlash_MD() {
|
||||
dataIn_MD();
|
||||
|
||||
// Read the two id bytes into a string
|
||||
sprintf(flashid, "%02X%02X", readFlash_MD(0) & 0xFF, readFlash_MD(1) & 0xFF);
|
||||
flashid = (readFlash_MD(0) & 0xFF) << 8;
|
||||
flashid |= readFlash_MD(1) & 0xFF;
|
||||
sprintf(flashid_str, "%04X", flashid);
|
||||
}
|
||||
|
||||
byte readStatusReg_MD() {
|
||||
@ -1764,7 +1766,7 @@ void verifyFlash_MD() {
|
||||
// Get rom size from file
|
||||
fileSize = myFile.fileSize();
|
||||
if (fileSize > flashSize) {
|
||||
print_Error(F("File size exceeds flash size."), true);
|
||||
print_Error(file_too_big_STR, true);
|
||||
}
|
||||
|
||||
blank = 0;
|
||||
@ -1789,15 +1791,15 @@ void verifyFlash_MD() {
|
||||
println_Msg(F("Flashrom verified OK"));
|
||||
display_Update();
|
||||
} else {
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(blank);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
} else {
|
||||
println_Msg(F("Can't open file"));
|
||||
print_STR(open_file_STR, 1);
|
||||
display_Update();
|
||||
}
|
||||
}
|
||||
@ -2382,7 +2384,7 @@ void readEEP_MD() {
|
||||
|
||||
// Open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
if (eepSize > 0x100) { // 24C04+
|
||||
for (word currByte = 0; currByte < eepSize; currByte += 256) {
|
||||
@ -2448,10 +2450,10 @@ void writeEEP_MD() {
|
||||
myFile.close();
|
||||
println_Msg(F(""));
|
||||
display_Clear();
|
||||
println_Msg(F("Done"));
|
||||
print_STR(done_STR, 1);
|
||||
display_Update();
|
||||
} else {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
dataIn_MD();
|
||||
}
|
||||
@ -2481,7 +2483,7 @@ void readBram_MD() {
|
||||
|
||||
// Open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
|
||||
for (unsigned long currByte = 0; currByte < bramSize; currByte += 512) {
|
||||
@ -2527,10 +2529,10 @@ void writeBram_MD() {
|
||||
myFile.close();
|
||||
println_Msg(F(""));
|
||||
display_Clear();
|
||||
println_Msg(F("Done"));
|
||||
print_STR(done_STR, 1);
|
||||
display_Update();
|
||||
} else {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
dataIn_MD();
|
||||
}
|
||||
@ -2568,7 +2570,7 @@ void readRealtec_MD() {
|
||||
sd.chdir(folder);
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("Saving to "));
|
||||
print_STR(saving_to_STR, 0);
|
||||
print_Msg(folder);
|
||||
println_Msg(F("/..."));
|
||||
display_Update();
|
||||
@ -2579,7 +2581,7 @@ void readRealtec_MD() {
|
||||
|
||||
// Open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
|
||||
// Realtec Registers
|
||||
|
@ -58,30 +58,30 @@ static const char n64MenuItem1[] PROGMEM = "Game Cartridge";
|
||||
static const char n64MenuItem2[] PROGMEM = "Controller";
|
||||
static const char n64MenuItem3[] PROGMEM = "Flash Repro";
|
||||
static const char n64MenuItem4[] PROGMEM = "Flash Gameshark";
|
||||
static const char n64MenuItem5[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsN64[] PROGMEM = { n64MenuItem1, n64MenuItem2, n64MenuItem3, n64MenuItem4, n64MenuItem5 };
|
||||
//static const char n64MenuItem5[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsN64[] PROGMEM = { n64MenuItem1, n64MenuItem2, n64MenuItem3, n64MenuItem4, string_reset2 };
|
||||
|
||||
// N64 controller menu items
|
||||
static const char N64ContMenuItem1[] PROGMEM = "Test Controller";
|
||||
static const char N64ContMenuItem2[] PROGMEM = "Read ControllerPak";
|
||||
static const char N64ContMenuItem3[] PROGMEM = "Write ControllerPak";
|
||||
static const char N64ContMenuItem4[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsN64Controller[] PROGMEM = { N64ContMenuItem1, N64ContMenuItem2, N64ContMenuItem3, N64ContMenuItem4 };
|
||||
//static const char N64ContMenuItem4[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsN64Controller[] PROGMEM = { N64ContMenuItem1, N64ContMenuItem2, N64ContMenuItem3, string_reset2 };
|
||||
|
||||
// N64 cart menu items
|
||||
static const char N64CartMenuItem1[] PROGMEM = "Read ROM";
|
||||
static const char N64CartMenuItem2[] PROGMEM = "Read Save";
|
||||
static const char N64CartMenuItem3[] PROGMEM = "Write Save";
|
||||
static const char N64CartMenuItem4[] PROGMEM = "Force Savetype";
|
||||
static const char N64CartMenuItem5[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsN64Cart[] PROGMEM = { N64CartMenuItem1, N64CartMenuItem2, N64CartMenuItem3, N64CartMenuItem4, N64CartMenuItem5 };
|
||||
//static const char N64CartMenuItem5[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsN64Cart[] PROGMEM = { N64CartMenuItem1, N64CartMenuItem2, N64CartMenuItem3, N64CartMenuItem4, string_reset2 };
|
||||
|
||||
// N64 CRC32 error menu items
|
||||
static const char N64CRCMenuItem1[] PROGMEM = "No";
|
||||
static const char N64CRCMenuItem2[] PROGMEM = "Yes and keep old";
|
||||
static const char N64CRCMenuItem3[] PROGMEM = "Yes and delete old";
|
||||
static const char N64CRCMenuItem4[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsN64CRC[] PROGMEM = { N64CRCMenuItem1, N64CRCMenuItem2, N64CRCMenuItem3, N64CRCMenuItem4 };
|
||||
//static const char N64CRCMenuItem4[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsN64CRC[] PROGMEM = { N64CRCMenuItem1, N64CRCMenuItem2, N64CRCMenuItem3, string_reset2 };
|
||||
|
||||
// Rom menu
|
||||
static const char N64RomItem1[] PROGMEM = "4 MB";
|
||||
@ -194,7 +194,8 @@ void n64ControllerMenu() {
|
||||
verifyCRC();
|
||||
validateMPK();
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
break;
|
||||
@ -215,7 +216,8 @@ void n64ControllerMenu() {
|
||||
delay(500);
|
||||
verifyMPK();
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
break;
|
||||
@ -266,7 +268,8 @@ void n64CartMenu() {
|
||||
print_Error(F("Savetype Error"), false);
|
||||
}
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
break;
|
||||
@ -285,10 +288,10 @@ void n64CartMenu() {
|
||||
println_Msg(F("SRAM verified OK"));
|
||||
display_Update();
|
||||
} else {
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(writeErrors);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
} else if (saveType == 4) {
|
||||
// Launch file browser
|
||||
@ -296,7 +299,7 @@ void n64CartMenu() {
|
||||
display_Clear();
|
||||
getFramType();
|
||||
writeFram(flashramType);
|
||||
print_Msg(F("Verifying..."));
|
||||
print_STR(verifying_STR, 0);
|
||||
display_Update();
|
||||
writeErrors = verifyFram(flashramType);
|
||||
if (writeErrors == 0) {
|
||||
@ -304,10 +307,10 @@ void n64CartMenu() {
|
||||
display_Update();
|
||||
} else {
|
||||
println_Msg("");
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(writeErrors);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
} else if ((saveType == 5) || (saveType == 6)) {
|
||||
// Launch file browser
|
||||
@ -326,16 +329,17 @@ void n64CartMenu() {
|
||||
println_Msg(F("EEPROM verified OK"));
|
||||
display_Update();
|
||||
} else {
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(writeErrors);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
} else {
|
||||
display_Clear();
|
||||
print_Error(F("Save Type Error"), false);
|
||||
}
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
break;
|
||||
@ -977,7 +981,6 @@ void controllerTest_Display() {
|
||||
// Graph
|
||||
int xax = 24; // midpoint x
|
||||
int yax = 24; // midpoint y
|
||||
int zax = 24; // size
|
||||
|
||||
// variables to display test data of different sticks
|
||||
int upx = 0;
|
||||
@ -1611,12 +1614,12 @@ void readMPK() {
|
||||
strcat(filePath, ".crc");
|
||||
FsFile crcFile;
|
||||
if (!crcFile.open(filePath, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("Can't open file on SD"), true);
|
||||
print_Error(open_file_STR, true);
|
||||
}
|
||||
|
||||
//open mpk file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("Can't open file on SD"), true);
|
||||
print_Error(open_file_STR, true);
|
||||
}
|
||||
|
||||
print_Msg(F("Saving N64/MPK/"));
|
||||
@ -1669,18 +1672,18 @@ void readMPK() {
|
||||
void verifyCRC() {
|
||||
writeErrors = 0;
|
||||
|
||||
println_Msg(F("Verifying..."));
|
||||
print_STR(verifying_STR, 1);
|
||||
display_Update();
|
||||
|
||||
//open CRC file on sd card
|
||||
FsFile crcFile;
|
||||
if (!crcFile.open(filePath, O_READ)) {
|
||||
print_Error(F("Can't open file on SD"), true);
|
||||
print_Error(open_file_STR, true);
|
||||
}
|
||||
|
||||
//open MPK file on sd card
|
||||
if (!myFile.open(fileName, O_READ)) {
|
||||
print_Error(F("Can't open file on SD"), true);
|
||||
print_Error(open_file_STR, true);
|
||||
}
|
||||
|
||||
//Initialize progress bar
|
||||
@ -1715,35 +1718,31 @@ void verifyCRC() {
|
||||
sd.remove(filePath);
|
||||
display_Update();
|
||||
} else {
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(writeErrors);
|
||||
println_Msg(F(" blocks "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
}
|
||||
|
||||
// Calculates the checksum of the header
|
||||
boolean checkHeader(byte startAddress) {
|
||||
boolean checkHeader(byte *buf) {
|
||||
word sum = 0;
|
||||
word buf_sum = (buf[28] << 8) + buf[29];
|
||||
|
||||
// first 28 bytes are the header, then comes the checksum(word) followed by the reverse checksum(0xFFF2 - checksum)
|
||||
for (int i = 0; i < 28; i += 2) {
|
||||
word tempword = (((sdBuffer[startAddress + i] & 0xFF) << 8) | (sdBuffer[startAddress + i + 1] & 0xFF));
|
||||
sum += tempword;
|
||||
for (byte i = 0; i < 28; i += 2) {
|
||||
sum += (buf[i] << 8) + buf[i + 1];
|
||||
}
|
||||
|
||||
if ((((sdBuffer[startAddress + 28] & 0xFF) << 8) | (sdBuffer[startAddress + 29] & 0xFF)) != (sum & 0xFFFF)) {
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
return sum == buf_sum;
|
||||
}
|
||||
|
||||
// verifies if Controller Pak holds valid header data
|
||||
void validateMPK() {
|
||||
//open file on sd card
|
||||
if (!myFile.open(fileName, O_READ)) {
|
||||
print_Error(F("Can't open file"), true);
|
||||
print_Error(open_file_STR, true);
|
||||
}
|
||||
|
||||
// Read first 256 byte which contains the header including checksum and reverse checksum and three copies of it
|
||||
@ -1751,13 +1750,13 @@ void validateMPK() {
|
||||
|
||||
//Check all four header copies
|
||||
writeErrors = 0;
|
||||
if (!checkHeader(0x20))
|
||||
if (!checkHeader(&sdBuffer[0x20]))
|
||||
writeErrors++;
|
||||
if (!checkHeader(0x60))
|
||||
if (!checkHeader(&sdBuffer[0x60]))
|
||||
writeErrors++;
|
||||
if (!checkHeader(0x80))
|
||||
if (!checkHeader(&sdBuffer[0x80]))
|
||||
writeErrors++;
|
||||
if (!checkHeader(0xC0))
|
||||
if (!checkHeader(&sdBuffer[0xC0]))
|
||||
writeErrors++;
|
||||
|
||||
print_Msg(F("HDR: "));
|
||||
@ -1856,7 +1855,7 @@ void writeMPK() {
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
} else {
|
||||
print_Error(F("Can't open file on SD"), true);
|
||||
print_Error(open_file_STR, true);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1864,12 +1863,12 @@ void writeMPK() {
|
||||
void verifyMPK() {
|
||||
writeErrors = 0;
|
||||
|
||||
println_Msg(F("Verifying..."));
|
||||
print_STR(verifying_STR, 1);
|
||||
display_Update();
|
||||
|
||||
//open file on sd card
|
||||
if (!myFile.open(filePath, O_READ)) {
|
||||
print_Error(F("Can't open file on SD"), true);
|
||||
print_Error(open_file_STR, true);
|
||||
}
|
||||
|
||||
//Initialize progress bar
|
||||
@ -1911,10 +1910,10 @@ void verifyMPK() {
|
||||
println_Msg(F("Written successfully"));
|
||||
display_Update();
|
||||
} else {
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(writeErrors);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1963,7 +1962,8 @@ void printCartInfo_N64() {
|
||||
|
||||
// Wait for user input
|
||||
println_Msg(F(" "));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
} else {
|
||||
@ -1982,7 +1982,8 @@ void printCartInfo_N64() {
|
||||
strcpy(romName, "GPERROR");
|
||||
print_Error(F("Cartridge unknown"), false);
|
||||
println_Msg("");
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
|
||||
@ -2027,15 +2028,6 @@ void printCartInfo_N64() {
|
||||
}
|
||||
}
|
||||
|
||||
// improved strcmp function that ignores case to prevent checksum comparison issues
|
||||
int strcicmp(char const* a, char const* b) {
|
||||
for (;; a++, b++) {
|
||||
int d = tolower((unsigned char)*a) - tolower((unsigned char)*b);
|
||||
if (d != 0 || !*a)
|
||||
return d;
|
||||
}
|
||||
}
|
||||
|
||||
/* look-up the calculated crc in the file n64.txt on sd card
|
||||
boolean searchCRC(char crcStr[9]) {
|
||||
boolean result = 0;
|
||||
@ -2057,9 +2049,9 @@ int strcicmp(char const* a, char const* b) {
|
||||
}
|
||||
|
||||
// Check if string is a match
|
||||
if (strcicmp(tempStr1, crcStr) == 0) {
|
||||
if (strcasecmp(tempStr1, crcStr) == 0) {
|
||||
// Skip the , in the file
|
||||
myFile.seekSet(myFile.curPosition() + 1);
|
||||
myFile.seekCur(1);
|
||||
|
||||
// Read 4 bytes into String, do it one at a time so byte order doesn't get mixed up
|
||||
sprintf(tempStr, "%c", myFile.read());
|
||||
@ -2079,7 +2071,7 @@ int strcicmp(char const* a, char const* b) {
|
||||
}
|
||||
// If no match, empty string, advance by 12 and try again
|
||||
else {
|
||||
myFile.seekSet(myFile.curPosition() + 12);
|
||||
myFile.seekCur(12);
|
||||
}
|
||||
}
|
||||
// Close the file:
|
||||
@ -2114,7 +2106,7 @@ void getCartInfo_N64() {
|
||||
skip_line(&myFile);
|
||||
|
||||
// Skip over the CRC32 checksum
|
||||
myFile.seekSet(myFile.curPosition() + 9);
|
||||
myFile.seekCur(9);
|
||||
|
||||
// Read 8 bytes into String, do it one at a time so byte order doesn't get mixed up
|
||||
sprintf(tempStr, "%c", myFile.read());
|
||||
@ -2126,7 +2118,7 @@ void getCartInfo_N64() {
|
||||
// Check if string is a match
|
||||
if (strcmp(tempStr, checksumStr) == 0) {
|
||||
// Skip the , in the file
|
||||
myFile.seekSet(myFile.curPosition() + 1);
|
||||
myFile.seekCur(1);
|
||||
|
||||
// Read the next ascii character and subtract 48 to convert to decimal
|
||||
cartSize = myFile.read() - 48;
|
||||
@ -2138,7 +2130,7 @@ void getCartInfo_N64() {
|
||||
}
|
||||
|
||||
// Skip the , in the file
|
||||
myFile.seekSet(myFile.curPosition() + 1);
|
||||
myFile.seekCur(1);
|
||||
|
||||
// Read the next ascii character and subtract 48 to convert to decimal
|
||||
saveType = myFile.read() - 48;
|
||||
@ -2149,7 +2141,7 @@ void getCartInfo_N64() {
|
||||
// If no match skip to next entry
|
||||
else {
|
||||
// skip rest of line
|
||||
myFile.seekSet(myFile.curPosition() + 7);
|
||||
myFile.seekCur(7);
|
||||
// skip third empty line
|
||||
skip_line(&myFile);
|
||||
}
|
||||
@ -2189,33 +2181,9 @@ void idCart() {
|
||||
// Get rom version
|
||||
romVersion = sdBuffer[0x3F];
|
||||
|
||||
// Get name
|
||||
byte myByte = 0;
|
||||
byte myLength = 0;
|
||||
for (unsigned int i = 0; i < 20; i++) {
|
||||
myByte = sdBuffer[0x20 + i];
|
||||
if (isprint(myByte) && myByte != '<' && myByte != '>' && myByte != ':' && myByte != '"' && myByte != '/' && myByte != '\\' && myByte != '|' && myByte != '?' && myByte != '*') {
|
||||
romName[myLength] = char(myByte);
|
||||
} else {
|
||||
if (romName[myLength - 1] == 0x5F) myLength--;
|
||||
romName[myLength] = 0x5F;
|
||||
}
|
||||
myLength++;
|
||||
}
|
||||
|
||||
// Strip trailing white space
|
||||
for (unsigned int i = myLength - 1; i > 0; i--) {
|
||||
if ((romName[i] != 0x5F) && (romName[i] != 0x20)) break;
|
||||
romName[i] = 0x00;
|
||||
myLength--;
|
||||
}
|
||||
|
||||
// If name consists out of all japanese characters use cart id
|
||||
if (myLength == 0) {
|
||||
romName[0] = sdBuffer[0x3B];
|
||||
romName[1] = sdBuffer[0x3C];
|
||||
romName[2] = sdBuffer[0x3D];
|
||||
romName[3] = sdBuffer[0x3E];
|
||||
if (buildRomName(romName, &sdBuffer[0x20], 20) == 0) {
|
||||
strcpy(romName, cartID);
|
||||
}
|
||||
|
||||
#ifdef savesummarytotxt
|
||||
@ -2344,11 +2312,11 @@ void writeEeprom_CLK() {
|
||||
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
println_Msg(F("Done"));
|
||||
print_STR(done_STR, 1);
|
||||
display_Update();
|
||||
delay(600);
|
||||
} else {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
} else {
|
||||
print_Error(F("Savetype Error"), true);
|
||||
@ -2378,7 +2346,7 @@ void readEeprom_CLK() {
|
||||
|
||||
// Open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
}
|
||||
|
||||
for (byte i = 0; i < (eepPages / 64); i++) {
|
||||
@ -2481,12 +2449,13 @@ unsigned long verifyEeprom_CLK() {
|
||||
} else {
|
||||
// SD Error
|
||||
writeErrors = 999999;
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
// Return 0 if verified ok, or number of errors
|
||||
return writeErrors;
|
||||
} else {
|
||||
print_Error(F("Savetype Error"), true);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2713,11 +2682,11 @@ void writeEeprom() {
|
||||
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
println_Msg(F("Done"));
|
||||
print_STR(done_STR, 1);
|
||||
display_Update();
|
||||
delay(600);
|
||||
} else {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
} else {
|
||||
print_Error(F("Savetype Error"), true);
|
||||
@ -2743,7 +2712,7 @@ void readEeprom() {
|
||||
|
||||
// Open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
}
|
||||
|
||||
for (byte i = 0; i < (eepPages / 64); i++) {
|
||||
@ -2847,12 +2816,13 @@ unsigned long verifyEeprom() {
|
||||
} else {
|
||||
// SD Error
|
||||
writeErrors = 999999;
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
// Return 0 if verified ok, or number of errors
|
||||
return writeErrors;
|
||||
} else {
|
||||
print_Error(F("Savetype Error"), true);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2888,10 +2858,10 @@ void writeSram(unsigned long sramSize) {
|
||||
}
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
println_Msg(F("Done"));
|
||||
print_STR(done_STR, 1);
|
||||
display_Update();
|
||||
} else {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
|
||||
} else {
|
||||
@ -2931,7 +2901,7 @@ void readSram(unsigned long sramSize, byte flashramType) {
|
||||
|
||||
// Open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
|
||||
for (unsigned long currByte = sramBase; currByte < (sramBase + (sramSize / flashramType)); currByte += offset) {
|
||||
@ -2994,7 +2964,7 @@ unsigned long verifySram(unsigned long sramSize, byte flashramType) {
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
} else {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
// Return 0 if verified ok, or number of errors
|
||||
return writeErrors;
|
||||
@ -3100,7 +3070,7 @@ void writeFram(byte flashramType) {
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
} else {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
} else {
|
||||
print_Error(F("Savetype Error"), true);
|
||||
@ -3327,7 +3297,7 @@ redumpnewfolder:
|
||||
sd.chdir(folder);
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("Saving to "));
|
||||
print_STR(saving_to_STR, 0);
|
||||
print_Msg(folder);
|
||||
println_Msg(F("/..."));
|
||||
display_Update();
|
||||
@ -3339,7 +3309,7 @@ redumpnewfolder:
|
||||
redumpsamefolder:
|
||||
// Open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
|
||||
// dumping rom slow
|
||||
@ -3385,8 +3355,6 @@ redumpsamefolder:
|
||||
|
||||
// prepare crc32
|
||||
uint32_t oldcrc32 = 0xFFFFFFFF;
|
||||
uint32_t tab_value = 0;
|
||||
uint8_t idx = 0;
|
||||
|
||||
// run combined dumper + crc32 routine for better performance, as N64 ROMs are quite large for an 8bit micro
|
||||
// currently dumps + checksums a 32MB cart in 170 seconds (down from 347 seconds)
|
||||
@ -3418,12 +3386,8 @@ redumpsamefolder:
|
||||
PORTH |= (1 << 6);
|
||||
|
||||
// crc32 update
|
||||
idx = ((oldcrc32) ^ (buffer[c]));
|
||||
tab_value = pgm_read_dword(crc_32_tab + idx);
|
||||
oldcrc32 = tab_value ^ ((oldcrc32) >> 8);
|
||||
idx = ((oldcrc32) ^ (buffer[c + 1]));
|
||||
tab_value = pgm_read_dword(crc_32_tab + idx);
|
||||
oldcrc32 = tab_value ^ ((oldcrc32) >> 8);
|
||||
UPDATE_CRC(oldcrc32, buffer[c]);
|
||||
UPDATE_CRC(oldcrc32, buffer[c + 1]);
|
||||
}
|
||||
|
||||
// Set the address for the next 512 bytes to dump
|
||||
@ -3449,12 +3413,8 @@ redumpsamefolder:
|
||||
PORTH |= (1 << 6);
|
||||
|
||||
// crc32 update
|
||||
idx = ((oldcrc32) ^ (buffer[c])) & 0xff;
|
||||
tab_value = pgm_read_dword(crc_32_tab + idx);
|
||||
oldcrc32 = tab_value ^ ((oldcrc32) >> 8);
|
||||
idx = ((oldcrc32) ^ (buffer[c + 1])) & 0xff;
|
||||
tab_value = pgm_read_dword(crc_32_tab + idx);
|
||||
oldcrc32 = tab_value ^ ((oldcrc32) >> 8);
|
||||
UPDATE_CRC(oldcrc32, buffer[c]);
|
||||
UPDATE_CRC(oldcrc32, buffer[c + 1]);
|
||||
}
|
||||
|
||||
processedProgressBar += 1024;
|
||||
@ -3478,7 +3438,8 @@ redumpsamefolder:
|
||||
print_Msg(timeElapsed); // include elapsed time
|
||||
println_Msg(F("s)"));
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// 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
|
||||
@ -3493,7 +3454,8 @@ redumpsamefolder:
|
||||
errorLvl = 1;
|
||||
setColor_RGB(255, 0, 0);
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// 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
|
||||
@ -3528,7 +3490,7 @@ redumpsamefolder:
|
||||
sd.chdir(folder);
|
||||
// Delete old file
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
if (!myFile.remove()) {
|
||||
print_Error(F("Delete Error"), true);
|
||||
@ -3554,7 +3516,7 @@ redumpsamefolder:
|
||||
void savesummary_N64(boolean checkfound, char crcStr[9], unsigned long timeElapsed) {
|
||||
// Open file on sd card
|
||||
if (!myFile.open("N64/ROM/n64log.txt", O_RDWR | O_CREAT | O_APPEND)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
|
||||
//Write the info
|
||||
@ -3631,42 +3593,42 @@ void savesummary_N64(boolean checkfound, char crcStr[9], unsigned long timeElaps
|
||||
N64 Repro Flashrom Functions
|
||||
*****************************************/
|
||||
void flashRepro_N64() {
|
||||
unsigned long sectorSize;
|
||||
byte bufferSize;
|
||||
unsigned long sectorSize = 0;
|
||||
byte bufferSize = 0;
|
||||
// Check flashrom ID's
|
||||
idFlashrom_N64();
|
||||
|
||||
// If the ID is known continue
|
||||
if (cartSize != 0) {
|
||||
// Print flashrom name
|
||||
if ((strcmp(flashid, "227E") == 0) && (strcmp(cartID, "2201") == 0)) {
|
||||
if ((flashid == 0x227E) && (strcmp(cartID, "2201") == 0)) {
|
||||
print_Msg(F("Spansion S29GL256N"));
|
||||
if (cartSize == 64)
|
||||
println_Msg(F(" x2"));
|
||||
else
|
||||
println_Msg("");
|
||||
} else if ((strcmp(flashid, "227E") == 0) && (strcmp(cartID, "2101") == 0)) {
|
||||
} else if ((flashid == 0x227E) && (strcmp(cartID, "2101") == 0)) {
|
||||
print_Msg(F("Spansion S29GL128N"));
|
||||
} else if ((strcmp(flashid, "227E") == 0) && (strcmp(cartID, "2100") == 0)) {
|
||||
} else if ((flashid == 0x227E) && (strcmp(cartID, "2100") == 0)) {
|
||||
print_Msg(F("ST M29W128GL"));
|
||||
} else if ((strcmp(flashid, "22C9") == 0) || (strcmp(flashid, "22CB") == 0)) {
|
||||
} else if ((flashid == 0x22C9) || (flashid == 0x22CB)) {
|
||||
print_Msg(F("Macronix MX29LV640"));
|
||||
if (cartSize == 16)
|
||||
println_Msg(F(" x2"));
|
||||
else
|
||||
println_Msg("");
|
||||
} else if (strcmp(flashid, "8816") == 0)
|
||||
} else if (flashid == 0x8816)
|
||||
println_Msg(F("Intel 4400L0ZDQ0"));
|
||||
else if (strcmp(flashid, "7E7E") == 0)
|
||||
else if (flashid == 0x7E7E)
|
||||
println_Msg(F("Fujitsu MSP55LV100S"));
|
||||
else if ((strcmp(flashid, "227E") == 0) && (strcmp(cartID, "2301") == 0))
|
||||
else if ((flashid == 0x227E) && (strcmp(cartID, "2301") == 0))
|
||||
println_Msg(F("Fujitsu MSP55LV512"));
|
||||
else if ((strcmp(flashid, "227E") == 0) && (strcmp(cartID, "3901") == 0))
|
||||
else if ((flashid == 0x227E) && (strcmp(cartID, "3901") == 0))
|
||||
println_Msg(F("Intel 512M29EW"));
|
||||
|
||||
// Print info
|
||||
print_Msg(F("ID: "));
|
||||
print_Msg(flashid);
|
||||
print_Msg(flashid_str);
|
||||
print_Msg(F(" Size: "));
|
||||
print_Msg(cartSize);
|
||||
println_Msg(F("MB"));
|
||||
@ -3675,7 +3637,8 @@ void flashRepro_N64() {
|
||||
println_Msg(F("Repro Cartridge."));
|
||||
println_Msg(F("Attention: Use 3.3V!"));
|
||||
println_Msg("");
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
} else {
|
||||
@ -3683,7 +3646,7 @@ void flashRepro_N64() {
|
||||
print_Msg(F("ID: "));
|
||||
print_Msg(vendorID);
|
||||
print_Msg(F(" "));
|
||||
print_Msg(flashid);
|
||||
print_Msg(flashid_str);
|
||||
print_Msg(F(" "));
|
||||
println_Msg(cartID);
|
||||
println_Msg(F(" "));
|
||||
@ -3697,7 +3660,8 @@ void flashRepro_N64() {
|
||||
|
||||
// clear IDs
|
||||
sprintf(vendorID, "%s", "CONF");
|
||||
sprintf(flashid, "%s", "CONF");
|
||||
flashid = 0;
|
||||
sprintf(flashid_str, "%s", "CONF");
|
||||
sprintf(cartID, "%s", "CONF");
|
||||
|
||||
|
||||
@ -3821,21 +3785,21 @@ void flashRepro_N64() {
|
||||
|
||||
// Compare file size to flashrom size
|
||||
if ((fileSize / 1048576) > cartSize) {
|
||||
print_Error(F("File too big"), true);
|
||||
print_Error(file_too_big_STR, true);
|
||||
}
|
||||
|
||||
// Erase needed sectors
|
||||
if (strcmp(flashid, "227E") == 0) {
|
||||
if (flashid == 0x227E) {
|
||||
// Spansion S29GL256N or Fujitsu MSP55LV512 with 0x20000 sector size and 32 byte buffer
|
||||
eraseSector_N64(0x20000);
|
||||
} else if (strcmp(flashid, "7E7E") == 0) {
|
||||
} else if (flashid == 0x7E7E) {
|
||||
// Fujitsu MSP55LV100S
|
||||
eraseMSP55LV100_N64();
|
||||
} else if ((strcmp(flashid, "8813") == 0) || (strcmp(flashid, "8816") == 0)) {
|
||||
} else if ((flashid == 0x8813) || (flashid == 0x8816)) {
|
||||
// Intel 4400L0ZDQ0
|
||||
eraseIntel4400_N64();
|
||||
resetIntel4400_N64();
|
||||
} else if ((strcmp(flashid, "22C9") == 0) || (strcmp(flashid, "22CB") == 0)) {
|
||||
} else if ((flashid == 0x22C9) || (flashid == 0x22CB)) {
|
||||
// Macronix MX29LV640, C9 is top boot and CB is bottom boot block
|
||||
eraseSector_N64(0x8000);
|
||||
} else {
|
||||
@ -3850,36 +3814,40 @@ void flashRepro_N64() {
|
||||
println_Msg(filePath);
|
||||
display_Update();
|
||||
|
||||
if ((strcmp(cartID, "3901") == 0) && (strcmp(flashid, "227E") == 0)) {
|
||||
if ((strcmp(cartID, "3901") == 0) && (flashid == 0x227E)) {
|
||||
// Intel 512M29EW(64MB) with 0x20000 sector size and 128 byte buffer
|
||||
writeFlashBuffer_N64(0x20000, 128);
|
||||
} else if ((strcmp(cartID, "2100") == 0) && (strcmp(flashid, "227E") == 0)) {
|
||||
} else if ((strcmp(cartID, "2100") == 0) && (flashid == 0x227E)) {
|
||||
// ST M29W128GH(16MB) with 0x20000 sector size and 64 byte buffer
|
||||
writeFlashBuffer_N64(0x20000, 64);
|
||||
} else if (strcmp(flashid, "227E") == 0) {
|
||||
} else if (flashid == 0x227E) {
|
||||
// Spansion S29GL128N/S29GL256N or Fujitsu MSP55LV512 with 0x20000 sector size and 32 byte buffer
|
||||
writeFlashBuffer_N64(0x20000, 32);
|
||||
} else if (strcmp(flashid, "7E7E") == 0) {
|
||||
} else if (flashid == 0x7E7E) {
|
||||
//Fujitsu MSP55LV100S
|
||||
writeMSP55LV100_N64(0x20000);
|
||||
} else if ((strcmp(flashid, "22C9") == 0) || (strcmp(flashid, "22CB") == 0)) {
|
||||
} else if ((flashid == 0x22C9) || (flashid == 0x22CB)) {
|
||||
// Macronix MX29LV640 without buffer and 0x8000 sector size
|
||||
writeFlashrom_N64(0x8000);
|
||||
} else if ((strcmp(flashid, "8813") == 0) || (strcmp(flashid, "8816") == 0)) {
|
||||
} else if ((flashid == 0x8813) || (flashid == 0x8816)) {
|
||||
// Intel 4400L0ZDQ0
|
||||
writeIntel4400_N64();
|
||||
resetIntel4400_N64();
|
||||
} else if (bufferSize == 0) {
|
||||
writeFlashrom_N64(sectorSize);
|
||||
} else if (sectorSize) {
|
||||
if (bufferSize) {
|
||||
writeFlashBuffer_N64(sectorSize, bufferSize);
|
||||
} else {
|
||||
writeFlashrom_N64(sectorSize);
|
||||
}
|
||||
} else {
|
||||
writeFlashBuffer_N64(sectorSize, bufferSize);
|
||||
print_Error(F("sectorSize not set"), true);
|
||||
}
|
||||
|
||||
// Close the file:
|
||||
myFile.close();
|
||||
|
||||
// Verify
|
||||
print_Msg(F("Verifying..."));
|
||||
print_STR(verifying_STR, 0);
|
||||
display_Update();
|
||||
writeErrors = verifyFlashrom_N64();
|
||||
if (writeErrors == 0) {
|
||||
@ -3888,7 +3856,7 @@ void flashRepro_N64() {
|
||||
} else {
|
||||
print_Msg(writeErrors);
|
||||
print_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
} else {
|
||||
// Close the file
|
||||
@ -3899,7 +3867,8 @@ void flashRepro_N64() {
|
||||
print_Error(F("Can't open file"), false);
|
||||
}
|
||||
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
display_Clear();
|
||||
@ -3946,13 +3915,14 @@ void idFlashrom_N64() {
|
||||
setAddress_N64(romBase);
|
||||
sprintf(vendorID, "%02X", readWord_N64());
|
||||
// Read 2 bytes flashrom ID
|
||||
sprintf(flashid, "%04X", readWord_N64());
|
||||
flashid = readWord_N64();
|
||||
sprintf(flashid_str, "%04X", flashid);
|
||||
// Read 2 bytes secondary flashrom ID
|
||||
setAddress_N64(romBase + 0x1C);
|
||||
sprintf(cartID, "%04X", ((readWord_N64() << 8) | (readWord_N64() & 0xFF)));
|
||||
|
||||
// Spansion S29GL256N(32MB/64MB) with either one or two flashrom chips
|
||||
if ((strcmp(cartID, "2201") == 0) && (strcmp(flashid, "227E") == 0)) {
|
||||
if ((strcmp(cartID, "2201") == 0) && (flashid == 0x227E)) {
|
||||
cartSize = 32;
|
||||
|
||||
// Reset flashrom
|
||||
@ -3981,7 +3951,7 @@ void idFlashrom_N64() {
|
||||
}
|
||||
|
||||
// Macronix MX29LV640(8MB/16MB) with either one or two flashrom chips
|
||||
else if ((strcmp(flashid, "22C9") == 0) || (strcmp(flashid, "22CB") == 0)) {
|
||||
else if ((flashid == 0x22C9) || (flashid == 0x22CB)) {
|
||||
cartSize = 8;
|
||||
|
||||
resetFlashrom_N64(romBase + 0x800000);
|
||||
@ -4009,7 +3979,7 @@ void idFlashrom_N64() {
|
||||
}
|
||||
|
||||
// Intel 4400L0ZDQ0 (64MB)
|
||||
else if (strcmp(flashid, "8816") == 0) {
|
||||
else if (flashid == 0x8816) {
|
||||
// Found first flashrom chip, set to 32MB
|
||||
cartSize = 32;
|
||||
resetIntel4400_N64();
|
||||
@ -4029,7 +3999,8 @@ void idFlashrom_N64() {
|
||||
sprintf(cartID, "%04X", readWord_N64());
|
||||
if (strcmp(cartID, "8813") == 0) {
|
||||
cartSize = 64;
|
||||
strncpy(flashid, cartID, 5);
|
||||
flashid = 0x8813;
|
||||
strncpy(flashid_str, cartID, 5);
|
||||
}
|
||||
resetIntel4400_N64();
|
||||
// Empty cartID string
|
||||
@ -4037,35 +4008,35 @@ void idFlashrom_N64() {
|
||||
}
|
||||
|
||||
//Fujitsu MSP55LV512/Spansion S29GL512N (64MB)
|
||||
else if ((strcmp(cartID, "2301") == 0) && (strcmp(flashid, "227E") == 0)) {
|
||||
else if ((strcmp(cartID, "2301") == 0) && (flashid == 0x227E)) {
|
||||
cartSize = 64;
|
||||
// Reset flashrom
|
||||
resetFlashrom_N64(romBase);
|
||||
}
|
||||
|
||||
// Spansion S29GL128N(16MB) with one flashrom chip
|
||||
else if ((strcmp(cartID, "2101") == 0) && (strcmp(flashid, "227E") == 0)) {
|
||||
else if ((strcmp(cartID, "2101") == 0) && (flashid == 0x227E)) {
|
||||
cartSize = 16;
|
||||
// Reset flashrom
|
||||
resetFlashrom_N64(romBase);
|
||||
}
|
||||
|
||||
// ST M29W128GL(16MB) with one flashrom chip
|
||||
else if ((strcmp(cartID, "2100") == 0) && (strcmp(flashid, "227E") == 0)) {
|
||||
else if ((strcmp(cartID, "2100") == 0) && (flashid == 0x227E)) {
|
||||
cartSize = 16;
|
||||
// Reset flashrom
|
||||
resetFlashrom_N64(romBase);
|
||||
}
|
||||
|
||||
// Intel 512M29EW(64MB) with one flashrom chip
|
||||
else if ((strcmp(cartID, "3901") == 0) && (strcmp(flashid, "227E") == 0)) {
|
||||
else if ((strcmp(cartID, "3901") == 0) && (flashid == 0x227E)) {
|
||||
cartSize = 64;
|
||||
// Reset flashrom
|
||||
resetFlashrom_N64(romBase);
|
||||
}
|
||||
|
||||
// Unknown 227E type
|
||||
else if (strcmp(flashid, "227E") == 0) {
|
||||
else if (flashid == 0x227E) {
|
||||
cartSize = 0;
|
||||
// Reset flashrom
|
||||
resetFlashrom_N64(romBase);
|
||||
@ -4090,10 +4061,11 @@ void idFlashrom_N64() {
|
||||
if (strcmp(cartID, "7E7E") == 0) {
|
||||
resetMSP55LV100_N64(romBase);
|
||||
cartSize = 64;
|
||||
strncpy(flashid, cartID, 5);
|
||||
flashid = 0x7E7E;
|
||||
strncpy(flashid_str, cartID, 5);
|
||||
}
|
||||
}
|
||||
if ((strcmp(flashid, "1240") == 0) && (strcmp(cartID, "1240") == 0)) {
|
||||
if ((flashid == 0x1240) && (strcmp(cartID, "1240") == 0)) {
|
||||
print_Error(F("Please reseat cartridge"), true);
|
||||
}
|
||||
}
|
||||
@ -4298,12 +4270,12 @@ void eraseSector_N64(unsigned long sectorSize) {
|
||||
blinkLED();
|
||||
|
||||
// Spansion S29GL256N(32MB/64MB) with two flashrom chips
|
||||
if ((currSector == 0x2000000) && (strcmp(cartID, "2201") == 0) && (strcmp(flashid, "227E") == 0)) {
|
||||
if ((currSector == 0x2000000) && (strcmp(cartID, "2201") == 0) && (flashid == 0x227E)) {
|
||||
// Change to second chip
|
||||
flashBase = romBase + 0x2000000;
|
||||
}
|
||||
// Macronix MX29LV640(8MB/16MB) with two flashrom chips
|
||||
else if ((currSector == 0x800000) && ((strcmp(flashid, "22C9") == 0) || (strcmp(flashid, "22CB") == 0))) {
|
||||
else if ((currSector == 0x800000) && ((flashid == 0x22C9) || (flashid == 0x22CB))) {
|
||||
flashBase = romBase + 0x800000;
|
||||
}
|
||||
|
||||
@ -4493,7 +4465,7 @@ void writeFlashBuffer_N64(unsigned long sectorSize, byte bufferSize) {
|
||||
writeWord_N64((bufferSize / 2) - 1);
|
||||
|
||||
// Define variable before loop so we can use it later when reading the status register
|
||||
word currWord;
|
||||
word currWord = 0;
|
||||
|
||||
for (byte currByte = 0; currByte < bufferSize; currByte += 2) {
|
||||
// Join two bytes into one word
|
||||
@ -4598,7 +4570,7 @@ unsigned long verifyFlashrom_N64() {
|
||||
myFile.close();
|
||||
return writeErrors;
|
||||
} else {
|
||||
println_Msg(F("Can't open file"));
|
||||
print_STR(open_file_STR, 1);
|
||||
display_Update();
|
||||
return 9999;
|
||||
}
|
||||
@ -4620,14 +4592,15 @@ void flashGameshark_N64() {
|
||||
// !!!! SST 29EE010 may have a 5V requirement for writing however dumping works at 3V. As such it is not !!!!
|
||||
// !!!! advised to write to a cart with this chip until further testing can be completed. !!!!
|
||||
|
||||
if (strcmp(flashid, "0808") == 0 || strcmp(flashid, "0404") == 0 || strcmp(flashid, "3535") == 0 || strcmp(flashid, "0707") == 0) {
|
||||
if (flashid == 0x0808 || flashid == 0x0404 || flashid == 0x3535 || flashid == 0x0707) {
|
||||
backupGameshark_N64();
|
||||
println_Msg("");
|
||||
println_Msg(F("This will erase your"));
|
||||
println_Msg(F("Gameshark cartridge"));
|
||||
println_Msg(F("Attention: Use 3.3V!"));
|
||||
println_Msg(F("Power OFF if Unsure!"));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
|
||||
@ -4652,7 +4625,7 @@ void flashGameshark_N64() {
|
||||
|
||||
// Compare file size to flashrom size
|
||||
if (fileSize > 262144) {
|
||||
print_Error(F("File too big"), true);
|
||||
print_Error(file_too_big_STR, true);
|
||||
}
|
||||
|
||||
// SST 29LE010, chip erase not needed as this eeprom automaticly erases during the write cycle
|
||||
@ -4668,7 +4641,7 @@ void flashGameshark_N64() {
|
||||
myFile.close();
|
||||
|
||||
// Verify
|
||||
print_Msg(F("Verifying..."));
|
||||
print_STR(verifying_STR, 0);
|
||||
display_Update();
|
||||
writeErrors = verifyGameshark_N64();
|
||||
|
||||
@ -4682,7 +4655,7 @@ void flashGameshark_N64() {
|
||||
} else {
|
||||
print_Msg(writeErrors);
|
||||
print_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
} else {
|
||||
print_Error(F("Can't open file"), false);
|
||||
@ -4691,11 +4664,12 @@ void flashGameshark_N64() {
|
||||
// If the ID is unknown show error message
|
||||
else {
|
||||
print_Msg(F("ID: "));
|
||||
println_Msg(flashid);
|
||||
println_Msg(flashid_str);
|
||||
print_Error(F("Unknown flashrom"), false);
|
||||
}
|
||||
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
display_Clear();
|
||||
@ -4717,7 +4691,8 @@ void idGameshark_N64() {
|
||||
// Read 1 byte vendor ID
|
||||
readWord_N64();
|
||||
// Read 2 bytes flashrom ID
|
||||
sprintf(flashid, "%04X", readWord_N64());
|
||||
flashid = readWord_N64();
|
||||
sprintf(flashid_str, "%04X", flashid);
|
||||
// Reset flashrom
|
||||
resetGameshark_N64();
|
||||
}
|
||||
@ -4755,7 +4730,7 @@ void backupGameshark_N64() {
|
||||
|
||||
// Open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
|
||||
for (unsigned long currByte = romBase + 0xC00000; currByte < (romBase + 0xC00000 + 262144); currByte += 512) {
|
||||
@ -4852,7 +4827,7 @@ unsigned long verifyGameshark_N64() {
|
||||
setAddress_N64(romBase + 0xC00000 + currSector + currSdBuffer + currByte);
|
||||
// Compare both
|
||||
if (readWord_N64() != currWord) {
|
||||
if ((strcmp(flashid, "0808") == 0) && (currSector + currSdBuffer + currByte > 0x3F) && (currSector + currSdBuffer + currByte < 0x1080)) {
|
||||
if ((flashid == 0x0808) && (currSector + currSdBuffer + currByte > 0x3F) && (currSector + currSdBuffer + currByte < 0x1080)) {
|
||||
// Gameshark maps this area to the bootcode of the plugged in cartridge
|
||||
} else {
|
||||
writeErrors++;
|
||||
@ -4865,7 +4840,7 @@ unsigned long verifyGameshark_N64() {
|
||||
myFile.close();
|
||||
return writeErrors;
|
||||
} else {
|
||||
println_Msg(F("Can't open file"));
|
||||
print_STR(open_file_STR, 1);
|
||||
display_Update();
|
||||
return 9999;
|
||||
}
|
||||
@ -4875,4 +4850,4 @@ unsigned long verifyGameshark_N64() {
|
||||
|
||||
//******************************************
|
||||
// End of File
|
||||
//******************************************
|
||||
//******************************************
|
||||
|
1100
Cart_Reader/NES.ino
1100
Cart_Reader/NES.ino
File diff suppressed because it is too large
Load Diff
@ -5,8 +5,8 @@
|
||||
|
||||
static const char ngpMenuItem1[] PROGMEM = "Read Rom";
|
||||
static const char ngpMenuItem2[] PROGMEM = "Read chip info";
|
||||
static const char ngpMenuItemReset[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsNGP[] PROGMEM = { ngpMenuItem1, ngpMenuItem2, ngpMenuItemReset };
|
||||
//static const char ngpMenuItemReset[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsNGP[] PROGMEM = { ngpMenuItem1, ngpMenuItem2, string_reset2 };
|
||||
|
||||
static const char ngpRomItem1[] PROGMEM = "4 Mbits / 512 KB";
|
||||
static const char ngpRomItem2[] PROGMEM = "8 Mbits / 1 MB";
|
||||
@ -73,7 +73,8 @@ void ngpMenu() {
|
||||
}
|
||||
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
@ -169,7 +170,8 @@ void printCartInfo_NGP() {
|
||||
println_Msg(F(" Mbits"));
|
||||
}
|
||||
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
@ -206,14 +208,14 @@ void readROM_NGP(char* outPathBuf, size_t bufferSize) {
|
||||
snprintf(outPathBuf, bufferSize, "%s/%s", folder, fileName);
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("Saving to "));
|
||||
print_STR(saving_to_STR, 0);
|
||||
print_Msg(folder);
|
||||
println_Msg(F("/..."));
|
||||
display_Update();
|
||||
|
||||
// open file on sdcard
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT))
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
|
||||
// write new folder number back to EEPROM
|
||||
foldern++;
|
||||
@ -246,7 +248,6 @@ void readROM_NGP(char* outPathBuf, size_t bufferSize) {
|
||||
|
||||
void scanChip_NGP() {
|
||||
display_Clear();
|
||||
uint32_t block_addr = 0;
|
||||
|
||||
// generate name of report file
|
||||
snprintf(fileName, FILENAME_LENGTH, "%s.txt", romName);
|
||||
@ -264,7 +265,7 @@ void scanChip_NGP() {
|
||||
|
||||
// open file on sdcard
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT))
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
|
||||
// write new folder number back to EEPROM
|
||||
foldern++;
|
||||
|
@ -54,23 +54,24 @@ uint8_t tennokoe_bank_index = 0;
|
||||
static const char pceMenuItem1[] PROGMEM = "HuCARD (swapped)";
|
||||
static const char pceMenuItem2[] PROGMEM = "HuCARD(not swapped)";
|
||||
static const char pceMenuItem3[] PROGMEM = "Turbochip";
|
||||
static const char pceMenuItem4[] PROGMEM = "Reset";
|
||||
static const char *const menuOptionspce[] PROGMEM = { pceMenuItem1, pceMenuItem2, pceMenuItem3, pceMenuItem4 };
|
||||
//static const char pceMenuItem4[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char *const menuOptionspce[] PROGMEM = { pceMenuItem1, pceMenuItem2, pceMenuItem3, string_reset2 };
|
||||
|
||||
// PCE card menu items
|
||||
static const char pceCartMenuItem1[] = "Read ROM";
|
||||
static char pceCartMenuItem2[20];
|
||||
static char pceCartMenuItem3[20];
|
||||
static const char pceCartMenuItem4[] = "Reset";
|
||||
static const char pceCartMenuItem5[] = "Inc Bank Number";
|
||||
static const char pceCartMenuItem6[] = "Dec Bank Number";
|
||||
static char pceCartMenuItem7[20];
|
||||
static char menuOptionspceCart[7][20];
|
||||
static char menuOptionspceCart[7][20] = {
|
||||
"Read ROM",
|
||||
"", // Read RAM Bank %d
|
||||
"", //Write RAM Bank %d
|
||||
"Reset",
|
||||
"Inc Bank Number",
|
||||
"Dec Bank Number",
|
||||
"" // ROM size now %dK / Force ROM size
|
||||
};
|
||||
|
||||
// Turbochip menu items
|
||||
static const char pceTCMenuItem1[] PROGMEM = "Read ROM";
|
||||
static const char pceTCMenuItem2[] PROGMEM = "Reset";
|
||||
static const char *const menuOptionspceTC[] PROGMEM = { pceTCMenuItem1, pceTCMenuItem2 };
|
||||
//static const char pceTCMenuItem2[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char *const menuOptionspceTC[] PROGMEM = { pceTCMenuItem1, string_reset2 };
|
||||
|
||||
// PCE start menu
|
||||
void pcsMenu(void) {
|
||||
@ -439,9 +440,8 @@ uint32_t calculate_crc32(int n, unsigned char c[], uint32_t r) {
|
||||
return r;
|
||||
}
|
||||
|
||||
void crc_search(char *file_p, char *folder_p, uint32_t rom_size, uint32_t crc) {
|
||||
void crc_search(char *file_p, char *folder_p, uint32_t rom_size __attribute__ ((unused)), uint32_t crc) {
|
||||
FsFile rom, script;
|
||||
uint32_t r, processedsize;
|
||||
char gamename[100];
|
||||
char crc_file[9], crc_search[9];
|
||||
uint8_t flag;
|
||||
@ -518,10 +518,6 @@ void lock_tennokoe_bank_RAM() {
|
||||
}
|
||||
|
||||
void read_tennokoe_bank_PCE(int bank_index) {
|
||||
uint32_t processed_size = 0;
|
||||
uint32_t verify_loop;
|
||||
uint8_t verify_flag = 1;
|
||||
|
||||
//clear the screen
|
||||
display_Clear();
|
||||
|
||||
@ -549,7 +545,7 @@ void read_tennokoe_bank_PCE(int bank_index) {
|
||||
|
||||
//open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
}
|
||||
|
||||
pin_read_write_PCE();
|
||||
@ -688,8 +684,8 @@ void write_tennokoe_bank_PCE(int bank_index) {
|
||||
} else {
|
||||
println_Msg(F("Verify failed..."));
|
||||
print_Msg(diffcnt);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
|
||||
pin_init_PCE();
|
||||
@ -743,7 +739,7 @@ void read_rom_PCE(void) {
|
||||
|
||||
//open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
}
|
||||
|
||||
pin_read_write_PCE();
|
||||
@ -795,20 +791,13 @@ void pceMenu() {
|
||||
unsigned char mainMenu;
|
||||
|
||||
if (pce_internal_mode == HUCARD || pce_internal_mode == HUCARD_NOSWAP) {
|
||||
sprintf(pceCartMenuItem2, "Read RAM Bank %d", tennokoe_bank_index + 1);
|
||||
sprintf(pceCartMenuItem3, "Write RAM Bank %d", tennokoe_bank_index + 1);
|
||||
strcpy(menuOptionspceCart[0], pceCartMenuItem1);
|
||||
strcpy(menuOptionspceCart[1], pceCartMenuItem2);
|
||||
strcpy(menuOptionspceCart[2], pceCartMenuItem3);
|
||||
strcpy(menuOptionspceCart[3], pceCartMenuItem4);
|
||||
strcpy(menuOptionspceCart[4], pceCartMenuItem5);
|
||||
strcpy(menuOptionspceCart[5], pceCartMenuItem6);
|
||||
sprintf(menuOptionspceCart[1], "Read RAM Bank %d", tennokoe_bank_index + 1);
|
||||
sprintf(menuOptionspceCart[2], "Write RAM Bank %d", tennokoe_bank_index + 1);
|
||||
if (pce_force_rom_size > 0) {
|
||||
sprintf(pceCartMenuItem7, "ROM size now %dK", pce_force_rom_size);
|
||||
sprintf(menuOptionspceCart[6], "ROM size now %dK", pce_force_rom_size);
|
||||
} else {
|
||||
sprintf(pceCartMenuItem7, "Force ROM size");
|
||||
sprintf(menuOptionspceCart[6], "Force ROM size");
|
||||
}
|
||||
strcpy(menuOptionspceCart[6], pceCartMenuItem7);
|
||||
mainMenu = question_box(F("PCE HuCARD menu"), menuOptionspceCart, 7, 0);
|
||||
|
||||
// wait for user choice to come back from the question box menu
|
||||
@ -865,7 +854,8 @@ void pceMenu() {
|
||||
}
|
||||
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
|
@ -137,8 +137,8 @@ void setup_PCW() {
|
||||
static const char pcwmenuItem1[] PROGMEM = "Read ROM";
|
||||
static const char pcwmenuItem2[] PROGMEM = "Read SRAM";
|
||||
static const char pcwmenuItem3[] PROGMEM = "Write SRAM";
|
||||
static const char pcwmenuItem4[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsPCW[] PROGMEM = { pcwmenuItem1, pcwmenuItem2, pcwmenuItem3, pcwmenuItem4 };
|
||||
//static const char pcwmenuItem4[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsPCW[] PROGMEM = { pcwmenuItem1, pcwmenuItem2, pcwmenuItem3, string_reset2 };
|
||||
|
||||
void pcwMenu() {
|
||||
convertPgm(menuOptionsPCW, 4);
|
||||
@ -164,7 +164,8 @@ void pcwMenu() {
|
||||
readSRAM_PCW();
|
||||
sd.chdir("/");
|
||||
// Wait for user input
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
break;
|
||||
@ -181,10 +182,10 @@ void pcwMenu() {
|
||||
println_Msg(F("SRAM verified OK"));
|
||||
display_Update();
|
||||
} else {
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(writeErrors);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -468,7 +469,7 @@ void readROM_PCW() {
|
||||
sd.chdir(folder);
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("Saving to "));
|
||||
print_STR(saving_to_STR, 0);
|
||||
print_Msg(folder);
|
||||
println_Msg(F("/..."));
|
||||
display_Update();
|
||||
@ -477,7 +478,7 @@ void readROM_PCW() {
|
||||
EEPROM_writeAnything(0, foldern);
|
||||
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
read_setup_PCW();
|
||||
for (unsigned long address = 0; address < 0x400000; address += 512) { // 4MB
|
||||
@ -495,7 +496,8 @@ void readROM_PCW() {
|
||||
|
||||
// Wait for user input
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
@ -510,7 +512,7 @@ void readMultiROM_PCW() {
|
||||
sd.chdir(folder);
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("Saving to "));
|
||||
print_STR(saving_to_STR, 0);
|
||||
print_Msg(folder);
|
||||
println_Msg(F("/..."));
|
||||
display_Update();
|
||||
@ -519,7 +521,7 @@ void readMultiROM_PCW() {
|
||||
EEPROM_writeAnything(0, foldern);
|
||||
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
display_Clear();
|
||||
println_Msg(F("READING MULTI-PACK"));
|
||||
@ -554,7 +556,8 @@ void readMultiROM_PCW() {
|
||||
|
||||
// Wait for user input
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
@ -576,7 +579,7 @@ void readSRAM_PCW() { // readSRAM_1A()
|
||||
EEPROM_writeAnything(0, foldern);
|
||||
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
display_Clear();
|
||||
read_setup_PCW();
|
||||
@ -620,13 +623,13 @@ void writeSRAM_PCW() {
|
||||
}
|
||||
}
|
||||
myFile.close();
|
||||
println_Msg(F("Done"));
|
||||
print_STR(done_STR, 1);
|
||||
display_Update();
|
||||
} else {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
} else {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
display_Clear();
|
||||
}
|
||||
@ -649,11 +652,16 @@ unsigned long verifySRAM_PCW() {
|
||||
}
|
||||
myFile.close();
|
||||
} else {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
|
||||
return writeErrors;
|
||||
}
|
||||
|
||||
// avoid warnings
|
||||
#undef MODE_READ
|
||||
#undef MODE_WRITE
|
||||
|
||||
#endif
|
||||
//******************************************
|
||||
// End of File
|
||||
|
@ -16,16 +16,11 @@
|
||||
// SF Memory status
|
||||
byte sfmReady = 0;
|
||||
|
||||
// SF Memory Menu
|
||||
boolean hasMenu = true;
|
||||
byte numGames = 0;
|
||||
|
||||
// Arrays that hold game info
|
||||
int gameSize[8];
|
||||
int saveSize[8];
|
||||
byte gameAddress[8];
|
||||
byte gameVersion[8];
|
||||
char gameCode[8][10];
|
||||
boolean hirom[8];
|
||||
|
||||
/******************************************
|
||||
@ -34,8 +29,8 @@ boolean hirom[8];
|
||||
// SFM menu items
|
||||
static const char sfmMenuItem1[] PROGMEM = "Game Menu";
|
||||
static const char sfmMenuItem2[] PROGMEM = "Flash Menu";
|
||||
static const char sfmMenuItem3[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsSFM[] PROGMEM = { sfmMenuItem1, sfmMenuItem2, sfmMenuItem3 };
|
||||
//static const char sfmMenuItem3[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsSFM[] PROGMEM = { sfmMenuItem1, sfmMenuItem2, string_reset2 };
|
||||
|
||||
// SFM flash menu items
|
||||
static const char sfmFlashMenuItem1[] PROGMEM = "Read Flash";
|
||||
@ -51,8 +46,8 @@ static const char sfmGameMenuItem1[] PROGMEM = "Read Sram";
|
||||
static const char sfmGameMenuItem2[] PROGMEM = "Read Game";
|
||||
static const char sfmGameMenuItem3[] PROGMEM = "Write Sram";
|
||||
static const char sfmGameMenuItem4[] PROGMEM = "Switch Game";
|
||||
static const char sfmGameMenuItem5[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsSFMGame[] PROGMEM = { sfmGameMenuItem1, sfmGameMenuItem2, sfmGameMenuItem3, sfmGameMenuItem4, sfmGameMenuItem5 };
|
||||
//static const char sfmGameMenuItem5[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsSFMGame[] PROGMEM = { sfmGameMenuItem1, sfmGameMenuItem2, sfmGameMenuItem3, sfmGameMenuItem4, string_reset2 };
|
||||
|
||||
void sfmMenu() {
|
||||
// create menu with title and 3 options to choose from
|
||||
@ -79,20 +74,17 @@ void sfmMenu() {
|
||||
}
|
||||
|
||||
void sfmGameMenu() {
|
||||
char menuOptionsSFMGames[8][20];
|
||||
byte numGames;
|
||||
boolean hasMenu;
|
||||
// Switch to hirom all
|
||||
if (send_SFM(0x04) == 0x2A) {
|
||||
delay(300);
|
||||
|
||||
// Fill arrays with data
|
||||
getGames();
|
||||
getGames(menuOptionsSFMGames, &hasMenu, &numGames);
|
||||
|
||||
if (hasMenu) {
|
||||
// Create submenu options
|
||||
char menuOptionsSFMGames[8][20];
|
||||
for (int i = 0; i < (numGames); i++) {
|
||||
strncpy(menuOptionsSFMGames[i], gameCode[i], 10);
|
||||
}
|
||||
|
||||
// Create menu with title and numGames options to choose from
|
||||
unsigned char gameSubMenu;
|
||||
// wait for user choice to come back from the question box menu
|
||||
@ -121,7 +113,7 @@ void sfmGameMenu() {
|
||||
}
|
||||
}
|
||||
// Copy gameCode to romName in case of japanese chars in romName
|
||||
strcpy(romName, gameCode[gameSubMenu + 1]);
|
||||
strcpy(romName, menuOptionsSFMGames[gameSubMenu + 1]);
|
||||
|
||||
// Print info
|
||||
getCartInfo_SFM();
|
||||
@ -133,7 +125,7 @@ void sfmGameMenu() {
|
||||
delay(200);
|
||||
|
||||
// Copy gameCode to romName in case of japanese chars in romName
|
||||
strcpy(romName, gameCode[0]);
|
||||
strcpy(romName, menuOptionsSFMGames[0]);
|
||||
|
||||
// Print info
|
||||
getCartInfo_SFM();
|
||||
@ -182,10 +174,10 @@ void sfmGameOptions() {
|
||||
println_Msg(F("Verified OK"));
|
||||
display_Update();
|
||||
} else {
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(wrErrors);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -201,7 +193,8 @@ void sfmGameOptions() {
|
||||
}
|
||||
if (gameSubMenu != 3) {
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
@ -267,7 +260,8 @@ void sfmFlashMenu() {
|
||||
println_Msg(F("This will erase your"));
|
||||
println_Msg(F("NP Cartridge."));
|
||||
println_Msg("");
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
|
||||
@ -309,9 +303,9 @@ void sfmFlashMenu() {
|
||||
println_Msg(F("OK"));
|
||||
display_Update();
|
||||
idFlash_SFM(0xC0);
|
||||
if (strcmp(flashid, "c2f3") == 0) {
|
||||
if (flashid == 0xc2f3) {
|
||||
idFlash_SFM(0xE0);
|
||||
if (strcmp(flashid, "c2f3") == 0) {
|
||||
if (flashid == 0xc2f3) {
|
||||
// Reset flash
|
||||
resetFlash_SFM(0xC0);
|
||||
resetFlash_SFM(0xE0);
|
||||
@ -348,9 +342,9 @@ void sfmFlashMenu() {
|
||||
println_Msg(F("OK"));
|
||||
display_Update();
|
||||
idFlash_SFM(0xC0);
|
||||
if (strcmp(flashid, "c2f3") == 0) {
|
||||
if (flashid == 0xc2f3) {
|
||||
idFlash_SFM(0xE0);
|
||||
if (strcmp(flashid, "c2f3") == 0) {
|
||||
if (flashid == 0xc2f3) {
|
||||
// Reset flash
|
||||
resetFlash_SFM(0xC0);
|
||||
resetFlash_SFM(0xE0);
|
||||
@ -379,7 +373,8 @@ void sfmFlashMenu() {
|
||||
println_Msg(F("This will erase your"));
|
||||
println_Msg(F("NP Cartridge."));
|
||||
println_Msg("");
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
|
||||
@ -429,7 +424,8 @@ void sfmFlashMenu() {
|
||||
}
|
||||
if (flashSubMenu != 5) {
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
@ -437,29 +433,31 @@ void sfmFlashMenu() {
|
||||
#endif
|
||||
|
||||
// Read the games from the menu area
|
||||
void getGames() {
|
||||
void getGames(char gameCode[8][20], boolean *hasMenu, byte *numGames) {
|
||||
// Set data pins to input
|
||||
dataIn();
|
||||
// Set control pins to input
|
||||
controlIn_SFM();
|
||||
|
||||
// Check if menu is present
|
||||
*hasMenu = true;
|
||||
byte menuString[] = { 0x4D, 0x45, 0x4E, 0x55, 0x20, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x41, 0x4D };
|
||||
for (int i = 0; i < 12; i++) {
|
||||
if (menuString[i] != readBank_SFM(0xC0, 0x7FC0 + i)) {
|
||||
hasMenu = false;
|
||||
*hasMenu = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (hasMenu) {
|
||||
if (*hasMenu) {
|
||||
*numGames = 0;
|
||||
// Count number of games
|
||||
for (word i = 0x0000; i < 0xE000; i += 0x2000) {
|
||||
if (readBank_SFM(0xC6, i) == numGames)
|
||||
numGames++;
|
||||
if (readBank_SFM(0xC6, i) == *numGames)
|
||||
(*numGames)++;
|
||||
}
|
||||
|
||||
// Get game info
|
||||
for (int i = 0; i < numGames; i++) {
|
||||
for (int i = 0; i < *numGames; i++) {
|
||||
// Read starting address and size
|
||||
gameAddress[i] = 0xC0 + readBank_SFM(0xC6, i * 0x2000 + 0x01) * 0x8;
|
||||
gameSize[i] = readBank_SFM(0xC6, i * 0x2000 + 0x03) * 128;
|
||||
@ -486,8 +484,8 @@ void getGames() {
|
||||
for (int j = 0; j < 9; j++) {
|
||||
myByte = readBank_SFM(0xC6, i * 0x2000 + 0x07 + j);
|
||||
// Remove funny characters
|
||||
if (((char(myByte) >= 44 && char(myByte) <= 57) || (char(myByte) >= 65 && char(myByte) <= 122)) && myLength < 9) {
|
||||
gameCode[i][myLength] = char(myByte);
|
||||
if (((myByte >= ',' && myByte <= '9') || (myByte >= 'A' && myByte <= 'z')) && myLength < 9) {
|
||||
gameCode[i][myLength] = myByte;
|
||||
myLength++;
|
||||
}
|
||||
}
|
||||
@ -495,48 +493,29 @@ void getGames() {
|
||||
gameCode[i][myLength] = '\0';
|
||||
}
|
||||
} else {
|
||||
word base;
|
||||
*numGames = 1;
|
||||
//check if hirom
|
||||
if (readBank_SFM(0xC0, 0xFFD5) == 0x31) {
|
||||
hirom[0] = true;
|
||||
base = 0xFF00;
|
||||
} else {
|
||||
hirom[0] = false;
|
||||
base = 0x7F00;
|
||||
}
|
||||
|
||||
if (hirom[0]) {
|
||||
gameVersion[0] = readBank_SFM(0xC0, 0xFFDB);
|
||||
gameCode[0][0] = 'G';
|
||||
gameCode[0][1] = 'A';
|
||||
gameCode[0][2] = 'M';
|
||||
gameCode[0][3] = 'E';
|
||||
gameCode[0][4] = '-';
|
||||
gameCode[0][5] = char(readBank_SFM(0xC0, 0xFFB2));
|
||||
gameCode[0][6] = char(readBank_SFM(0xC0, 0xFFB3));
|
||||
gameCode[0][7] = char(readBank_SFM(0xC0, 0xFFB4));
|
||||
gameCode[0][8] = char(readBank_SFM(0xC0, 0xFFB5));
|
||||
gameCode[0][9] = '\0';
|
||||
|
||||
byte romSizeExp = readBank_SFM(0xC0, 0xFFD7) - 7;
|
||||
gameSize[0] = 1;
|
||||
while (romSizeExp--)
|
||||
gameSize[0] *= 2;
|
||||
} else {
|
||||
gameVersion[0] = readBank_SFM(0xC0, 0x7FDB);
|
||||
gameCode[0][0] = 'G';
|
||||
gameCode[0][1] = 'A';
|
||||
gameCode[0][2] = 'M';
|
||||
gameCode[0][3] = 'E';
|
||||
gameCode[0][4] = '-';
|
||||
gameCode[0][5] = char(readBank_SFM(0xC0, 0x7FB2));
|
||||
gameCode[0][6] = char(readBank_SFM(0xC0, 0x7FB3));
|
||||
gameCode[0][7] = char(readBank_SFM(0xC0, 0x7FB4));
|
||||
gameCode[0][8] = char(readBank_SFM(0xC0, 0x7FB5));
|
||||
gameCode[0][9] = '\0';
|
||||
|
||||
byte romSizeExp = readBank_SFM(0xC0, 0x7FD7) - 7;
|
||||
gameSize[0] = 1;
|
||||
while (romSizeExp--)
|
||||
gameSize[0] *= 2;
|
||||
}
|
||||
gameVersion[0] = readBank_SFM(0xC0, base + 0xDB);
|
||||
gameCode[0][0] = 'G';
|
||||
gameCode[0][1] = 'A';
|
||||
gameCode[0][2] = 'M';
|
||||
gameCode[0][3] = 'E';
|
||||
gameCode[0][4] = '-';
|
||||
gameCode[0][5] = readBank_SFM(0xC0, base + 0xB2);
|
||||
gameCode[0][6] = readBank_SFM(0xC0, base + 0xB3);
|
||||
gameCode[0][7] = readBank_SFM(0xC0, base + 0xB4);
|
||||
gameCode[0][8] = readBank_SFM(0xC0, base + 0xB5);
|
||||
gameCode[0][9] = '\0';
|
||||
gameSize[0] = 1 << (readBank_SFM(0xC0, base + 0xD7) - 7);
|
||||
}
|
||||
}
|
||||
|
||||
@ -784,7 +763,8 @@ void getCartInfo_SFM() {
|
||||
print_Msg(F("Sram: "));
|
||||
print_Msg(sramSize);
|
||||
println_Msg(F("Kbit"));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
// Wait for user input
|
||||
wait();
|
||||
@ -802,12 +782,8 @@ boolean checkcart_SFM() {
|
||||
}
|
||||
|
||||
// Calculate CRC32 of header
|
||||
uint32_t oldcrc32 = 0xFFFFFFFF;
|
||||
for (int c = 0; c < 80; c++) {
|
||||
oldcrc32 = updateCRC(snesHeader[c], oldcrc32);
|
||||
}
|
||||
char crcStr[9];
|
||||
sprintf(crcStr, "%08lX", ~oldcrc32);
|
||||
sprintf(crcStr, "%08lX", calculateCRC(snesHeader, 80));
|
||||
|
||||
// Get Checksum as string
|
||||
sprintf(checksumStr, "%02X%02X", readBank_SFM(0, 65503), readBank_SFM(0, 65502));
|
||||
@ -927,7 +903,7 @@ void readROM_SFM() {
|
||||
|
||||
//open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
}
|
||||
|
||||
// Check if LoROM or HiROM...
|
||||
@ -936,7 +912,7 @@ void readROM_SFM() {
|
||||
display_Update();
|
||||
|
||||
// Read up to 96 banks starting at bank 0×00.
|
||||
for (int currBank = 0; currBank < numBanks; currBank++) {
|
||||
for (byte currBank = 0; currBank < numBanks; currBank++) {
|
||||
// Dump the bytes to SD 512B at a time
|
||||
for (long currByte = 32768; currByte < 65536; currByte += 512) {
|
||||
for (int c = 0; c < 512; c++) {
|
||||
@ -951,7 +927,7 @@ void readROM_SFM() {
|
||||
println_Msg(F("Dumping HiRom..."));
|
||||
display_Update();
|
||||
|
||||
for (int currBank = 192; currBank < (numBanks + 192); currBank++) {
|
||||
for (byte currBank = 192; currBank < (numBanks + 192); currBank++) {
|
||||
for (long currByte = 0; currByte < 65536; currByte += 512) {
|
||||
for (int c = 0; c < 512; c++) {
|
||||
sdBuffer[c] = readBank_SFM(currBank, currByte + c);
|
||||
@ -1009,7 +985,9 @@ void idFlash_SFM(int startBank) {
|
||||
controlIn_SFM();
|
||||
|
||||
// Read the two id bytes into a string
|
||||
sprintf(flashid, "%x%x", readBank_SFM(startBank, 0x00), readBank_SFM(startBank, 0x02));
|
||||
flashid = readBank_SFM(startBank, 0x00) << 8;
|
||||
flashid |= readBank_SFM(startBank, 0x02);
|
||||
sprintf(flashid_str, "%04x", flashid);
|
||||
} else {
|
||||
writeBank_SFM(1, 0x8000 + 0x1555L * 2, 0xaa);
|
||||
writeBank_SFM(0, 0x8000 + 0x2AAAL * 2, 0x55);
|
||||
@ -1021,7 +999,9 @@ void idFlash_SFM(int startBank) {
|
||||
controlIn_SFM();
|
||||
|
||||
// Read the two id bytes into a string
|
||||
sprintf(flashid, "%x%x", readBank_SFM(0, 0x8000), readBank_SFM(0, 0x8000 + 0x02));
|
||||
flashid = readBank_SFM(0, 0x8000) << 8;
|
||||
flashid |= readBank_SFM(0, 0x8000 + 0x02);
|
||||
sprintf(flashid_str, "%04x", flashid);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1047,7 +1027,7 @@ void writeFlash_SFM(int startBank, uint32_t pos) {
|
||||
|
||||
if (romType) {
|
||||
// Write hirom
|
||||
for (int currBank = startBank; currBank < startBank + numBanks; currBank++) {
|
||||
for (byte currBank = startBank; currBank < startBank + numBanks; currBank++) {
|
||||
// Fill SDBuffer with 1 page at a time then write it repeat until all bytes are written
|
||||
for (unsigned long currByte = 0; currByte < 0x10000; currByte += 128) {
|
||||
myFile.read(sdBuffer, 128);
|
||||
@ -1072,7 +1052,7 @@ void writeFlash_SFM(int startBank, uint32_t pos) {
|
||||
}
|
||||
} else {
|
||||
// Write lorom
|
||||
for (int currBank = 0; currBank < numBanks; currBank++) {
|
||||
for (byte currBank = 0; currBank < numBanks; currBank++) {
|
||||
for (unsigned long currByte = 0x8000; currByte < 0x10000; currByte += 128) {
|
||||
myFile.read(sdBuffer, 128);
|
||||
// Write command sequence
|
||||
@ -1098,7 +1078,7 @@ void writeFlash_SFM(int startBank, uint32_t pos) {
|
||||
myFile.close();
|
||||
println_Msg("");
|
||||
} else {
|
||||
print_Error(F("Can't open file on SD"), true);
|
||||
print_Error(open_file_STR, true);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1175,7 +1155,7 @@ byte blankcheck_SFM(int startBank) {
|
||||
|
||||
byte blank = 1;
|
||||
if (romType) {
|
||||
for (int currBank = startBank; currBank < startBank + numBanks; currBank++) {
|
||||
for (byte currBank = startBank; currBank < startBank + numBanks; currBank++) {
|
||||
for (unsigned long currByte = 0; currByte < 0x10000; currByte++) {
|
||||
if (readBank_SFM(currBank, currByte) != 0xFF) {
|
||||
currBank = startBank + numBanks;
|
||||
@ -1184,7 +1164,7 @@ byte blankcheck_SFM(int startBank) {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (int currBank = 0; currBank < numBanks; currBank++) {
|
||||
for (byte currBank = 0; currBank < numBanks; currBank++) {
|
||||
for (unsigned long currByte = 0x8000; currByte < 0x10000; currByte++) {
|
||||
if (readBank_SFM(currBank, currByte) != 0xFF) {
|
||||
currBank = numBanks;
|
||||
@ -1212,7 +1192,7 @@ unsigned long verifyFlash_SFM(int startBank, uint32_t pos) {
|
||||
controlIn_SFM();
|
||||
|
||||
if (romType) {
|
||||
for (int currBank = startBank; currBank < startBank + numBanks; currBank++) {
|
||||
for (byte currBank = startBank; currBank < startBank + numBanks; currBank++) {
|
||||
for (unsigned long currByte = 0; currByte < 0x10000; currByte += 512) {
|
||||
// Fill SDBuffer
|
||||
myFile.read(sdBuffer, 512);
|
||||
@ -1224,7 +1204,7 @@ unsigned long verifyFlash_SFM(int startBank, uint32_t pos) {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (int currBank = 0; currBank < numBanks; currBank++) {
|
||||
for (byte currBank = 0; currBank < numBanks; currBank++) {
|
||||
for (unsigned long currByte = 0x8000; currByte < 0x10000; currByte += 512) {
|
||||
// Fill SDBuffer
|
||||
myFile.read(sdBuffer, 512);
|
||||
@ -1261,10 +1241,10 @@ void readFlash_SFM() {
|
||||
|
||||
// Open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
}
|
||||
if (romType) {
|
||||
for (int currBank = 0xC0; currBank < 0xC0 + numBanks; currBank++) {
|
||||
for (byte currBank = 0xC0; currBank < 0xC0 + numBanks; currBank++) {
|
||||
for (unsigned long currByte = 0; currByte < 0x10000; currByte += 512) {
|
||||
for (int c = 0; c < 512; c++) {
|
||||
sdBuffer[c] = readBank_SFM(currBank, currByte + c);
|
||||
@ -1273,7 +1253,7 @@ void readFlash_SFM() {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (int currBank = 0; currBank < numBanks; currBank++) {
|
||||
for (byte currBank = 0; currBank < numBanks; currBank++) {
|
||||
for (unsigned long currByte = 0x8000; currByte < 0x10000; currByte += 512) {
|
||||
for (int c = 0; c < 512; c++) {
|
||||
sdBuffer[c] = readBank_SFM(currBank, currByte + c);
|
||||
@ -1339,10 +1319,10 @@ void printMapping() {
|
||||
// Read the mapping out of the first chip
|
||||
char buffer[3];
|
||||
|
||||
for (int currByte = 0xFF00; currByte < 0xFF50; currByte += 10) {
|
||||
for (unsigned int currByte = 0xFF00; currByte < 0xFF50; currByte += 10) {
|
||||
for (int c = 0; c < 10; c++) {
|
||||
itoa(readBank_SFM(0xC0, currByte + c), buffer, 16);
|
||||
for (int i = 0; i < 2 - strlen(buffer); i++) {
|
||||
for (size_t i = 0; i < 2 - strlen(buffer); i++) {
|
||||
print_Msg(F("0"));
|
||||
}
|
||||
// Now print the significant bits
|
||||
@ -1405,7 +1385,7 @@ void readMapping() {
|
||||
|
||||
//open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
|
||||
// Read the mapping info out of the 1st chip
|
||||
@ -1468,7 +1448,7 @@ void eraseMapping(byte startBank) {
|
||||
if (unlockHirom()) {
|
||||
// Get ID
|
||||
idFlash_SFM(startBank);
|
||||
if (strcmp(flashid, "c2f3") == 0) {
|
||||
if (flashid == 0xc2f3) {
|
||||
resetFlash_SFM(startBank);
|
||||
|
||||
// Switch to write
|
||||
@ -1578,7 +1558,7 @@ void writeMapping_SFM(byte startBank, uint32_t pos) {
|
||||
if (unlockHirom()) {
|
||||
// Get ID
|
||||
idFlash_SFM(startBank);
|
||||
if (strcmp(flashid, "c2f3") == 0) {
|
||||
if (flashid == 0xc2f3) {
|
||||
resetFlash_SFM(startBank);
|
||||
|
||||
// Switch to write
|
||||
@ -1711,9 +1691,9 @@ void write_SFM(int startBank, uint32_t pos) {
|
||||
if (unlockHirom()) {
|
||||
// Get ID
|
||||
idFlash_SFM(startBank);
|
||||
if (strcmp(flashid, "c2f3") == 0) {
|
||||
if (flashid == 0xc2f3) {
|
||||
print_Msg(F("Flash ID: "));
|
||||
println_Msg(flashid);
|
||||
println_Msg(flashid_str);
|
||||
display_Update();
|
||||
resetFlash_SFM(startBank);
|
||||
delay(1000);
|
||||
@ -1730,7 +1710,7 @@ void write_SFM(int startBank, uint32_t pos) {
|
||||
display_Update();
|
||||
eraseFlash_SFM(startBank);
|
||||
resetFlash_SFM(startBank);
|
||||
println_Msg(F("Done"));
|
||||
print_STR(done_STR, 1);
|
||||
print_Msg(F("Blankcheck..."));
|
||||
display_Update();
|
||||
if (blankcheck_SFM(startBank)) {
|
||||
@ -1747,17 +1727,17 @@ void write_SFM(int startBank, uint32_t pos) {
|
||||
resetFlash_SFM(startBank);
|
||||
|
||||
// Checking for errors
|
||||
print_Msg(F("Verifying..."));
|
||||
print_STR(verifying_STR, 0);
|
||||
display_Update();
|
||||
writeErrors = verifyFlash_SFM(startBank, pos);
|
||||
if (writeErrors == 0) {
|
||||
println_Msg(F("OK"));
|
||||
display_Update();
|
||||
} else {
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(writeErrors);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), true);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, true);
|
||||
}
|
||||
} else {
|
||||
print_Error(F("Error: Wrong Flash ID"), true);
|
||||
@ -1771,4 +1751,4 @@ void write_SFM(int startBank, uint32_t pos) {
|
||||
|
||||
//******************************************
|
||||
// End of File
|
||||
//******************************************
|
||||
//******************************************
|
||||
|
@ -18,9 +18,9 @@ static const char* const menuAdapterSMS[] PROGMEM = { SMSAdapterItem1, SMSAdapte
|
||||
static const char SMSMenuItem1[] PROGMEM = "Read Rom";
|
||||
static const char SMSMenuItem2[] PROGMEM = "Read from SRAM";
|
||||
static const char SMSMenuItem3[] PROGMEM = "Write to SRAM";
|
||||
static const char SMSMenuItem4[] PROGMEM = "Reset";
|
||||
//static const char SMSMenuItem4[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char SMSMenuItem5[] PROGMEM = "Change Retrode Mode";
|
||||
static const char* const menuOptionsSMS[] PROGMEM = { SMSMenuItem1, SMSMenuItem2, SMSMenuItem3, SMSMenuItem4, SMSMenuItem5 };
|
||||
static const char* const menuOptionsSMS[] PROGMEM = { SMSMenuItem1, SMSMenuItem2, SMSMenuItem3, string_reset2, SMSMenuItem5 };
|
||||
|
||||
// Rom Size menu
|
||||
static const char SMSRomItem1[] PROGMEM = "8KB";
|
||||
@ -114,10 +114,12 @@ void _smsMenu() {
|
||||
}
|
||||
if (retrode_mode) {
|
||||
println_Msg(retrode_mode ? (retrode_mode_sms ? F("Retrode Mode SMS") : F("Retrode Mode GG")) : F("Retrode Mode Off"));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
} else {
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
}
|
||||
display_Update();
|
||||
wait();
|
||||
@ -550,7 +552,8 @@ void getCartInfo_SMS() {
|
||||
|
||||
// Wait for user input
|
||||
#if (defined(enable_LCD) || defined(enable_OLED))
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
#endif
|
||||
@ -579,7 +582,7 @@ void readROM_SMS() {
|
||||
sd.chdir(folder);
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("Saving to "));
|
||||
print_STR(saving_to_STR, 0);
|
||||
print_Msg(folder);
|
||||
println_Msg(F("/..."));
|
||||
display_Update();
|
||||
@ -590,7 +593,7 @@ void readROM_SMS() {
|
||||
|
||||
// Open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
|
||||
// set default bank size to 16KB
|
||||
@ -664,7 +667,7 @@ void readSRAM_SMS() {
|
||||
sd.chdir(folder);
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("Saving to "));
|
||||
print_STR(saving_to_STR, 0);
|
||||
print_Msg(folder);
|
||||
println_Msg(F("/..."));
|
||||
display_Update();
|
||||
@ -675,7 +678,7 @@ void readSRAM_SMS() {
|
||||
|
||||
// Open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
// Write the whole 32KB
|
||||
// When there is only 8KB of SRAM, the contents should be duplicated
|
||||
@ -742,10 +745,10 @@ void writeSRAM_SMS() {
|
||||
blinkLED();
|
||||
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("DONE"));
|
||||
print_STR(done_STR, 1);
|
||||
display_Update();
|
||||
} else {
|
||||
print_Error(F("SD ERROR"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -35,11 +35,11 @@ static const char snsMenuItem3[] PROGMEM = "Satellaview BS-X";
|
||||
static const char snsMenuItem4[] PROGMEM = "Flash repro";
|
||||
#ifdef clockgen_calibration
|
||||
static const char snsMenuItem5[] PROGMEM = "Calibrate Clock";
|
||||
static const char snsMenuItem6[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsSNS[] PROGMEM = { snsMenuItem1, snsMenuItem2, snsMenuItem3, snsMenuItem4, snsMenuItem5, snsMenuItem6 };
|
||||
//static const char snsMenuItem6[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsSNS[] PROGMEM = { snsMenuItem1, snsMenuItem2, snsMenuItem3, snsMenuItem4, snsMenuItem5, string_reset2 };
|
||||
#else
|
||||
static const char snsMenuItem5[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsSNS[] PROGMEM = { snsMenuItem1, snsMenuItem2, snsMenuItem3, snsMenuItem4, snsMenuItem5 };
|
||||
//static const char snsMenuItem5[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsSNS[] PROGMEM = { snsMenuItem1, snsMenuItem2, snsMenuItem3, snsMenuItem4, string_reset2 };
|
||||
#endif
|
||||
|
||||
// SNES menu items
|
||||
@ -49,24 +49,24 @@ static const char SnesMenuItem3[] PROGMEM = "Write Save";
|
||||
static const char SnesMenuItem4[] PROGMEM = "Test SRAM";
|
||||
static const char SnesMenuItem5[] PROGMEM = "Cycle cart";
|
||||
static const char SnesMenuItem6[] PROGMEM = "Force cart type";
|
||||
static const char SnesMenuItem7[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsSNES[] PROGMEM = { SnesMenuItem1, SnesMenuItem2, SnesMenuItem3, SnesMenuItem4, SnesMenuItem5, SnesMenuItem6, SnesMenuItem7 };
|
||||
//static const char SnesMenuItem7[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsSNES[] PROGMEM = { SnesMenuItem1, SnesMenuItem2, SnesMenuItem3, SnesMenuItem4, SnesMenuItem5, SnesMenuItem6, string_reset2 };
|
||||
|
||||
// Manual config menu items
|
||||
static const char confMenuItem1[] PROGMEM = "Use header info";
|
||||
static const char confMenuItem2[] PROGMEM = "4MB LoROM 256K SRAM";
|
||||
static const char confMenuItem3[] PROGMEM = "4MB HiROM 64K SRAM";
|
||||
static const char confMenuItem4[] PROGMEM = "6MB ExROM 256K SRAM";
|
||||
static const char confMenuItem5[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsConfManual[] PROGMEM = { confMenuItem1, confMenuItem2, confMenuItem3, confMenuItem4, confMenuItem5 };
|
||||
//static const char confMenuItem5[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsConfManual[] PROGMEM = { confMenuItem1, confMenuItem2, confMenuItem3, confMenuItem4, string_reset2 };
|
||||
|
||||
// Repro menu items
|
||||
static const char reproMenuItem1[] PROGMEM = "LoROM (P0)";
|
||||
static const char reproMenuItem2[] PROGMEM = "HiROM (P0)";
|
||||
static const char reproMenuItem3[] PROGMEM = "ExLoROM (P1)";
|
||||
static const char reproMenuItem4[] PROGMEM = "ExHiROM (P1)";
|
||||
static const char reproMenuItem5[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsRepro[] PROGMEM = { reproMenuItem1, reproMenuItem2, reproMenuItem3, reproMenuItem4, reproMenuItem5 };
|
||||
//static const char reproMenuItem5[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsRepro[] PROGMEM = { reproMenuItem1, reproMenuItem2, reproMenuItem3, reproMenuItem4, string_reset2 };
|
||||
|
||||
// SNES repro menu
|
||||
void reproMenu() {
|
||||
@ -204,8 +204,6 @@ void snesMenu() {
|
||||
display_Clear();
|
||||
// Change working dir to root
|
||||
sd.chdir("/");
|
||||
// get current time
|
||||
unsigned long startTime = millis();
|
||||
// start reading from cart
|
||||
readROM_SNES();
|
||||
// Internal Checksum
|
||||
@ -247,10 +245,10 @@ void snesMenu() {
|
||||
println_Msg(F("Verified OK"));
|
||||
display_Update();
|
||||
} else {
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(wrErrors);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
} else {
|
||||
display_Clear();
|
||||
@ -282,10 +280,10 @@ void snesMenu() {
|
||||
println_Msg(F("Restored OK"));
|
||||
display_Update();
|
||||
} else {
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(wrErrors);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
} else {
|
||||
display_Clear();
|
||||
@ -323,7 +321,8 @@ void snesMenu() {
|
||||
break;
|
||||
}
|
||||
//println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
@ -603,7 +602,7 @@ void readLoRomBanks(unsigned int start, unsigned int total, FsFile* file) {
|
||||
uint32_t totalProgressBar = (uint32_t)(total - start) * 1024;
|
||||
draw_progressbar(0, totalProgressBar);
|
||||
|
||||
for (int currBank = start; currBank < total; currBank++) {
|
||||
for (byte currBank = start; currBank < total; currBank++) {
|
||||
PORTL = currBank;
|
||||
|
||||
// Blink led
|
||||
@ -654,7 +653,7 @@ void readHiRomBanks(unsigned int start, unsigned int total, FsFile* file) {
|
||||
uint32_t totalProgressBar = (uint32_t)(total - start) * 1024;
|
||||
draw_progressbar(0, totalProgressBar);
|
||||
|
||||
for (int currBank = start; currBank < total; currBank++) {
|
||||
for (byte currBank = start; currBank < total; currBank++) {
|
||||
PORTL = currBank;
|
||||
|
||||
// Blink led
|
||||
@ -700,31 +699,6 @@ void readHiRomBanks(unsigned int start, unsigned int total, FsFile* file) {
|
||||
void getCartInfo_SNES() {
|
||||
boolean manualConfig = 0;
|
||||
|
||||
//Prime SA1 cartridge
|
||||
uint16_t c = 0;
|
||||
uint16_t currByte = 0;
|
||||
byte buffer[1024] = { 0 };
|
||||
PORTL = 192;
|
||||
while (c < 1024) {
|
||||
PORTF = (currByte & 0xFF);
|
||||
PORTK = ((currByte >> 8) & 0xFF);
|
||||
|
||||
// Wait for the Byte to appear on the data bus
|
||||
// Arduino running at 16Mhz -> one nop = 62.5ns
|
||||
// slowRom is good for 200ns, fastRom is <= 120ns; S-CPU best case read speed: 3.57MHz / 280ns
|
||||
// let's be conservative and use 6 x 62.5 = 375ns
|
||||
NOP;
|
||||
NOP;
|
||||
NOP;
|
||||
NOP;
|
||||
NOP;
|
||||
NOP;
|
||||
|
||||
buffer[c] = PINC;
|
||||
c++;
|
||||
currByte++;
|
||||
}
|
||||
|
||||
// Print start page
|
||||
if (checkcart_SNES() == 0) {
|
||||
// Checksum either corrupt or 0000
|
||||
@ -840,7 +814,8 @@ void getCartInfo_SNES() {
|
||||
|
||||
// Wait for user input
|
||||
#if (defined(enable_LCD) || defined(enable_OLED))
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
#endif
|
||||
@ -872,7 +847,7 @@ void checkAltConf(char crcStr[9]) {
|
||||
skip_line(&myFile);
|
||||
|
||||
// Skip over the CRC checksum
|
||||
myFile.seekSet(myFile.curPosition() + 9);
|
||||
myFile.seekCur(9);
|
||||
|
||||
// Get internal ROM checksum as string
|
||||
for (byte j = 0; j < 4; j++) {
|
||||
@ -887,7 +862,7 @@ void checkAltConf(char crcStr[9]) {
|
||||
display_Update();
|
||||
|
||||
// Skip the , in the file
|
||||
myFile.seekSet(myFile.curPosition() + 1);
|
||||
myFile.seekCur(1);
|
||||
|
||||
// Read the CRC32 of the SNES header out of database
|
||||
for (byte k = 0; k < 8; k++) {
|
||||
@ -896,13 +871,13 @@ void checkAltConf(char crcStr[9]) {
|
||||
tempStr3[8] = '\0';
|
||||
|
||||
// Skip the , in the file
|
||||
myFile.seekSet(myFile.curPosition() + 1);
|
||||
myFile.seekCur(1);
|
||||
|
||||
// Read file size
|
||||
byte romSize2 = (myFile.read() - 48) * 10 + (myFile.read() - 48);
|
||||
|
||||
// Skip the , in the file
|
||||
myFile.seekSet(myFile.curPosition() + 1);
|
||||
myFile.seekCur(1);
|
||||
|
||||
// Read number of banks
|
||||
byte numBanks2 = (myFile.read() - 48) * 100 + (myFile.read() - 48) * 10 + (myFile.read() - 48);
|
||||
@ -936,7 +911,7 @@ void checkAltConf(char crcStr[9]) {
|
||||
// If no match go to next entry
|
||||
else {
|
||||
// skip rest of line
|
||||
myFile.seekSet(myFile.curPosition() + 18);
|
||||
myFile.seekCur(18);
|
||||
// skip third empty line
|
||||
skip_line(&myFile);
|
||||
}
|
||||
@ -951,12 +926,10 @@ boolean checkcart_SNES() {
|
||||
// set control to read
|
||||
dataIn();
|
||||
|
||||
uint16_t c = 0;
|
||||
uint16_t headerStart = 0xFFB0;
|
||||
uint16_t currByte = headerStart;
|
||||
byte snesHeader[80] = { 0 };
|
||||
byte snesHeader[80];
|
||||
PORTL = 0;
|
||||
while (c < 80) {
|
||||
for (uint16_t c = 0, currByte = headerStart; c < 80; c++, currByte++) {
|
||||
PORTF = (currByte & 0xFF);
|
||||
PORTK = ((currByte >> 8) & 0xFF);
|
||||
|
||||
@ -974,17 +947,11 @@ boolean checkcart_SNES() {
|
||||
NOP;
|
||||
|
||||
snesHeader[c] = PINC;
|
||||
c++;
|
||||
currByte++;
|
||||
}
|
||||
|
||||
// Calculate CRC32 of header
|
||||
uint32_t oldcrc32 = 0xFFFFFFFF;
|
||||
for (int c = 0; c < 80; c++) {
|
||||
oldcrc32 = updateCRC(snesHeader[c], oldcrc32);
|
||||
}
|
||||
char crcStr[9];
|
||||
sprintf(crcStr, "%08lX", ~oldcrc32);
|
||||
sprintf(crcStr, "%08lX", calculateCRC(snesHeader, 80));
|
||||
|
||||
// Get Checksum as string
|
||||
sprintf(checksumStr, "%02X%02X", snesHeader[0xFFDF - headerStart], snesHeader[0xFFDE - headerStart]);
|
||||
@ -1049,25 +1016,7 @@ boolean checkcart_SNES() {
|
||||
}
|
||||
|
||||
// Get name
|
||||
byte myByte = 0;
|
||||
byte myLength = 0;
|
||||
for (unsigned int i = 0xFFC0; i < 0xFFD5; i++) {
|
||||
myByte = snesHeader[i - headerStart];
|
||||
if (isprint(myByte) && myByte != '<' && myByte != '>' && myByte != ':' && myByte != '"' && myByte != '/' && myByte != '\\' && myByte != '|' && myByte != '?' && myByte != '*') {
|
||||
romName[myLength] = char(myByte);
|
||||
} else {
|
||||
if (romName[myLength - 1] == 0x5F) myLength--;
|
||||
romName[myLength] = 0x5F;
|
||||
}
|
||||
myLength++;
|
||||
}
|
||||
|
||||
// Strip trailing white space
|
||||
for (unsigned int i = myLength - 1; i > 0; i--) {
|
||||
if ((romName[i] != 0x5F) && (romName[i] != 0x20)) break;
|
||||
romName[i] = 0x00;
|
||||
myLength--;
|
||||
}
|
||||
byte myLength = buildRomName(romName, &snesHeader[headerStart], 21);
|
||||
|
||||
// If name consists out of all japanese characters use game code
|
||||
if (myLength == 0) {
|
||||
@ -1078,9 +1027,10 @@ boolean checkcart_SNES() {
|
||||
romName[3] = 'C';
|
||||
romName[4] = '-';
|
||||
for (unsigned int i = 0; i < 4; i++) {
|
||||
byte myByte;
|
||||
myByte = snesHeader[0xFFB2 + i - headerStart];
|
||||
if (((char(myByte) >= 48 && char(myByte) <= 57) || (char(myByte) >= 65 && char(myByte) <= 122)) && myLength < 4) {
|
||||
romName[myLength + 5] = char(myByte);
|
||||
if (((myByte >= '0' && myByte <= '9') || (myByte >= 'A' && myByte <= 'z')) && myLength < 4) {
|
||||
romName[myLength + 5] = myByte;
|
||||
myLength++;
|
||||
}
|
||||
}
|
||||
@ -1314,7 +1264,7 @@ void readROM_SNES() {
|
||||
|
||||
//clear the screen
|
||||
display_Clear();
|
||||
print_Msg(F("Saving to "));
|
||||
print_STR(saving_to_STR, 0);
|
||||
print_Msg(folder);
|
||||
println_Msg(F("/..."));
|
||||
display_Update();
|
||||
@ -1325,7 +1275,7 @@ void readROM_SNES() {
|
||||
|
||||
//open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
}
|
||||
|
||||
//Dump Derby Stallion '96 (Japan) Actual Size is 24Mb
|
||||
@ -1394,7 +1344,7 @@ void readROM_SNES() {
|
||||
controlIn_SNES();
|
||||
byte initialSOMap = readBank_SNES(0, 18439);
|
||||
|
||||
for (int currMemmap = 0; currMemmap < (numBanks / 16); currMemmap++) {
|
||||
for (byte currMemmap = 0; currMemmap < (numBanks / 16); currMemmap++) {
|
||||
|
||||
dataOut();
|
||||
controlOut_SNES();
|
||||
@ -1678,7 +1628,7 @@ void readSRAM() {
|
||||
|
||||
//open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
int sramBanks = 0;
|
||||
if (romType == LO) {
|
||||
@ -1951,10 +1901,10 @@ unsigned long verifySRAM() {
|
||||
if (writeErrors == 0) {
|
||||
println_Msg(F("Verified OK"));
|
||||
} else {
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(writeErrors);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
display_Update();
|
||||
wait();
|
||||
@ -1972,6 +1922,7 @@ unsigned long verifySRAM() {
|
||||
return writeErrors;
|
||||
} else {
|
||||
print_Error(F("Can't open file"), false);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -82,10 +82,10 @@ void svMenu() {
|
||||
println_Msg(F("Verified OK"));
|
||||
display_Update();
|
||||
} else {
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(wrErrors);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
wait();
|
||||
break;
|
||||
@ -300,13 +300,10 @@ void readSRAM_SV() {
|
||||
|
||||
//open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
int sramBanks = 0;
|
||||
|
||||
readBank_SV(0x10, 0); // Preconfigure to fix corrupt 1st byte
|
||||
// Sram size
|
||||
long lastByte = (long(sramSize) * 0x80);
|
||||
|
||||
//startBank = 0x10; endBank = 0x17; CS low
|
||||
for (byte BSBank = 0x10; BSBank < 0x18; BSBank++) {
|
||||
@ -347,8 +344,6 @@ void writeSRAM_SV() {
|
||||
// Set RST RD WR to High and CS to Low
|
||||
controlOut_SNES();
|
||||
|
||||
long lastByte = (long(sramSize) * 0x80);
|
||||
|
||||
println_Msg(F("Writing sram..."));
|
||||
display_Update();
|
||||
|
||||
@ -390,10 +385,6 @@ unsigned long verifySRAM_SV() {
|
||||
// Set control
|
||||
controlIn_SNES();
|
||||
|
||||
int sramBanks = 0;
|
||||
// Sram size
|
||||
long lastByte = (long(sramSize) * 0x80);
|
||||
|
||||
//startBank = 0x10; endBank = 0x17; CS low
|
||||
for (byte BSBank = 0x10; BSBank < 0x18; BSBank++) {
|
||||
//startAddr = 0x5000
|
||||
@ -412,6 +403,7 @@ unsigned long verifySRAM_SV() {
|
||||
return writeErrors;
|
||||
} else {
|
||||
print_Error(F("Can't open file"), false);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -435,7 +427,7 @@ void readROM_SV() {
|
||||
|
||||
//clear the screen
|
||||
display_Clear();
|
||||
print_Msg(F("Saving to "));
|
||||
print_STR(saving_to_STR, 0);
|
||||
print_Msg(folder);
|
||||
println_Msg(F("/..."));
|
||||
display_Update();
|
||||
@ -446,7 +438,7 @@ void readROM_SV() {
|
||||
|
||||
//open file on sd card
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
}
|
||||
|
||||
// Read Banks
|
||||
@ -559,7 +551,7 @@ void writeROM_SV(void) {
|
||||
dataIn(); //Set pins to input
|
||||
controlIn_SNES();
|
||||
myFile.seekSet(0); // Go back to file beginning
|
||||
println_Msg(F("Verifying..."));
|
||||
print_STR(verifying_STR, 1);
|
||||
display_Update();
|
||||
for (int currBank = 0xC0; currBank < 0xD0; currBank++) {
|
||||
draw_progressbar(((currBank - 0xC0) * 0x10000), 0x100000);
|
||||
|
@ -97,8 +97,8 @@ void setup_VBOY() {
|
||||
static const char vboyMenuItem1[] PROGMEM = "Read ROM";
|
||||
static const char vboyMenuItem2[] PROGMEM = "Read SRAM";
|
||||
static const char vboyMenuItem3[] PROGMEM = "Write SRAM";
|
||||
static const char vboyMenuItem4[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsVBOY[] PROGMEM = { vboyMenuItem1, vboyMenuItem2, vboyMenuItem3, vboyMenuItem4 };
|
||||
//static const char vboyMenuItem4[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsVBOY[] PROGMEM = { vboyMenuItem1, vboyMenuItem2, vboyMenuItem3, string_reset2 };
|
||||
|
||||
void vboyMenu() {
|
||||
convertPgm(menuOptionsVBOY, 4);
|
||||
@ -126,7 +126,8 @@ void vboyMenu() {
|
||||
}
|
||||
#if (defined(enable_OLED) || defined(enable_LCD))
|
||||
// Wait for user input
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
#endif
|
||||
@ -145,17 +146,18 @@ void vboyMenu() {
|
||||
println_Msg(F("SRAM verified OK"));
|
||||
display_Update();
|
||||
} else {
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(writeErrors);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
} else {
|
||||
print_Error(F("Cart has no SRAM"), false);
|
||||
}
|
||||
#if (defined(enable_OLED) || defined(enable_LCD))
|
||||
// Wait for user input
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
#endif
|
||||
@ -395,7 +397,8 @@ void getCartInfo_VB() {
|
||||
|
||||
#if (defined(enable_OLED) || defined(enable_LCD))
|
||||
// Wait for user input
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
#endif
|
||||
@ -417,7 +420,7 @@ void readROM_VB() {
|
||||
sd.chdir(folder);
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("Saving to "));
|
||||
print_STR(saving_to_STR, 0);
|
||||
print_Msg(folder);
|
||||
println_Msg(F("/..."));
|
||||
display_Update();
|
||||
@ -426,7 +429,7 @@ void readROM_VB() {
|
||||
EEPROM_writeAnything(0, foldern);
|
||||
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
|
||||
word d = 0;
|
||||
@ -469,7 +472,8 @@ void readROM_VB() {
|
||||
#if (defined(enable_OLED) || defined(enable_LCD))
|
||||
// Wait for user input
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
#endif
|
||||
@ -493,10 +497,10 @@ void writeSRAM_VB() {
|
||||
writeByte_VB(currByte, (myFile.read()));
|
||||
}
|
||||
myFile.close();
|
||||
println_Msg(F("Done"));
|
||||
print_STR(done_STR, 1);
|
||||
display_Update();
|
||||
} else {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
dataIn_VB();
|
||||
}
|
||||
@ -516,7 +520,7 @@ void readSRAM_VB() {
|
||||
EEPROM_writeAnything(0, foldern);
|
||||
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
for (unsigned long currBuffer = 0; currBuffer < sramSize; currBuffer += 512) {
|
||||
for (int currByte = 0; currByte < 512; currByte++) {
|
||||
@ -550,7 +554,7 @@ unsigned long verifySRAM_VB() {
|
||||
}
|
||||
myFile.close();
|
||||
} else {
|
||||
print_Error(F("SD Error"), true);
|
||||
print_Error(sd_error_STR, true);
|
||||
}
|
||||
|
||||
return writeErrors;
|
||||
|
@ -35,9 +35,9 @@
|
||||
static const char wsMenuItem1[] PROGMEM = "Read Rom";
|
||||
static const char wsMenuItem2[] PROGMEM = "Read Save";
|
||||
static const char wsMenuItem3[] PROGMEM = "Write Save";
|
||||
static const char wsMenuItem4[] PROGMEM = "Reset";
|
||||
//static const char wsMenuItem4[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char wsMenuItem5[] PROGMEM = "Write WitchOS";
|
||||
static const char *const menuOptionsWS[] PROGMEM = { wsMenuItem1, wsMenuItem2, wsMenuItem3, wsMenuItem4, wsMenuItem5 };
|
||||
static const char *const menuOptionsWS[] PROGMEM = { wsMenuItem1, wsMenuItem2, wsMenuItem3, string_reset2, wsMenuItem5 };
|
||||
|
||||
static const uint8_t wwLaunchCode[] PROGMEM = { 0xea, 0x00, 0x00, 0x00, 0xe0, 0x00, 0xff, 0xff };
|
||||
|
||||
@ -184,7 +184,8 @@ void wsMenu() {
|
||||
}
|
||||
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
|
||||
display_Update();
|
||||
wait();
|
||||
@ -404,7 +405,8 @@ void showCartInfo_WS() {
|
||||
print_Msg(F("Checksum: "));
|
||||
println_Msg(checksumStr);
|
||||
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
@ -487,14 +489,14 @@ void readROM_WS(char *outPathBuf, size_t bufferSize) {
|
||||
snprintf(outPathBuf, bufferSize, "%s/%s", folder, fileName);
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("Saving to "));
|
||||
print_STR(saving_to_STR, 0);
|
||||
print_Msg(folder);
|
||||
println_Msg(F("/..."));
|
||||
display_Update();
|
||||
|
||||
// open file on sdcard
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT))
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
|
||||
// write new folder number back to EEPROM
|
||||
foldern++;
|
||||
@ -561,7 +563,7 @@ void readSRAM_WS() {
|
||||
EEPROM_writeAnything(0, foldern);
|
||||
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT))
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
|
||||
uint32_t bank_size = (sramSize << 7);
|
||||
uint16_t end_bank = (bank_size >> 16); // 64KB per bank
|
||||
@ -591,7 +593,7 @@ void readSRAM_WS() {
|
||||
|
||||
myFile.close();
|
||||
|
||||
println_Msg(F("Done"));
|
||||
print_STR(done_STR, 1);
|
||||
display_Update();
|
||||
}
|
||||
|
||||
@ -630,10 +632,10 @@ void verifySRAM_WS() {
|
||||
println_Msg(F("passed"));
|
||||
} else {
|
||||
println_Msg(F("failed"));
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(write_errors);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
} else {
|
||||
print_Error(F("File doesn't exist"), false);
|
||||
@ -706,7 +708,7 @@ void readEEPROM_WS() {
|
||||
EEPROM_writeAnything(0, foldern);
|
||||
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT))
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
|
||||
uint32_t eepromSize = (sramSize << 7);
|
||||
uint32_t bufSize = (eepromSize < 512 ? eepromSize : 512);
|
||||
@ -738,7 +740,7 @@ void readEEPROM_WS() {
|
||||
|
||||
myFile.close();
|
||||
|
||||
println_Msg(F("Done"));
|
||||
print_STR(done_STR, 1);
|
||||
}
|
||||
|
||||
void verifyEEPROM_WS() {
|
||||
@ -784,10 +786,10 @@ void verifyEEPROM_WS() {
|
||||
println_Msg(F("passed"));
|
||||
} else {
|
||||
println_Msg(F("failed"));
|
||||
print_Msg(F("Error: "));
|
||||
print_STR(error_STR, 0);
|
||||
print_Msg(write_errors);
|
||||
println_Msg(F(" bytes "));
|
||||
print_Error(F("did not verify."), false);
|
||||
print_STR(_bytes_STR, 1);
|
||||
print_Error(did_not_verify_STR, false);
|
||||
}
|
||||
} else {
|
||||
print_Error(F("File doesn't exist"), false);
|
||||
@ -839,7 +841,7 @@ void writeEEPROM_WS() {
|
||||
|
||||
myFile.close();
|
||||
|
||||
println_Msg(F("Done"));
|
||||
print_STR(done_STR, 1);
|
||||
} else {
|
||||
print_Error(F("File doesn't exist"), false);
|
||||
}
|
||||
@ -928,7 +930,7 @@ void writeWitchOS_WS() {
|
||||
|
||||
myFile.close();
|
||||
|
||||
println_Msg(F("Done"));
|
||||
print_STR(done_STR, 1);
|
||||
} else {
|
||||
print_Error(F("File doesn't exist"), false);
|
||||
}
|
||||
@ -979,7 +981,7 @@ boolean compareChecksum_WS(const char *wsFilePath) {
|
||||
}
|
||||
|
||||
uint32_t calLength = myFile.fileSize() - 512;
|
||||
uint32_t checksum = 0;
|
||||
uint16_t checksum = 0;
|
||||
|
||||
if (wsWitch) {
|
||||
// only calcuate last 128Kbytes for wonderwitch (OS and BIOS region)
|
||||
@ -1001,18 +1003,12 @@ boolean compareChecksum_WS(const char *wsFilePath) {
|
||||
|
||||
myFile.close();
|
||||
|
||||
checksum &= 0x0000ffff;
|
||||
calLength = wsGameChecksum;
|
||||
|
||||
// don't know why formating string "%04X(%04X)" always output "xxxx(0000)"
|
||||
// so split into two snprintf
|
||||
char result[11];
|
||||
snprintf(result, 5, "%04X", calLength);
|
||||
snprintf(result + 4, 11 - 4, "(%04X)", checksum);
|
||||
snprintf(result, 11, "%04X(%04X)", wsGameChecksum, checksum);
|
||||
print_Msg(F("Result: "));
|
||||
println_Msg(result);
|
||||
|
||||
if (checksum == calLength) {
|
||||
if (checksum == wsGameChecksum) {
|
||||
println_Msg(F("Checksum matches"));
|
||||
display_Update();
|
||||
return 1;
|
||||
|
@ -102,8 +102,8 @@ void setup_WSV() {
|
||||
static const char wsvMenuItem1[] PROGMEM = "Select Cart";
|
||||
static const char wsvMenuItem2[] PROGMEM = "Read ROM";
|
||||
static const char wsvMenuItem3[] PROGMEM = "Set Size";
|
||||
static const char wsvMenuItem4[] PROGMEM = "Reset";
|
||||
static const char* const menuOptionsSV[] PROGMEM = { wsvMenuItem1, wsvMenuItem2, wsvMenuItem3, wsvMenuItem4 };
|
||||
//static const char wsvMenuItem4[] PROGMEM = "Reset"; (stored in common strings array)
|
||||
static const char* const menuOptionsSV[] PROGMEM = { wsvMenuItem1, wsvMenuItem2, wsvMenuItem3, string_reset2 };
|
||||
|
||||
void wsvMenu() {
|
||||
convertPgm(menuOptionsSV, 4);
|
||||
@ -198,14 +198,14 @@ void readROM_WSV() {
|
||||
sd.chdir(folder);
|
||||
|
||||
display_Clear();
|
||||
print_Msg(F("Saving to "));
|
||||
print_STR(saving_to_STR, 0);
|
||||
print_Msg(folder);
|
||||
println_Msg(F("/..."));
|
||||
display_Update();
|
||||
|
||||
// open file on sdcard
|
||||
if (!myFile.open(fileName, O_RDWR | O_CREAT))
|
||||
print_Error(F("Can't create file on SD"), true);
|
||||
print_Error(create_file_STR, true);
|
||||
|
||||
// write new folder number back to EEPROM
|
||||
foldern++;
|
||||
@ -233,7 +233,8 @@ void readROM_WSV() {
|
||||
compareCRC("wsv.txt", 0, 1, 0);
|
||||
|
||||
println_Msg(F(""));
|
||||
println_Msg(F("Press Button..."));
|
||||
// Prints string out of the common strings array either with or without newline
|
||||
print_STR(press_button_STR, 1);
|
||||
display_Update();
|
||||
wait();
|
||||
}
|
||||
@ -256,11 +257,11 @@ void setROMSize_WSV() {
|
||||
println_Msg(WSV[i]);
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to Change"));
|
||||
println_Msg(F("and right to Select"));
|
||||
print_STR(press_to_change_STR, 1);
|
||||
print_STR(right_to_select_STR, 1);
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to Change"));
|
||||
println_Msg(F("Press to Select"));
|
||||
print_STR(rotate_to_change_STR, 1);
|
||||
print_STR(press_to_select_STR, 1);
|
||||
#endif
|
||||
display_Update();
|
||||
|
||||
@ -278,11 +279,11 @@ void setROMSize_WSV() {
|
||||
println_Msg(WSV[i]);
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to Change"));
|
||||
println_Msg(F("and right to Select"));
|
||||
print_STR(press_to_change_STR, 1);
|
||||
print_STR(right_to_select_STR, 1);
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to Change"));
|
||||
println_Msg(F("Press to Select"));
|
||||
print_STR(rotate_to_change_STR, 1);
|
||||
print_STR(press_to_select_STR, 1);
|
||||
#endif
|
||||
display_Update();
|
||||
}
|
||||
@ -298,11 +299,11 @@ void setROMSize_WSV() {
|
||||
println_Msg(WSV[i]);
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to Change"));
|
||||
println_Msg(F("and right to Select"));
|
||||
print_STR(press_to_change_STR, 1);
|
||||
print_STR(right_to_select_STR, 1);
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to Change"));
|
||||
println_Msg(F("Press to Select"));
|
||||
print_STR(rotate_to_change_STR, 1);
|
||||
print_STR(press_to_select_STR, 1);
|
||||
#endif
|
||||
display_Update();
|
||||
}
|
||||
@ -407,20 +408,7 @@ void setCart_WSV() {
|
||||
}
|
||||
|
||||
// Rewind one line
|
||||
for (byte count_newline = 0; count_newline < 2; count_newline++) {
|
||||
while (1) {
|
||||
if (myFile.curPosition() == 0) {
|
||||
break;
|
||||
} else if (myFile.peek() == '\n') {
|
||||
myFile.seekSet(myFile.curPosition() - 1);
|
||||
break;
|
||||
} else {
|
||||
myFile.seekSet(myFile.curPosition() - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (myFile.curPosition() != 0)
|
||||
myFile.seekSet(myFile.curPosition() + 2);
|
||||
rewind_line(myFile);
|
||||
}
|
||||
|
||||
// Display database
|
||||
@ -438,7 +426,7 @@ void setCart_WSV() {
|
||||
}
|
||||
|
||||
// Skip over semicolon
|
||||
myFile.seekSet(myFile.curPosition() + 1);
|
||||
myFile.seekCur(1);
|
||||
|
||||
// Read CRC32 of first 512 bytes
|
||||
sprintf(crc_search, "%c", myFile.read());
|
||||
@ -448,7 +436,7 @@ void setCart_WSV() {
|
||||
}
|
||||
|
||||
// Skip over semicolon
|
||||
myFile.seekSet(myFile.curPosition() + 1);
|
||||
myFile.seekCur(1);
|
||||
|
||||
// Read rom size
|
||||
// Read the next ascii character and subtract 48 to convert to decimal
|
||||
@ -462,7 +450,7 @@ void setCart_WSV() {
|
||||
}
|
||||
|
||||
// Skip rest of line
|
||||
myFile.seekSet(myFile.curPosition() + 2);
|
||||
myFile.seekCur(2);
|
||||
|
||||
// Skip every 3rd line
|
||||
skip_line(&myFile);
|
||||
@ -478,11 +466,11 @@ void setCart_WSV() {
|
||||
println_Msg(F("KB"));
|
||||
println_Msg(F(""));
|
||||
#if defined(enable_OLED)
|
||||
println_Msg(F("Press left to Change"));
|
||||
println_Msg(F("and right to Select"));
|
||||
print_STR(press_to_change_STR, 1);
|
||||
print_STR(right_to_select_STR, 1);
|
||||
#elif defined(enable_LCD)
|
||||
println_Msg(F("Rotate to Change"));
|
||||
println_Msg(F("Press to Select"));
|
||||
print_STR(rotate_to_change_STR, 1);
|
||||
print_STR(press_to_select_STR, 1);
|
||||
#elif defined(SERIAL_MONITOR)
|
||||
println_Msg(F("U/D to Change"));
|
||||
println_Msg(F("Space to Select"));
|
||||
@ -501,20 +489,7 @@ void setCart_WSV() {
|
||||
|
||||
// Previous
|
||||
else if (b == 2) {
|
||||
for (byte count_newline = 0; count_newline < 7; count_newline++) {
|
||||
while (1) {
|
||||
if (myFile.curPosition() == 0) {
|
||||
break;
|
||||
} else if (myFile.peek() == '\n') {
|
||||
myFile.seekSet(myFile.curPosition() - 1);
|
||||
break;
|
||||
} else {
|
||||
myFile.seekSet(myFile.curPosition() - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (myFile.curPosition() != 0)
|
||||
myFile.seekSet(myFile.curPosition() + 2);
|
||||
rewind_line(myFile, 6);
|
||||
break;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user