diff --git a/Cart_Reader/Cart_Reader.ino b/Cart_Reader/Cart_Reader.ino index 4b55b5f..4b3e824 100644 --- a/Cart_Reader/Cart_Reader.ino +++ b/Cart_Reader/Cart_Reader.ino @@ -4,7 +4,7 @@ This project represents a community-driven effort to provide an easy to build and easy to modify cartridge dumper. - Date: 17.11.2021 + Date: 18.11.2021 Version: 7.2 SD lib: https://github.com/greiman/SdFat @@ -140,6 +140,7 @@ Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // Adafruit Clock Generator #include Si5351 clockgen; +bool i2c_found; // RTC Library #ifdef RTC_installed @@ -1804,7 +1805,7 @@ browserstart: } // Read in File as long as there are files - while (myFile.openNext(&myDir, O_READ)) { + while (myFile.openNext(&myDir, O_READ) && (currFile < 29)) { // Get name of file myFile.getName(nameStr, FILENAME_LENGTH); @@ -1994,9 +1995,11 @@ void loop() { } #endif #ifdef enable_NP +#ifdef enable_FLASH else if (mode == mode_SFM_Flash) { sfmFlashMenu(); } +#endif else if (mode == mode_SFM_Game) { sfmGameOptions(); } diff --git a/Cart_Reader/GB.ino b/Cart_Reader/GB.ino index def9777..34b189f 100644 --- a/Cart_Reader/GB.ino +++ b/Cart_Reader/GB.ino @@ -242,8 +242,8 @@ void gbMenu() { // create menu with title and 3 options to choose from unsigned char mainMenu; // Copy menuOptions out of progmem - convertPgm(menuOptionsGB, 3); - mainMenu = question_box(F("GB Cart Reader"), menuOptions, 3, 0); + convertPgm(menuOptionsGB, 4); + mainMenu = question_box(F("GB Cart Reader"), menuOptions, 4, 0); // wait for user choice to come back from the question box menu switch (mainMenu) diff --git a/Cart_Reader/N64.ino b/Cart_Reader/N64.ino index 21f8a59..8d56047 100644 --- a/Cart_Reader/N64.ino +++ b/Cart_Reader/N64.ino @@ -431,15 +431,20 @@ void setup_N64_Cart() { #ifdef clockgen_calibration int32_t clock_offset = readClockOffset(); if (clock_offset > INT32_MIN) { - clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, clock_offset); + i2c_found = clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, clock_offset); } else { - clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0); + i2c_found = clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0); } #else // last number is the clock correction factor which is custom for each clock generator - clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0); + i2c_found = clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0); #endif + if (!i2c_found) { + display_Clear(); + print_Error(F("Clock Generator not found"), true); + } + // Set Eeprom clock to 2Mhz clockgen.set_freq(200000000ULL, SI5351_CLK1); @@ -3549,7 +3554,7 @@ redumpsamefolder: myFile.close(); unsigned long timeElapsed = (millis() - startTime) / 1000; // seconds - + print_Msg(F("CRC: ")); // convert checksum to string char crcStr[9]; diff --git a/Cart_Reader/NP.ino b/Cart_Reader/NP.ino index 6efaefb..af8046a 100644 --- a/Cart_Reader/NP.ino +++ b/Cart_Reader/NP.ino @@ -609,22 +609,30 @@ void setup_SFM() { #ifdef clockgen_calibration int32_t clock_offset = readClockOffset(); if (clock_offset > INT32_MIN) { - clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, clock_offset); + i2c_found = clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, clock_offset); } else { - clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0); + i2c_found = clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0); } #else - clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0); + i2c_found = clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0); #endif - clockgen.set_pll(SI5351_PLL_FIXED, SI5351_PLLA); - clockgen.set_pll(SI5351_PLL_FIXED, SI5351_PLLB); - clockgen.set_freq(2147727200ULL, SI5351_CLK0); + if (i2c_found) { + clockgen.set_pll(SI5351_PLL_FIXED, SI5351_PLLA); + clockgen.set_pll(SI5351_PLL_FIXED, SI5351_PLLB); + clockgen.set_freq(2147727200ULL, SI5351_CLK0); - // start outputting master clock - clockgen.output_enable(SI5351_CLK1, 0); - clockgen.output_enable(SI5351_CLK2, 0); - clockgen.output_enable(SI5351_CLK0, 1); + // start outputting master clock + clockgen.output_enable(SI5351_CLK1, 0); + clockgen.output_enable(SI5351_CLK2, 0); + clockgen.output_enable(SI5351_CLK0, 1); + } +#ifdef clockgen_installed + else { + display_Clear(); + print_Error(F("Clock Generator not found"), true); + } +#endif // Wait until all is stable delay(500); diff --git a/Cart_Reader/SNES.ino b/Cart_Reader/SNES.ino index 581c21f..6043837 100644 --- a/Cart_Reader/SNES.ino +++ b/Cart_Reader/SNES.ino @@ -139,14 +139,14 @@ void snsMenu() { // create menu with title and 6 options to choose from unsigned char snsCart; // Copy menuOptions out of progmem - #ifdef clockgen_calibration +#ifdef clockgen_calibration convertPgm(menuOptionsSNS, 6); snsCart = question_box(F("Select Cart Type"), menuOptions, 6, 0); - #else +#else convertPgm(menuOptionsSNS, 5); snsCart = question_box(F("Select Cart Type"), menuOptions, 5, 0); - #endif - +#endif + // wait for user choice to come back from the question box menu switch (snsCart) @@ -167,12 +167,14 @@ void snsMenu() { break; #endif +#ifdef enable_SV case 2: display_Clear(); display_Update(); setup_SV(); mode = mode_SV; break; +#endif #ifdef enable_FLASH case 3: @@ -186,7 +188,7 @@ void snsMenu() { break; case 5: -#endif +#endif resetArduino(); break; } @@ -385,9 +387,11 @@ void stopSnesClocks_resetCic_resetCart() { PORTG |= (1 << 1); // pull high = reset CIC DDRH |= (1 << 0); // Set RST(PH0) pin to Output PORTH &= ~(1 << 0); // Switch RST(PH0) to LOW - clockgen.output_enable(SI5351_CLK1, 0); // CPU clock - clockgen.output_enable(SI5351_CLK2, 0); // CIC clock - clockgen.output_enable(SI5351_CLK0, 0); // master clock + if (i2c_found) { + clockgen.output_enable(SI5351_CLK1, 0); // CPU clock + clockgen.output_enable(SI5351_CLK2, 0); // CIC clock + clockgen.output_enable(SI5351_CLK0, 0); // master clock + } } /****************************************** @@ -457,28 +461,36 @@ void setup_Snes() { #ifdef clockgen_calibration int32_t clock_offset = readClockOffset(); if (clock_offset > INT32_MIN) { - clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, clock_offset); + i2c_found = clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, clock_offset); } else { - clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0); + i2c_found = clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0); } #else // last number is the clock correction factor which is custom for each clock generator - clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0); + i2c_found = clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0); #endif - // Set clocks to 4Mhz/1Mhz for better SA-1 unlocking - clockgen.set_freq(100000000ULL, SI5351_CLK1); // CPU - clockgen.set_freq(100000000ULL, SI5351_CLK2); // CIC - clockgen.set_freq(400000000ULL, SI5351_CLK0); // EXT + if (i2c_found) { + // Set clocks to 4Mhz/1Mhz for better SA-1 unlocking + clockgen.set_freq(100000000ULL, SI5351_CLK1); // CPU + clockgen.set_freq(100000000ULL, SI5351_CLK2); // CIC + clockgen.set_freq(400000000ULL, SI5351_CLK0); // EXT - // Start outputting master clock, CIC clock - clockgen.output_enable(SI5351_CLK1, 0); // no CPU clock yet; seems to affect SA-1 success a lot - clockgen.output_enable(SI5351_CLK2, 1); // CIC clock (should go before master clock) - clockgen.output_enable(SI5351_CLK0, 1); // master clock + // Start outputting master clock, CIC clock + clockgen.output_enable(SI5351_CLK1, 0); // no CPU clock yet; seems to affect SA-1 success a lot + clockgen.output_enable(SI5351_CLK2, 1); // CIC clock (should go before master clock) + clockgen.output_enable(SI5351_CLK0, 1); // master clock - // Wait for clock generator - clockgen.update_status(); - delay(500); + // Wait for clock generator + clockgen.update_status(); + delay(500); + } +#ifdef clockgen_installed + else { + display_Clear(); + print_Error(F("Clock Generator not found"), true); + } +#endif // Start CIC by outputting a low signal to cicrstPin(PG1) PORTG &= ~(1 << 1); @@ -489,10 +501,12 @@ void setup_Snes() { // Print all the info getCartInfo_SNES(); - //Set clocks to standard or else SA-1 sram writing will fail - clockgen.set_freq(2147727200ULL, SI5351_CLK0); - clockgen.set_freq(357954500ULL, SI5351_CLK1); - clockgen.set_freq(307200000ULL, SI5351_CLK2); + if (i2c_found) { + //Set clocks to standard or else SA-1 sram writing will fail + clockgen.set_freq(2147727200ULL, SI5351_CLK0); + clockgen.set_freq(357954500ULL, SI5351_CLK1); + clockgen.set_freq(307200000ULL, SI5351_CLK2); + } } /****************************************** @@ -1490,8 +1504,10 @@ void writeSRAM (boolean browseFile) { // SA1 else if (romType == SA) { long lastByte = (long(sramSize) * 128); - // Enable CPU Clock - clockgen.output_enable(SI5351_CLK1, 1); + if (i2c_found) { + // Enable CPU Clock + clockgen.output_enable(SI5351_CLK1, 1); + } // Direct writes to BW-RAM (SRAM) in banks 0x40-0x43 don't work // Break BW-RAM (SRAM) into 0x2000 blocks @@ -1532,8 +1548,10 @@ void writeSRAM (boolean browseFile) { writeBank_SNES(0, 0x2224, 0); writeBank_SNES(0, 0x2226, 0x80); writeBank_SNES(0, 0x6000, firstByte); - // Disable CPU clock - clockgen.output_enable(SI5351_CLK1, 0); + if (i2c_found) { + // Disable CPU clock + clockgen.output_enable(SI5351_CLK1, 0); + } } // Set pins to input @@ -1986,8 +2004,10 @@ boolean eraseSRAM (byte b) { // SA1 else if (romType == SA) { long lastByte = (long(sramSize) * 128); - // Enable CPU Clock - clockgen.output_enable(SI5351_CLK1, 1); + if (i2c_found) { + // Enable CPU Clock + clockgen.output_enable(SI5351_CLK1, 1); + } // Direct writes to BW-RAM (SRAM) in banks 0x40-0x43 don't work // Break BW-RAM (SRAM) into 0x2000 blocks @@ -2024,8 +2044,11 @@ boolean eraseSRAM (byte b) { writeBank_SNES(0, 0x2224, 0); writeBank_SNES(0, 0x2226, 0x80); writeBank_SNES(0, 0x6000, b); - // Disable CPU clock - clockgen.output_enable(SI5351_CLK1, 0); + + if (i2c_found) { + // Disable CPU clock + clockgen.output_enable(SI5351_CLK1, 0); + } } dataIn(); diff --git a/Cart_Reader/SV.ino b/Cart_Reader/SV.ino index f40b65d..3026f3a 100644 --- a/Cart_Reader/SV.ino +++ b/Cart_Reader/SV.ino @@ -113,14 +113,22 @@ void setup_SV() { DDRG &= ~(1 << 0); // Adafruit Clock Generator - clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0); - clockgen.set_pll(SI5351_PLL_FIXED, SI5351_PLLA); - clockgen.set_pll(SI5351_PLL_FIXED, SI5351_PLLB); - clockgen.set_freq(2147727200ULL, SI5351_CLK0); - clockgen.set_freq(307200000ULL, SI5351_CLK2); - clockgen.output_enable(SI5351_CLK0, 1); - clockgen.output_enable(SI5351_CLK1, 0); - clockgen.output_enable(SI5351_CLK2, 1); + i2c_found = clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0); + if (i2c_found) { + clockgen.set_pll(SI5351_PLL_FIXED, SI5351_PLLA); + clockgen.set_pll(SI5351_PLL_FIXED, SI5351_PLLB); + clockgen.set_freq(2147727200ULL, SI5351_CLK0); + clockgen.set_freq(307200000ULL, SI5351_CLK2); + clockgen.output_enable(SI5351_CLK0, 1); + clockgen.output_enable(SI5351_CLK1, 0); + clockgen.output_enable(SI5351_CLK2, 1); + } +#ifdef clockgen_installed + else { + display_Clear(); + print_Error(F("Clock Generator not found"), true); + } +#endif // Set Address Pins to Output //A0-A7 diff --git a/Cart_Reader/clkcal.ino b/Cart_Reader/clkcal.ino index f929160..31503bb 100644 --- a/Cart_Reader/clkcal.ino +++ b/Cart_Reader/clkcal.ino @@ -31,11 +31,17 @@ void clkcal() { delay(500); if (cal_factor > INT32_MIN) { - clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, cal_factor); + i2c_found = clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, cal_factor); } else { - clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0); + i2c_found = clockgen.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0); cal_factor = 0; } + + if (!i2c_found) { + display_Clear(); + print_Error(F("Clock Generator not found"), true); + } + //clockgen.set_correction(cal_factor, SI5351_PLL_INPUT_XO); clockgen.set_pll(SI5351_PLL_FIXED, SI5351_PLLA); clockgen.set_pll(SI5351_PLL_FIXED, SI5351_PLLB); @@ -51,7 +57,7 @@ void clkcal() { // Frequency Counter delay(500); FreqCount.begin(1000); - while (1) + while (1) { if (old_cal != cal_factor) { display_Clear(); @@ -76,7 +82,7 @@ void clkcal() { clockgen.update_status(); while (clockgen.dev_status.SYS_INIT == 1) { } - + if (FreqCount.available()) { float count = FreqCount.read(); display_Clear(); @@ -94,19 +100,19 @@ void clkcal() { println_Msg(F("")); println_Msg(F("Decrease Increase")); #else - #ifdef enable_rotary +#ifdef enable_rotary println_Msg(F("Rotate to adjust")); - #else +#else println_Msg(F("Click/dbl to adjust")); - #endif +#endif #endif display_Update(); } - #ifdef enable_Button2 +#ifdef enable_Button2 // get input button int a = checkButton1(); int b = checkButton2(); - + // if the cart readers input button is pressed shortly if (a == 1) { old_cal = cal_factor; @@ -116,7 +122,7 @@ void clkcal() { old_cal = cal_factor; cal_factor += cal_offset; } - + // if the cart readers input buttons is double clicked if (a == 2) { cal_offset /= 10ULL; @@ -132,7 +138,7 @@ void clkcal() { cal_offset = 1; } } - + // if the cart readers input button is pressed long if (a == 3) { savetofile(); @@ -141,30 +147,30 @@ void clkcal() { savetofile(); } #else - //Handle inputs for either rotary encoder or single button interface. - int a = checkButton(); - - if (a == 1) { //clockwise rotation or single click - old_cal = cal_factor; - cal_factor += cal_offset; - } + //Handle inputs for either rotary encoder or single button interface. + int a = checkButton(); - if (a == 2) { //counterclockwise rotation or double click - old_cal = cal_factor; - cal_factor -= cal_offset; - } + if (a == 1) { //clockwise rotation or single click + old_cal = cal_factor; + cal_factor += cal_offset; + } - if (a == 3) { //button short hold - cal_offset *= 10ULL; + if (a == 2) { //counterclockwise rotation or double click + old_cal = cal_factor; + cal_factor -= cal_offset; + } + + if (a == 3) { //button short hold + cal_offset *= 10ULL; if (cal_offset > 100000000ULL) { cal_offset = 1; } - } + } - if (a == 4) { //button long hold - savetofile(); - } + if (a == 4) { //button long hold + savetofile(); + } #endif } } @@ -180,7 +186,7 @@ void print_right(int32_t number) if (abs_number == 0) abs_number = 1; - while(abs_number < 100000000ULL) + while (abs_number < 100000000ULL) { print_Msg(F(" ")); abs_number *= 10ULL;