V30E: Moved disabling interrupts out of the loop when reading/writing N64 eeproms

Hopefully this was the reason it sometimes froze at that point.
This commit is contained in:
sanni 2017-11-22 12:44:18 +01:00 committed by GitHub
parent fa63471333
commit 76ae5c5408
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 131 additions and 123 deletions

View File

@ -2,8 +2,8 @@
Cartridge Reader for Arduino Mega2560 Cartridge Reader for Arduino Mega2560
Author: sanni Author: sanni
Date: 2017-11-21 Date: 2017-11-22
Version: V30D Version: V30E
SD lib: https://github.com/greiman/SdFat SD lib: https://github.com/greiman/SdFat
LCD lib: https://github.com/adafruit/Adafruit_SSD1306 LCD lib: https://github.com/adafruit/Adafruit_SSD1306
@ -35,7 +35,7 @@
infinest - help with GB Memory cart infinest - help with GB Memory cart
**********************************************************************************/ **********************************************************************************/
char ver[5] = "V30D"; char ver[5] = "V30E";
/****************************************** /******************************************
Define Starting Point Define Starting Point
@ -457,6 +457,8 @@ void setup() {
Serial.println(F("Cartridge Reader")); Serial.println(F("Cartridge Reader"));
Serial.println(F("2017 sanni")); Serial.println(F("2017 sanni"));
Serial.println(""); Serial.println("");
// LED
rgb.setColor(0, 0, 255);
} }
// Init SD card // Init SD card
@ -616,6 +618,8 @@ void println_Msg(long unsigned int message) {
void display_Update() { void display_Update() {
if (enable_OLED) if (enable_OLED)
display.display(); display.display();
if (enable_Serial)
delay(100);
} }
void display_Clear() { void display_Clear() {
@ -641,43 +645,44 @@ void wait_serial() {
while (Serial.available() == 0) { while (Serial.available() == 0) {
} }
incomingByte = Serial.read() - 48; incomingByte = Serial.read() - 48;
/* if ((incomingByte == 53) && (fileName[0] != '\0')) {
// Open file on sd card
sd.chdir(folder);
if (myFile.open(fileName, O_READ)) {
// Get rom size from file
fileSize = myFile.fileSize();
if (incomingByte == 53) { // Send filesize
// Open file on sd card char tempStr[16];
sd.chdir(folder); sprintf(tempStr, "%d", fileSize);
if (myFile.open(fileName, O_READ)) { Serial.write(tempStr);
// Get rom size from file
fileSize = myFile.fileSize();
// Send file // Wait for ok
for (unsigned long currByte = 0; currByte < fileSize; currByte += 512) { while (Serial.available() == 0) {
myFile.read(sdBuffer, 512);
// Blink led
if (currByte % 2048 == 0)
PORTB ^= (1 << 4);
for (int c = 0; c < 512; c++) {
Serial.write(sdBuffer[c]);
} }
}
// Close the file: // Send file
myFile.close(); for (unsigned long currByte = 0; currByte < fileSize; currByte++) {
} // Blink led
else { if (currByte % 1024 == 0)
print_Error(F("Can't open file"), true); PORTB ^= (1 << 4);
} Serial.write(myFile.read());
} }
Serial.println(""); // Close the file:
myFile.close();
}
else {
print_Error(F("Can't open file"), true);
}
}*/
} }
byte questionBox_Serial(const char* question, char answers[7][20], int num_answers, int default_choice) { byte questionBox_Serial(const char* question, char answers[7][20], int num_answers, int default_choice) {
// Print menu to serial monitor // Print menu to serial monitor
if (enable_Serial && filebrowse) { if (filebrowse) {
Serial.print("Filebrowser: "); Serial.print("Filebrowser: ");
} }
Serial.print(question); Serial.println(question);
Serial.println(F(" Menu"));
for (byte i = 0; i < num_answers; i++) { for (byte i = 0; i < num_answers; i++) {
Serial.print(i); Serial.print(i);
Serial.print(F(")")); Serial.print(F(")"));
@ -686,15 +691,15 @@ byte questionBox_Serial(const char* question, char answers[7][20], int num_answe
// Wait for user input // Wait for user input
Serial.println(""); Serial.println("");
Serial.println(F("Please browse pages with 'u'(up) and 'd'(down)")); Serial.println(F("Please browse pages with 'u'(up) and 'd'(down)"));
Serial.print(F("and enter a selection by typing a number(0-6): _ ")); Serial.println(F("and enter a selection by typing a number(0-6): _ "));
while (Serial.available() == 0) { while (Serial.available() == 0) {
} }
// Read the incoming byte: // Read the incoming byte:
incomingByte = Serial.read() - 48; incomingByte = Serial.read() - 48;
// Import file (i) /* Import file (i)
if (incomingByte == 57) { if (incomingByte == 57) {
if (filebrowse == 1) { if (filebrowse == 1) {
// Make sure we have an import directory // Make sure we have an import directory
sd.mkdir("IMPORT", true); sd.mkdir("IMPORT", true);
@ -728,7 +733,7 @@ byte questionBox_Serial(const char* question, char answers[7][20], int num_answe
println_Msg(fileName); println_Msg(fileName);
return 7; return 7;
} }
} }*/
// Page up (u) // Page up (u)
if (incomingByte == 69) { if (incomingByte == 69) {

View File

@ -303,7 +303,7 @@ void setup_N64_Cart() {
DDRH |= (1 << 0) | (1 << 5) | (1 << 6); DDRH |= (1 << 0) | (1 << 5) | (1 << 6);
DDRC |= (1 << 0) | (1 << 1); DDRC |= (1 << 0) | (1 << 1);
// Pull RESET(PH0) low until we are ready // Pull RESET(PH0) low until we are ready
//PORTH &= ~(1 << 0); PORTH &= ~(1 << 0);
// Output a high signal on WR(PH5) RD(PH6), pins are active low therefore everything is disabled now // Output a high signal on WR(PH5) RD(PH6), pins are active low therefore everything is disabled now
PORTH |= (1 << 5) | (1 << 6); PORTH |= (1 << 5) | (1 << 6);
// Pull aleL(PC0) low and aleH(PC1) high // Pull aleL(PC0) low and aleH(PC1) high
@ -326,9 +326,8 @@ void setup_N64_Cart() {
// Wait until all is stable // Wait until all is stable
delay(300); delay(300);
// Pull RESET(PH0) high // Pull RESET(PH0) high to start eeprom
//PORTH |= (1 << 0); PORTH |= (1 << 0);
//delay(10);
} }
/****************************************** /******************************************
@ -1338,11 +1337,10 @@ void writeEeprom() {
for (byte i = 0; i < (eepPages / 64); i++) { for (byte i = 0; i < (eepPages / 64); i++) {
myFile.read(sdBuffer, 512); myFile.read(sdBuffer, 512);
// Disable interrupts for more uniform clock pulses
noInterrupts();
for (byte pageNumber = 0; pageNumber < 64; pageNumber++) { for (byte pageNumber = 0; pageNumber < 64; pageNumber++) {
// Disable interrupts for more uniform clock pulses
noInterrupts();
// Wait ~50ms between page writes or eeprom will have write errors // Wait ~50ms between page writes or eeprom will have write errors
pulseClock_N64(26000); pulseClock_N64(26000);
@ -1355,10 +1353,10 @@ void writeEeprom() {
sendData(sdBuffer[(pageNumber * 8) + j]); sendData(sdBuffer[(pageNumber * 8) + j]);
} }
sendStop(); sendStop();
interrupts();
} }
interrupts();
} }
// Close the file: // Close the file:
myFile.close(); myFile.close();
println_Msg(F("Done")); println_Msg(F("Done"));
@ -1400,10 +1398,10 @@ void readEeprom() {
} }
for (byte i = 0; i < (eepPages / 64); i++) { for (byte i = 0; i < (eepPages / 64); i++) {
for (byte pageNumber = 0; pageNumber < 64; pageNumber++) { // Disable interrupts for more uniform clock pulses
// Disable interrupts for more uniform clock pulses noInterrupts();
noInterrupts();
for (byte pageNumber = 0; pageNumber < 64; pageNumber++) {
// Send read command // Send read command
sendData(0x04); sendData(0x04);
// Send Page number // Send Page number
@ -1415,8 +1413,6 @@ void readEeprom() {
readData(); readData();
sendStop(); sendStop();
interrupts();
// OR 8 bits into one byte for a total of 8 bytes // OR 8 bits into one byte for a total of 8 bytes
for (byte j = 0; j < 64; j += 8) { for (byte j = 0; j < 64; j += 8) {
sdBuffer[(pageNumber * 8) + (j / 8)] = tempBits[0 + j] << 7 | tempBits[1 + j] << 6 | tempBits[2 + j] << 5 | tempBits[3 + j] << 4 | tempBits[4 + j] << 3 | tempBits[5 + j] << 2 | tempBits[6 + j] << 1 | tempBits[7 + j]; sdBuffer[(pageNumber * 8) + (j / 8)] = tempBits[0 + j] << 7 | tempBits[1 + j] << 6 | tempBits[2 + j] << 5 | tempBits[3 + j] << 4 | tempBits[4 + j] << 3 | tempBits[5 + j] << 2 | tempBits[6 + j] << 1 | tempBits[7 + j];
@ -1424,6 +1420,7 @@ void readEeprom() {
// Wait ~0.6ms between pages or eeprom will lock up // Wait ~0.6ms between pages or eeprom will lock up
pulseClock_N64(300); pulseClock_N64(300);
} }
interrupts();
// Write 64 pages at once to the SD card // Write 64 pages at once to the SD card
myFile.write(sdBuffer, 512); myFile.write(sdBuffer, 512);
@ -1458,10 +1455,10 @@ unsigned long verifyEeprom() {
if (myFile.open(filePath, O_READ)) { if (myFile.open(filePath, O_READ)) {
for (byte i = 0; i < (eepPages / 64); i++) { for (byte i = 0; i < (eepPages / 64); i++) {
for (byte pageNumber = 0; pageNumber < 64; pageNumber++) { // Disable interrupts for more uniform clock pulses
// Disable interrupts for more uniform clock pulses noInterrupts();
noInterrupts();
for (byte pageNumber = 0; pageNumber < 64; pageNumber++) {
// Send read command // Send read command
sendData(0x04); sendData(0x04);
// Send Page number // Send Page number
@ -1473,7 +1470,7 @@ unsigned long verifyEeprom() {
readData(); readData();
sendStop(); sendStop();
interrupts();
// OR 8 bits into one byte for a total of 8 bytes // OR 8 bits into one byte for a total of 8 bytes
for (byte j = 0; j < 64; j += 8) { for (byte j = 0; j < 64; j += 8) {
@ -1482,6 +1479,7 @@ unsigned long verifyEeprom() {
// Wait ~0.6ms between pages or eeprom will lock up // Wait ~0.6ms between pages or eeprom will lock up
pulseClock_N64(300); pulseClock_N64(300);
} }
interrupts();
// Check sdBuffer content against file on sd card // Check sdBuffer content against file on sd card
for (int c = 0; c < 512; c++) { for (int c = 0; c < 512; c++) {
@ -1987,7 +1985,7 @@ void readRom_N64() {
foldern = foldern + 1; foldern = foldern + 1;
EEPROM_writeAnything(10, foldern); EEPROM_writeAnything(10, foldern);
readn64rom: //readn64rom:
// Open file on sd card // Open file on sd card
if (!myFile.open(fileName, O_RDWR | O_CREAT)) { if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
print_Error(F("SD Error"), true); print_Error(F("SD Error"), true);
@ -2016,80 +2014,85 @@ readn64rom:
// Close the file: // Close the file:
myFile.close(); myFile.close();
calcn64crc: /*calcn64crc:
// Calculate Checksum and convert to string // Calculate Checksum and convert to string
println_Msg(F("Calculating CRC..")); println_Msg(F("Calculating CRC.."));
display_Update(); display_Update();
char crcStr[9]; char crcStr[9];
sprintf(crcStr, "%08lx", crc32()); sprintf(crcStr, "%08lx", crc32());
// Print checksum // Print checksum
println_Msg(crcStr); println_Msg(crcStr);
display_Update();
// Search n64.txt for crc
if (searchCRC(crcStr)) {
// Dump was a known good rom
println_Msg(F("Checksum matches"));
println_Msg(F(""));
println_Msg(F("Press Button..."));
display_Update(); display_Update();
wait();
}
else {
// Dump was bad or unknown
rgb.setColor(255, 0, 0);
// N64 CRC32 error Menu
unsigned char CRCMenu;
// Copy menuOptions out of progmem
convertPgm(menuOptionsN64CRC, 4);
char tempStr3[20]; // Search n64.txt for crc
strcpy(tempStr3, "CRC ERROR "); if (searchCRC(crcStr)) {
strcat(tempStr3, crcStr); // Dump was a known good rom
println_Msg(F("Checksum matches"));
CRCMenu = question_box(tempStr3, menuOptions, 4, 1); println_Msg(F(""));
println_Msg(F("Press Button..."));
// wait for user choice to come back from the question box menu display_Update();
switch (CRCMenu) wait();
{
case 0:
// Change to last directory
sd.chdir(folder);
display_Clear();
// Calculate CRC again
rgb.setColor(0, 0, 0);
goto calcn64crc;
break;
case 1:
// Change to last directory
sd.chdir(folder);
// Delete old file
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
print_Error(F("SD Error"), true);
}
if (!myFile.remove()) {
print_Error(F("Delete Error"), true);
}
// Dump again
display_Clear();
println_Msg(F("Reading Rom..."));
display_Update();
rgb.setColor(0, 0, 0);
goto readn64rom;
break;
case 2:
// Return to N64 menu
break;
case 3:
// Reset
asm volatile (" jmp 0");
break;
} }
} else {
// Dump was bad or unknown
rgb.setColor(255, 0, 0);
// N64 CRC32 error Menu
unsigned char CRCMenu;
// Copy menuOptions out of progmem
convertPgm(menuOptionsN64CRC, 4);
char tempStr3[20];
strcpy(tempStr3, "CRC ERROR ");
strcat(tempStr3, crcStr);
CRCMenu = question_box(tempStr3, menuOptions, 4, 1);
// wait for user choice to come back from the question box menu
switch (CRCMenu)
{
case 0:
// Change to last directory
sd.chdir(folder);
display_Clear();
// Calculate CRC again
rgb.setColor(0, 0, 0);
goto calcn64crc;
break;
case 1:
// Change to last directory
sd.chdir(folder);
// Delete old file
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
print_Error(F("SD Error"), true);
}
if (!myFile.remove()) {
print_Error(F("Delete Error"), true);
}
// Dump again
display_Clear();
println_Msg(F("Reading Rom..."));
display_Update();
rgb.setColor(0, 0, 0);
goto readn64rom;
break;
case 2:
// Return to N64 menu
break;
case 3:
// Reset
asm volatile (" jmp 0");
break;
}
}
display_Update();*/
println_Msg(F("Done."));
println_Msg(F(""));
println_Msg(F("Press Button..."));
display_Update(); display_Update();
wait();
} }
/****************************************** /******************************************