Add new options to SNES CFI repro menu

This commit is contained in:
sanni 2024-08-07 14:53:07 +02:00
parent c9f216e531
commit c4f84d9253
2 changed files with 291 additions and 67 deletions

View File

@ -72,7 +72,7 @@ void flashMenu() {
case 0: case 0:
setupCFI(); setupCFI();
flashSize = 8388608; flashSize = 8388608;
writeCFI_Flash(0); writeCFI_Flash(1, 1, 0);
verifyFlash(); verifyFlash();
print_STR(press_button_STR, 0); print_STR(press_button_STR, 0);
display_Update(); display_Update();
@ -124,7 +124,7 @@ void flashMenu() {
case 0: case 0:
setupCFI(); setupCFI();
flashSize = 8388608; flashSize = 8388608;
writeCFI_Flash(0); writeCFI_Flash(1, 1, 0);
verifyFlash(); verifyFlash();
print_STR(press_button_STR, 0); print_STR(press_button_STR, 0);
display_Update(); display_Update();
@ -940,7 +940,7 @@ void writeByte_Flash(unsigned long myAddress, byte myData) {
PORTL |= (1 << 6); PORTL |= (1 << 6);
} }
// for SNES LoRom repro with 2x 2MB // for SNES LoRom repro with 2x 2MB
else if (mapping == 11) { else if (mapping == 122) {
// A8-A14 // A8-A14
PORTK = (myAddress >> 8) & 0x7F; PORTK = (myAddress >> 8) & 0x7F;
// Set SNES A15(PK7) HIGH to disable SRAM // Set SNES A15(PK7) HIGH to disable SRAM
@ -951,7 +951,7 @@ void writeByte_Flash(unsigned long myAddress, byte myData) {
PORTL ^= (1 << 6); PORTL ^= (1 << 6);
} }
// for SNES HiRom repro with 2x 2MB // for SNES HiRom repro with 2x 2MB
else if (mapping == 22) { else if (mapping == 222) {
// A8-A15 // A8-A15
PORTK = (myAddress >> 8) & 0xFF; PORTK = (myAddress >> 8) & 0xFF;
// A16-A23 // A16-A23
@ -962,7 +962,7 @@ void writeByte_Flash(unsigned long myAddress, byte myData) {
PORTL |= (1 << 6); PORTL |= (1 << 6);
} }
// for SNES ExLoRom repro with 2x 4MB // for SNES ExLoRom repro with 2x 4MB
else if (mapping == 111) { else if (mapping == 124) {
// A8-A14 // A8-A14
PORTK = (myAddress >> 8) & 0x7F; PORTK = (myAddress >> 8) & 0x7F;
// Set SNES A15(PK7) HIGH to disable SRAM // Set SNES A15(PK7) HIGH to disable SRAM
@ -972,8 +972,8 @@ void writeByte_Flash(unsigned long myAddress, byte myData) {
// Flip A22(PL7) to reverse P0 and P1 roms // Flip A22(PL7) to reverse P0 and P1 roms
PORTL ^= (1 << 7); PORTL ^= (1 << 7);
} }
// for SNES ExHiRom repro // for SNES ExHiRom repro with 2x 4MB
else if (mapping == 222) { else if (mapping == 224) {
// A8-A15 // A8-A15
PORTK = (myAddress >> 8) & 0xFF; PORTK = (myAddress >> 8) & 0xFF;
// A16-A22 // A16-A22
@ -989,6 +989,38 @@ void writeByte_Flash(unsigned long myAddress, byte myData) {
// Switch SNES BA6(PL6) to HIGH to disable SRAM // Switch SNES BA6(PL6) to HIGH to disable SRAM
PORTL |= (1 << 6); PORTL |= (1 << 6);
} }
// for SNES ExLoRom repro with 4x 2MB
else if (mapping == 142) {
// A8-A14
PORTK = (myAddress >> 8) & 0x7F;
// Set SNES A15(PK7) HIGH to disable SRAM
PORTK |= (1 << 7);
// A15-A22
PORTL = (myAddress >> 15) & 0xFF;
// Flip BA6(PL6) to address second rom chip
PORTL ^= (1 << 6);
// Flip A22(PL7) to reverse P0 and P1 roms
PORTL ^= (1 << 7);
}
// for SNES ExHiRom repro with 4x 2MB
else if (mapping == 242) {
// A8-A15
PORTK = (myAddress >> 8) & 0xFF;
// A16-A22
PORTL = (myAddress >> 16) & 0xFF;
// Flip BA5(PL5) to address second rom chip
PORTL ^= (1 << 5);
// Set PL7 to inverse of PL6 to reverse P0 and P1 roms
if (!(((myAddress >> 16) & 0xFF) & 0x40)) {
// if PL6 is 0 set PL7 to 1
PORTL |= (1 << 7);
} else if (((myAddress >> 16) & 0xFF) & 0x40) {
// if PL6 is 1 set PL7 to 0
PORTL &= ~(1 << 7);
}
// Switch SNES BA6(PL6) to HIGH to disable SRAM
PORTL |= (1 << 6);
}
// Data // Data
PORTC = myData; PORTC = myData;
@ -1055,7 +1087,7 @@ byte readByte_Flash(unsigned long myAddress) {
PORTL |= (1 << 6); PORTL |= (1 << 6);
} }
// for SNES LoRom repro with 2x 2MB // for SNES LoRom repro with 2x 2MB
else if (mapping == 11) { else if (mapping == 122) {
// A8-A14 // A8-A14
PORTK = (myAddress >> 8) & 0x7F; PORTK = (myAddress >> 8) & 0x7F;
// Set SNES A15(PK7) HIGH to disable SRAM // Set SNES A15(PK7) HIGH to disable SRAM
@ -1066,7 +1098,7 @@ byte readByte_Flash(unsigned long myAddress) {
PORTL ^= (1 << 6); PORTL ^= (1 << 6);
} }
// for SNES HiRom repro with 2x 2MB // for SNES HiRom repro with 2x 2MB
else if (mapping == 22) { else if (mapping == 222) {
// A8-A15 // A8-A15
PORTK = (myAddress >> 8) & 0xFF; PORTK = (myAddress >> 8) & 0xFF;
// A16-A23 // A16-A23
@ -1076,8 +1108,8 @@ byte readByte_Flash(unsigned long myAddress) {
// Switch SNES BA6(PL6) to HIGH to disable SRAM // Switch SNES BA6(PL6) to HIGH to disable SRAM
PORTL |= (1 << 6); PORTL |= (1 << 6);
} }
// for SNES ExLoRom repro // for SNES ExLoRom repro with 2x 4MB
else if (mapping == 111) { else if (mapping == 124) {
// A8-A14 // A8-A14
PORTK = (myAddress >> 8) & 0x7F; PORTK = (myAddress >> 8) & 0x7F;
// Set SNES A15(PK7) HIGH to disable SRAM // Set SNES A15(PK7) HIGH to disable SRAM
@ -1087,8 +1119,8 @@ byte readByte_Flash(unsigned long myAddress) {
// Flip A22(PL7) to reverse P0 and P1 roms // Flip A22(PL7) to reverse P0 and P1 roms
PORTL ^= (1 << 7); PORTL ^= (1 << 7);
} }
// for SNES ExHiRom repro // for SNES ExHiRom repro with 2x 4MB
else if (mapping == 222) { else if (mapping == 224) {
// A8-A15 // A8-A15
PORTK = (myAddress >> 8) & 0xFF; PORTK = (myAddress >> 8) & 0xFF;
// A16-A22 // A16-A22
@ -1104,6 +1136,38 @@ byte readByte_Flash(unsigned long myAddress) {
// Switch SNES BA6(PL6) to HIGH to disable SRAM // Switch SNES BA6(PL6) to HIGH to disable SRAM
PORTL |= (1 << 6); PORTL |= (1 << 6);
} }
// for SNES ExLoRom repro with 4x 2MB
else if (mapping == 142) {
// A8-A14
PORTK = (myAddress >> 8) & 0x7F;
// Set SNES A15(PK7) HIGH to disable SRAM
PORTK |= (1 << 7);
// A15-A22
PORTL = (myAddress >> 15) & 0xFF;
// Flip BA6(PL6) to address second rom chip
PORTL ^= (1 << 6);
// Flip A22(PL7) to reverse P0 and P1 roms
PORTL ^= (1 << 7);
}
// for SNES ExHiRom repro with 4x 2MB
else if (mapping == 242) {
// A8-A15
PORTK = (myAddress >> 8) & 0xFF;
// A16-A22
PORTL = (myAddress >> 16) & 0xFF;
// Flip BA5(PL5) to address second rom chip
PORTL ^= (1 << 5);
// Set PL7 to inverse of PL6 to reverse P0 and P1 roms
if (!(((myAddress >> 16) & 0xFF) & 0x40)) {
// if PL6 is 0 set PL7 to 1
PORTL |= (1 << 7);
} else if (((myAddress >> 16) & 0xFF) & 0x40) {
// if PL6 is 1 set PL7 to 0
PORTL &= ~(1 << 7);
}
// Switch SNES BA6(PL6) to HIGH to disable SRAM
PORTL |= (1 << 6);
}
// Arduino running at 16Mhz -> one nop = 62.5ns // Arduino running at 16Mhz -> one nop = 62.5ns
__asm__("nop\n\t" __asm__("nop\n\t"
@ -1964,26 +2028,42 @@ void blankcheck_Flash() {
} }
void verifyFlash() { void verifyFlash() {
verifyFlash(0); verifyFlash(1, 1, 0);
} }
void verifyFlash(byte romChips) { void verifyFlash(byte currChip, byte totalChips, boolean reversed) {
if (openVerifyFlashFile()) { if (openVerifyFlashFile()) {
blank = 0; blank = 0;
if (romChips == 1) { if ((currChip == 1) && (totalChips == 4)) {
myFile.seekCur(0); if (reversed)
// Truncate file to size of 1st flash chip myFile.seekSet(4194304);
if (fileSize > flashSize / 2) { fileSize = 2097152;
fileSize = flashSize / 2; } else if ((currChip == 2) && (totalChips == 4) && (fileSize > 6291456)) {
} if (reversed)
} else if (romChips == 2) { myFile.seekSet(6291456);
if (fileSize > flashSize / 2) { fileSize = 2097152;
myFile.seekCur(flashSize / 2); } else if ((currChip == 3) && (totalChips == 4)) {
fileSize = fileSize - (flashSize / 2); if (reversed)
} else myFile.seekSet(0);
fileSize = 0; fileSize = 2097152;
} } else if ((currChip == 4) && (totalChips == 4)) {
if (reversed)
myFile.seekSet(2097152);
fileSize = 2097152;
} else if ((currChip == 1) && (totalChips == 2)) {
if (reversed)
myFile.seekSet(4194304);
fileSize = 4194304;
} else if ((currChip == 2) && (totalChips == 2)) {
if (reversed)
myFile.seekSet(0);
fileSize = 4194304;
} else if ((currChip == 1) && (totalChips == 1)) {
if (reversed)
myFile.seekSet(4194304);
} else
fileSize = 0; // skip write
//Initialize progress bar //Initialize progress bar
uint32_t processedProgressBar = 0; uint32_t processedProgressBar = 0;
@ -1991,6 +2071,15 @@ void verifyFlash(byte romChips) {
draw_progressbar(0, totalProgressBar); draw_progressbar(0, totalProgressBar);
for (unsigned long currByte = 0; currByte < fileSize; currByte += 512) { for (unsigned long currByte = 0; currByte < fileSize; currByte += 512) {
if ((reversed) && (currChip == 1) && (totalChips == 1) && (fileSize == 8388608) && (currByte == 4194304)) {
myFile.seekSet(0);
}
if ((reversed) && (currChip == 1) && (totalChips == 1) && (fileSize == 6291456) && (currByte == 2097152)) {
myFile.seekSet(0);
currByte = 4194304;
fileSize = 8388608;
}
//fill sdBuffer //fill sdBuffer
myFile.read(sdBuffer, 512); myFile.read(sdBuffer, 512);
for (int c = 0; c < 512; c++) { for (int c = 0; c < 512; c++) {
@ -2765,7 +2854,7 @@ void identifyCFI_Flash() {
} }
// Write flashrom // Write flashrom
void writeCFI_Flash(byte romChips) { void writeCFI_Flash(byte currChip, byte totalChips, boolean reversed) {
if (openFileOnSD()) { if (openFileOnSD()) {
// Print filepath // Print filepath
print_STR(flashing_file_STR, 0); print_STR(flashing_file_STR, 0);
@ -2807,29 +2896,41 @@ void writeCFI_Flash(byte romChips) {
} }
print_Msg(F("Writing flash")); print_Msg(F("Writing flash"));
// If we have two ROM chips only write half the ROM file here and skip to second half of file on second write print_Msg(FS(FSTRING_SPACE));
if (romChips == 0) { print_Msg(currChip);
println_Msg(F("")); print_Msg(F("/"));
} println_Msg(totalChips);
else if (romChips == 1) { if ((currChip == 1) && (totalChips == 4)) {
println_Msg(F(" 1/2")); if (reversed)
myFile.seekCur(0); myFile.seekSet(4194304);
// Truncate file to size of 1st flash chip fileSize = 2097152;
if (fileSize > flashSize / 2) { } else if ((currChip == 2) && (totalChips == 4) && (fileSize > 6291456)) {
fileSize = flashSize / 2; if (reversed)
} myFile.seekSet(6291456);
} fileSize = 2097152;
} else if ((currChip == 3) && (totalChips == 4)) {
if (reversed)
myFile.seekSet(0);
fileSize = 2097152;
} else if ((currChip == 4) && (totalChips == 4)) {
if (reversed)
myFile.seekSet(2097152);
fileSize = 2097152;
} else if ((currChip == 1) && (totalChips == 2)) {
if (reversed)
myFile.seekSet(4194304);
fileSize = 4194304;
} else if ((currChip == 2) && (totalChips == 2)) {
if (reversed)
myFile.seekSet(0);
fileSize = 4194304;
} else if ((currChip == 1) && (totalChips == 1)) {
if (reversed)
myFile.seekSet(4194304);
} else
fileSize = 0; // skip write
else if (romChips == 2) {
println_Msg(F(" 2/2"));
if (fileSize > flashSize / 2) {
myFile.seekCur(flashSize / 2);
fileSize = fileSize - (flashSize / 2);
} else {
fileSize = 0;
}
}
display_Update(); display_Update();
//Initialize progress bar //Initialize progress bar
@ -2838,6 +2939,15 @@ void writeCFI_Flash(byte romChips) {
draw_progressbar(0, totalProgressBar); draw_progressbar(0, totalProgressBar);
for (unsigned long currAddr = 0; currAddr < fileSize; currAddr += 512) { for (unsigned long currAddr = 0; currAddr < fileSize; currAddr += 512) {
if ((reversed) && (currChip == 1) && (totalChips == 1) && (fileSize == 8388608) && (currAddr == 4194304)) {
myFile.seekSet(0);
}
if ((reversed) && (currChip == 1) && (totalChips == 1) && (fileSize == 6291456) && (currAddr == 2097152)) {
myFile.seekSet(0);
currAddr = 4194304;
fileSize = 8388608;
}
myFile.read(sdBuffer, 512); myFile.read(sdBuffer, 512);
// Blink led // Blink led

View File

@ -66,7 +66,15 @@ static const char* const menuOptionsRepro[] PROGMEM = { reproMenuItem1, reproMen
static const char reproCFIItem1[] PROGMEM = "1x 2MB"; static const char reproCFIItem1[] PROGMEM = "1x 2MB";
static const char reproCFIItem2[] PROGMEM = "2x 2MB"; static const char reproCFIItem2[] PROGMEM = "2x 2MB";
static const char reproCFIItem3[] PROGMEM = "1x 4MB"; static const char reproCFIItem3[] PROGMEM = "1x 4MB";
static const char* const menuOptionsReproCFI[] PROGMEM = { reproCFIItem1, reproCFIItem2, reproCFIItem3, FSTRING_RESET }; static const char reproCFIItem4[] PROGMEM = "2x 4MB";
static const char reproCFIItem5[] PROGMEM = "4x 2MB";
static const char reproCFIItem6[] PROGMEM = "1x 8MB";
static const char* const menuOptionsReproCFI[] PROGMEM = { reproCFIItem1, reproCFIItem2, reproCFIItem3, reproCFIItem4, reproCFIItem5, reproCFIItem6, FSTRING_RESET };
// EX ROM config
static const char reproEXItem1[] PROGMEM = "standard (ABCD)";
static const char reproEXItem2[] PROGMEM = "reversed (CDAB)";
static const char* const menuOptionsReproEX[] PROGMEM = { reproEXItem1, reproEXItem2, FSTRING_RESET };
void setupCFI() { void setupCFI() {
#ifdef ENABLE_FLASH #ifdef ENABLE_FLASH
@ -83,13 +91,39 @@ void setupCFI() {
#endif #endif
} }
boolean reproEXMenu() {
boolean fileOrder = 0;
#ifdef ENABLE_FLASH
// create menu with title and 3 options to choose from
unsigned char snsReproEX;
// Copy menuOptions out of progmem
convertPgm(menuOptionsReproEX, 3);
snsReproEX = question_box(F("ExROM file order"), menuOptions, 3, 0);
// wait for user choice to come back from the question box menu
switch (snsReproEX) {
case 0:
fileOrder = 0;
break;
case 1:
fileOrder = 1;
break;
case 2:
resetArduino();
break;
}
#endif
return fileOrder;
}
// Setup number of flashroms // Setup number of flashroms
void reproCFIMenu() { void reproCFIMenu() {
// create menu with title and 4 options to choose from boolean reversed = 0;
// create menu with title and 7 options to choose from
unsigned char snsReproCFI; unsigned char snsReproCFI;
// Copy menuOptions out of progmem // Copy menuOptions out of progmem
convertPgm(menuOptionsReproCFI, 4); convertPgm(menuOptionsReproCFI, 7);
snsReproCFI = question_box(F("Select Flash Config"), menuOptions, 4, 0); snsReproCFI = question_box(F("Select Flash Config"), menuOptions, 7, 0);
// wait for user choice to come back from the question box menu // wait for user choice to come back from the question box menu
switch (snsReproCFI) { switch (snsReproCFI) {
@ -97,41 +131,121 @@ void reproCFIMenu() {
case 0: case 0:
setupCFI(); setupCFI();
flashSize = 2097152; flashSize = 2097152;
writeCFI_Flash(0); writeCFI_Flash(1, 1, 0);
verifyFlash(); verifyFlash(1, 1, 0);
break; break;
case 1: case 1:
setupCFI(); setupCFI();
flashSize = 4194304; flashSize = 4194304;
// Write first rom chip // Write first rom chip
writeCFI_Flash(1); writeCFI_Flash(1, 2, 0);
verifyFlash(1); verifyFlash(1, 2, 0);
delay(300); delay(300);
// Switch to second ROM chip, see flash.ino low level functions line 811 // Switch to second ROM chip, see flash.ino low level functions line 811
// LoROM // LoROM
if (mapping == 1) if (mapping == 1)
mapping = 11; mapping = 122;
// HiROM // HiROM
else if (mapping == 2) else if (mapping == 2)
mapping = 22; mapping = 222;
// Write second rom chip // Write second rom chip
display_Clear(); display_Clear();
writeCFI_Flash(2); writeCFI_Flash(2, 2, 0);
verifyFlash(2); verifyFlash(2, 2, 0);
break; break;
case 2: case 2:
setupCFI(); setupCFI();
flashSize = 4194304; flashSize = 4194304;
writeCFI_Flash(0); writeCFI_Flash(1, 1, 0);
verifyFlash(); verifyFlash(1, 1, 0);
break;
case 3:
reversed = reproEXMenu();
setupCFI();
flashSize = 8388608;
// Write first rom chip
writeCFI_Flash(1, 2, reversed);
verifyFlash(1, 2, reversed);
delay(300);
// Switch to second ROM chip, see flash.ino low level functions line 811
// LoROM
if (mapping == 1)
mapping = 124;
// HiROM
else if (mapping == 2)
mapping = 224;
// Write second rom chip
display_Clear();
writeCFI_Flash(2, 2, reversed);
verifyFlash(2, 2, reversed);
break;
case 4:
reversed = reproEXMenu();
setupCFI();
flashSize = 8388608;
// Write first rom chip
writeCFI_Flash(1, 4, reversed);
verifyFlash(1, 4, reversed);
delay(300);
// Switch to second ROM chip, see flash.ino low level functions line 811
// LoROM
if (mapping == 1)
mapping = 122;
// HiROM
else if (mapping == 2)
mapping = 222;
// Write second rom chip
display_Clear();
writeCFI_Flash(2, 4, reversed);
verifyFlash(2, 4, reversed);
// Switch to third ROM chip
// LoROM
if (mapping == 122)
mapping = 124;
// HiROM
else if (mapping == 222)
mapping = 224;
// Write second rom chip
display_Clear();
writeCFI_Flash(3, 4, reversed);
verifyFlash(3, 4, reversed);
// Switch to fourth ROM chip
// LoROM
if (mapping == 124)
mapping = 142;
// HiROM
else if (mapping == 224)
mapping = 242;
// Write second rom chip
display_Clear();
writeCFI_Flash(4, 4, reversed);
verifyFlash(4, 4, reversed);
break;
case 5:
reversed = reproEXMenu();
setupCFI();
flashSize = 8388608;
writeCFI_Flash(1, 1, reversed);
verifyFlash(1, 1, reversed);
break; break;
#endif #endif
case 3: case 6:
resetArduino(); resetArduino();
break; break;
} }
@ -194,7 +308,7 @@ void reproMenu() {
// ExLoRom // ExLoRom
display_Clear(); display_Clear();
display_Update(); display_Update();
mapping = 111; mapping = 124;
setup_Flash8(); setup_Flash8();
id_Flash8(); id_Flash8();
wait(); wait();
@ -205,7 +319,7 @@ void reproMenu() {
// ExHiRom // ExHiRom
display_Clear(); display_Clear();
display_Update(); display_Update();
mapping = 222; mapping = 224;
setup_Flash8(); setup_Flash8();
id_Flash8(); id_Flash8();
wait(); wait();