mirror of
https://github.com/sanni/cartreader.git
synced 2025-01-14 22:19:08 +01:00
replace C64 cart selection code with code used in NES, COLV & INTV
This commit is contained in:
parent
254c824292
commit
394dcdcf1f
@ -105,9 +105,7 @@ byte c64mapselect;
|
|||||||
int c64index;
|
int c64index;
|
||||||
|
|
||||||
byte c64mapper;
|
byte c64mapper;
|
||||||
byte newc64mapper;
|
|
||||||
byte c64size;
|
byte c64size;
|
||||||
byte newc64size;
|
|
||||||
uint8_t c64banks;
|
uint8_t c64banks;
|
||||||
byte c64port; // exrom+game
|
byte c64port; // exrom+game
|
||||||
|
|
||||||
@ -129,7 +127,6 @@ void c64Menu() {
|
|||||||
case 0:
|
case 0:
|
||||||
// Select Cart
|
// Select Cart
|
||||||
setCart_C64();
|
setCart_C64();
|
||||||
wait();
|
|
||||||
setup_C64();
|
setup_C64();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -681,6 +678,7 @@ void displayMapperSelect_C64(int index, boolean printInstructions) {
|
|||||||
|
|
||||||
|
|
||||||
void setMapper_C64() {
|
void setMapper_C64() {
|
||||||
|
byte newc64mapper;
|
||||||
#if (defined(ENABLE_OLED) || defined(ENABLE_LCD))
|
#if (defined(ENABLE_OLED) || defined(ENABLE_LCD))
|
||||||
uint8_t b = 0;
|
uint8_t b = 0;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@ -788,6 +786,7 @@ void checkMapperSize_C64() {
|
|||||||
// SET ROM SIZE
|
// SET ROM SIZE
|
||||||
//******************************************
|
//******************************************
|
||||||
void setROMSize_C64() {
|
void setROMSize_C64() {
|
||||||
|
byte newc64size;
|
||||||
#if (defined(ENABLE_OLED) || defined(ENABLE_LCD))
|
#if (defined(ENABLE_OLED) || defined(ENABLE_LCD))
|
||||||
display_Clear();
|
display_Clear();
|
||||||
if (c64lo == c64hi)
|
if (c64lo == c64hi)
|
||||||
@ -1030,246 +1029,83 @@ void printMapper_C64(byte c64maplabel) {
|
|||||||
//******************************************
|
//******************************************
|
||||||
// CART SELECT CODE
|
// CART SELECT CODE
|
||||||
//******************************************
|
//******************************************
|
||||||
FsFile c64csvFile;
|
void setCart_C64() {
|
||||||
char c64game[45]; // title
|
//go to root
|
||||||
char c64mm[3]; // mapper
|
sd.chdir();
|
||||||
char c64rr[3]; // romsize
|
|
||||||
char c64ll[4]; // linelength (previous line)
|
|
||||||
unsigned long c64csvpos; // CSV File Position
|
|
||||||
char c64cartCSV[] = "c64cart.txt"; // CSV List
|
|
||||||
char c64csvEND[] = "EOF"; // CSV End Marker for scrolling
|
|
||||||
|
|
||||||
bool readLine_C64(FsFile& f, char* line, size_t maxLen) {
|
char gamename[100];
|
||||||
for (size_t n = 0; n < maxLen; n++) {
|
byte gameMapper;
|
||||||
int c = f.read();
|
byte gameSize;
|
||||||
if (c < 0 && n == 0) return false; // EOF
|
|
||||||
if (c < 0 || c == '\n') {
|
|
||||||
line[n] = 0;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
line[n] = c;
|
|
||||||
}
|
|
||||||
return false; // line too long
|
|
||||||
}
|
|
||||||
|
|
||||||
bool readVals_C64(char* c64game, char* c64mm, char* c64rr, char* c64ll) {
|
// Select starting letter
|
||||||
char line[54];
|
byte myLetter = starting_letter();
|
||||||
c64csvpos = c64csvFile.position();
|
|
||||||
if (!readLine_C64(c64csvFile, line, sizeof(line))) {
|
|
||||||
return false; // EOF or too long
|
|
||||||
}
|
|
||||||
char* comma = strtok(line, ",");
|
|
||||||
int x = 0;
|
|
||||||
while (comma != NULL) {
|
|
||||||
if (x == 0)
|
|
||||||
strcpy(c64game, comma);
|
|
||||||
else if (x == 1)
|
|
||||||
strcpy(c64mm, comma);
|
|
||||||
else if (x == 2)
|
|
||||||
strcpy(c64rr, comma);
|
|
||||||
else if (x == 3)
|
|
||||||
strcpy(c64ll, comma);
|
|
||||||
comma = strtok(NULL, ",");
|
|
||||||
x += 1;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool getCartListInfo_C64() {
|
// Open database
|
||||||
bool buttonreleased = 0;
|
if (myFile.open("c64cart.txt", O_READ)) {
|
||||||
bool cartselected = 0;
|
seek_first_letter_in_database(myFile, myLetter);
|
||||||
#if (defined(ENABLE_OLED) || defined(ENABLE_LCD))
|
|
||||||
display_Clear();
|
// Display database
|
||||||
println_Msg(F(" HOLD TO FAST CYCLE"));
|
while (myFile.available()) {
|
||||||
display_Update();
|
|
||||||
#else
|
|
||||||
Serial.println(F("HOLD BUTTON TO FAST CYCLE"));
|
|
||||||
#endif
|
|
||||||
delay(2000);
|
|
||||||
#if defined(ENABLE_OLED)
|
|
||||||
buttonVal1 = (PIND & (1 << 7)); // PD7
|
|
||||||
#elif defined(ENABLE_LCD)
|
|
||||||
boolean buttonVal1 = (PING & (1 << 2)); //PG2
|
|
||||||
#endif
|
|
||||||
if (buttonVal1 == LOW) { // Button Held - Fast Cycle
|
|
||||||
while (1) { // Scroll Game List
|
|
||||||
while (readVals_C64(c64game, c64mm, c64rr, c64ll)) {
|
|
||||||
if (strcmp(c64csvEND, c64game) == 0) {
|
|
||||||
c64csvFile.seek(0); // Restart
|
|
||||||
} else {
|
|
||||||
#if (defined(ENABLE_OLED) || defined(ENABLE_LCD))
|
|
||||||
display_Clear();
|
|
||||||
println_Msg(F("CART TITLE:"));
|
|
||||||
println_Msg(FS(FSTRING_EMPTY));
|
|
||||||
println_Msg(c64game);
|
|
||||||
display_Update();
|
|
||||||
#else
|
|
||||||
Serial.print(F("CART TITLE:"));
|
|
||||||
Serial.println(c64game);
|
|
||||||
#endif
|
|
||||||
#if defined(ENABLE_OLED)
|
|
||||||
buttonVal1 = (PIND & (1 << 7)); // PD7
|
|
||||||
#elif defined(ENABLE_LCD)
|
|
||||||
boolean buttonVal1 = (PING & (1 << 2)); //PG2
|
|
||||||
#endif
|
|
||||||
if (buttonVal1 == HIGH) { // Button Released
|
|
||||||
buttonreleased = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (buttonreleased) {
|
|
||||||
buttonreleased = 0; // Reset Flag
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#if defined(ENABLE_OLED)
|
|
||||||
buttonVal1 = (PIND & (1 << 7)); // PD7
|
|
||||||
#elif defined(ENABLE_LCD)
|
|
||||||
boolean buttonVal1 = (PING & (1 << 2)); //PG2
|
|
||||||
#endif
|
|
||||||
if (buttonVal1 == HIGH) // Button Released
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#if (defined(ENABLE_OLED) || defined(ENABLE_LCD))
|
|
||||||
display.setCursor(0, 56);
|
|
||||||
println_Msg(F("FAST CYCLE OFF"));
|
|
||||||
display_Update();
|
|
||||||
#else
|
|
||||||
Serial.println(FS(FSTRING_EMPTY));
|
|
||||||
Serial.println(F("FAST CYCLE OFF"));
|
|
||||||
Serial.println(F("PRESS BUTTON TO STEP FORWARD"));
|
|
||||||
Serial.println(F("DOUBLE CLICK TO STEP BACK"));
|
|
||||||
Serial.println(F("HOLD TO SELECT"));
|
|
||||||
Serial.println(FS(FSTRING_EMPTY));
|
|
||||||
#endif
|
|
||||||
while (readVals_C64(c64game, c64mm, c64rr, c64ll)) {
|
|
||||||
if (strcmp(c64csvEND, c64game) == 0) {
|
|
||||||
c64csvFile.seek(0); // Restart
|
|
||||||
} else {
|
|
||||||
#if (defined(ENABLE_OLED) || defined(ENABLE_LCD))
|
|
||||||
display_Clear();
|
display_Clear();
|
||||||
println_Msg(F("CART TITLE:"));
|
|
||||||
|
get_line(gamename, &myFile, sizeof(gamename));
|
||||||
|
|
||||||
|
// Read mapper with two ascii character and subtract 48 to convert to decimal
|
||||||
|
gameMapper = ((myFile.read() - 48) * 10) + (myFile.read() - 48);
|
||||||
|
|
||||||
|
// Skip over semicolon
|
||||||
|
myFile.seekCur(1);
|
||||||
|
|
||||||
|
// Read size and subtract 48 to convert to decimal
|
||||||
|
gameSize = myFile.read() - 48;
|
||||||
|
|
||||||
|
// Skip rest of line
|
||||||
|
myFile.seekCur(2);
|
||||||
|
|
||||||
|
skip_line(&myFile);
|
||||||
|
|
||||||
|
println_Msg(F("Select your cartridge"));
|
||||||
println_Msg(FS(FSTRING_EMPTY));
|
println_Msg(FS(FSTRING_EMPTY));
|
||||||
println_Msg(c64game);
|
println_Msg(gamename);
|
||||||
display.setCursor(0, 48);
|
|
||||||
#if defined(ENABLE_OLED)
|
#if defined(ENABLE_OLED)
|
||||||
print_STR(press_to_change_STR, 1);
|
print_STR(press_to_change_STR, 1);
|
||||||
print_STR(right_to_select_STR, 1);
|
print_STR(right_to_select_STR, 1);
|
||||||
#elif defined(ENABLE_LCD)
|
#elif defined(ENABLE_LCD)
|
||||||
print_STR(rotate_to_change_STR, 1);
|
print_STR(rotate_to_change_STR, 1);
|
||||||
print_STR(press_to_select_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"));
|
||||||
#endif
|
#endif
|
||||||
display_Update();
|
display_Update();
|
||||||
#else
|
|
||||||
Serial.print(F("CART TITLE:"));
|
uint8_t b = 0;
|
||||||
Serial.println(c64game);
|
while (1) {
|
||||||
#endif
|
// Check button input
|
||||||
while (1) { // Single Step
|
b = checkButton();
|
||||||
uint8_t b = checkButton();
|
|
||||||
if (b == 1) { // Continue (press)
|
// Next
|
||||||
|
if (b == 1) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (b == 2) { // Reset to Start of List (doubleclick)
|
|
||||||
byte prevline = strtol(c64ll, NULL, 10);
|
// Previous
|
||||||
c64csvpos -= prevline;
|
else if (b == 2) {
|
||||||
c64csvFile.seek(c64csvpos);
|
rewind_line(myFile, 6);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (b == 3) { // Long Press - Select Cart (hold)
|
// Selection
|
||||||
newc64mapper = strtol(c64mm, NULL, 10);
|
else if (b == 3) {
|
||||||
newc64size = strtol(c64rr, NULL, 10);
|
EEPROM_writeAnything(7, gameMapper);
|
||||||
EEPROM_writeAnything(7, newc64mapper);
|
EEPROM_writeAnything(8, gameSize);
|
||||||
EEPROM_writeAnything(8, newc64size);
|
myFile.close();
|
||||||
cartselected = 1; // SELECTION MADE
|
|
||||||
#if (defined(ENABLE_OLED) || defined(ENABLE_LCD))
|
|
||||||
println_Msg(F("SELECTION MADE"));
|
|
||||||
display_Update();
|
|
||||||
#else
|
|
||||||
Serial.println(F("SELECTION MADE"));
|
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (cartselected) {
|
|
||||||
cartselected = 0; // Reset Flag
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#if (defined(ENABLE_OLED) || defined(ENABLE_LCD))
|
|
||||||
println_Msg(FS(FSTRING_EMPTY));
|
|
||||||
println_Msg(FS(FSTRING_END_OF_FILE));
|
|
||||||
display_Update();
|
|
||||||
#else
|
|
||||||
Serial.println(FS(FSTRING_END_OF_FILE));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void checkCSV_C64() {
|
|
||||||
if (getCartListInfo_C64()) {
|
|
||||||
#if (defined(ENABLE_OLED) || defined(ENABLE_LCD))
|
|
||||||
display_Clear();
|
|
||||||
println_Msg(FS(FSTRING_CART_SELECTED));
|
|
||||||
println_Msg(FS(FSTRING_EMPTY));
|
|
||||||
println_Msg(c64game);
|
|
||||||
display_Update();
|
|
||||||
// Display Settings
|
|
||||||
display.setCursor(0, 56);
|
|
||||||
print_Msg(F("CODE: M"));
|
|
||||||
print_Msg(newc64mapper);
|
|
||||||
print_Msg(F("/R"));
|
|
||||||
print_Msg(newc64size);
|
|
||||||
display_Update();
|
|
||||||
#else
|
|
||||||
Serial.println(FS(FSTRING_EMPTY));
|
|
||||||
Serial.println(FS(FSTRING_CART_SELECTED));
|
|
||||||
Serial.println(c64game);
|
|
||||||
// Display Settings
|
|
||||||
Serial.print(F("CODE: M"));
|
|
||||||
Serial.print(newc64mapper);
|
|
||||||
Serial.print(F("/R"));
|
|
||||||
Serial.print(newc64size);
|
|
||||||
Serial.println(FS(FSTRING_EMPTY));
|
|
||||||
#endif
|
|
||||||
} else {
|
} else {
|
||||||
#if (defined(ENABLE_OLED) || defined(ENABLE_LCD))
|
print_FatalError(F("Database file not found"));
|
||||||
display.setCursor(0, 56);
|
|
||||||
println_Msg(FS(FSTRING_NO_SELECTION));
|
|
||||||
display_Update();
|
|
||||||
#else
|
|
||||||
Serial.println(FS(FSTRING_NO_SELECTION));
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setCart_C64() {
|
|
||||||
#if (defined(ENABLE_OLED) || defined(ENABLE_LCD))
|
|
||||||
display_Clear();
|
|
||||||
println_Msg(c64cartCSV);
|
|
||||||
display_Update();
|
|
||||||
#endif
|
|
||||||
sd.chdir();
|
|
||||||
sprintf(folder, "C64/CSV");
|
|
||||||
sd.chdir(folder); // Switch Folder
|
|
||||||
c64csvFile = sd.open(c64cartCSV, O_READ);
|
|
||||||
if (!c64csvFile) {
|
|
||||||
#if (defined(ENABLE_OLED) || defined(ENABLE_LCD))
|
|
||||||
display_Clear();
|
|
||||||
println_Msg(F("CSV FILE NOT FOUND!"));
|
|
||||||
display_Update();
|
|
||||||
#else
|
|
||||||
Serial.println(F("CSV FILE NOT FOUND!"));
|
|
||||||
#endif
|
|
||||||
while (1) {
|
|
||||||
if (checkButton() != 0)
|
|
||||||
setup_C64();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
checkCSV_C64();
|
|
||||||
|
|
||||||
c64csvFile.close();
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
1093
sd/c64cart.txt
1093
sd/c64cart.txt
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user