mirror of
https://github.com/sanni/cartreader.git
synced 2024-12-25 04:21:53 +01:00
Merge pull request #50 from jiyunomegami/master
V5.4: Merge Commits by jiyunomegami
This commit is contained in:
commit
750a7043fc
@ -45,22 +45,7 @@
|
|||||||
|
|
||||||
char ver[5] = "5.3";
|
char ver[5] = "5.3";
|
||||||
|
|
||||||
/******************************************
|
#include "options.h"
|
||||||
Options
|
|
||||||
******************************************/
|
|
||||||
// Change mainMenu to snsMenu, mdMenu, n64Menu, gbxMenu, pcsMenu,
|
|
||||||
// flashMenu, nesMenu or smsMenu for single slot Cart Readers
|
|
||||||
#define startMenu mainMenu
|
|
||||||
|
|
||||||
// Comment out to change to Serial Output
|
|
||||||
// be sure to change the Arduino Serial Monitor to no line ending
|
|
||||||
#define enable_OLED
|
|
||||||
|
|
||||||
// Skip OLED start-up animation
|
|
||||||
//#define fast_start
|
|
||||||
|
|
||||||
// Enable the second button
|
|
||||||
#define enable_Button2
|
|
||||||
|
|
||||||
/******************************************
|
/******************************************
|
||||||
Libraries
|
Libraries
|
||||||
@ -365,6 +350,56 @@ static const uint8_t PROGMEM sig [] = {
|
|||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//******************************************
|
||||||
|
// Data used by multiple modules
|
||||||
|
//******************************************
|
||||||
|
// CRC32 lookup table // 256 entries
|
||||||
|
static const uint32_t crc_32_tab[] PROGMEM = { /* CRC polynomial 0xedb88320 */
|
||||||
|
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
|
||||||
|
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
|
||||||
|
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
|
||||||
|
0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
|
||||||
|
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
|
||||||
|
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
|
||||||
|
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
|
||||||
|
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
|
||||||
|
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
|
||||||
|
0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
|
||||||
|
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
|
||||||
|
0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
|
||||||
|
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
|
||||||
|
0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
|
||||||
|
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
|
||||||
|
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
|
||||||
|
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
|
||||||
|
0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
|
||||||
|
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
|
||||||
|
0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
|
||||||
|
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
|
||||||
|
0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
|
||||||
|
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
|
||||||
|
0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
|
||||||
|
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
|
||||||
|
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
|
||||||
|
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
|
||||||
|
0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
|
||||||
|
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
|
||||||
|
0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
|
||||||
|
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
|
||||||
|
0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
|
||||||
|
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
|
||||||
|
0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
|
||||||
|
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
|
||||||
|
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
|
||||||
|
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
|
||||||
|
0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
|
||||||
|
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
|
||||||
|
0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
|
||||||
|
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
|
||||||
|
0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
|
||||||
|
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
|
||||||
|
};
|
||||||
|
|
||||||
/******************************************
|
/******************************************
|
||||||
Menu
|
Menu
|
||||||
*****************************************/
|
*****************************************/
|
||||||
@ -453,21 +488,29 @@ void mainMenu() {
|
|||||||
addonsMenu();
|
addonsMenu();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifdef enable_SNES
|
||||||
case 1:
|
case 1:
|
||||||
snsMenu();
|
snsMenu();
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef enable_MD
|
||||||
case 2:
|
case 2:
|
||||||
mdMenu();
|
mdMenu();
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef enable_N64
|
||||||
case 3:
|
case 3:
|
||||||
n64Menu();
|
n64Menu();
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef enable_GBX
|
||||||
case 4:
|
case 4:
|
||||||
gbxMenu();
|
gbxMenu();
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
aboutScreen();
|
aboutScreen();
|
||||||
@ -490,35 +533,47 @@ void addonsMenu() {
|
|||||||
// 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 (addonsMenu)
|
switch (addonsMenu)
|
||||||
{
|
{
|
||||||
|
#ifdef enable_NES
|
||||||
case 0:
|
case 0:
|
||||||
nesMenu();
|
nesMenu();
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef enable_FLASH
|
||||||
case 1:
|
case 1:
|
||||||
flashMenu();
|
flashMenu();
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef enable_PCE
|
||||||
case 2:
|
case 2:
|
||||||
pcsMenu();
|
pcsMenu();
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef enable_SMS
|
||||||
case 3:
|
case 3:
|
||||||
smsMenu();
|
smsMenu();
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef enable_WS
|
||||||
case 4:
|
case 4:
|
||||||
display_Clear();
|
display_Clear();
|
||||||
display_Update();
|
display_Update();
|
||||||
setup_WS();
|
setup_WS();
|
||||||
mode = mode_WS;
|
mode = mode_WS;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef enable_NGP
|
||||||
case 5:
|
case 5:
|
||||||
display_Clear();
|
display_Clear();
|
||||||
display_Update();
|
display_Update();
|
||||||
setup_NGP();
|
setup_NGP();
|
||||||
mode = mode_NGP;
|
mode = mode_NGP;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
case 6:
|
case 6:
|
||||||
resetArduino();
|
resetArduino();
|
||||||
@ -762,6 +817,19 @@ void print_Msg(String string) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void print_Msg_PaddedHexByte(byte message) {
|
||||||
|
if (message < 16) print_Msg(0, HEX);
|
||||||
|
print_Msg(message, HEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_Msg_PaddedHex32(unsigned long message) {
|
||||||
|
print_Msg_PaddedHexByte((message >> 24) & 0xFF);
|
||||||
|
print_Msg_PaddedHexByte((message >> 16) & 0xFF);
|
||||||
|
print_Msg_PaddedHexByte((message >> 8) & 0xFF);
|
||||||
|
print_Msg_PaddedHexByte((message >> 0) & 0xFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void println_Msg(String string) {
|
void println_Msg(String string) {
|
||||||
#ifdef enable_OLED
|
#ifdef enable_OLED
|
||||||
display.println(string);
|
display.println(string);
|
||||||
@ -1124,10 +1192,13 @@ void wait_btn() {
|
|||||||
// get input button
|
// get input button
|
||||||
int b = checkButton();
|
int b = checkButton();
|
||||||
|
|
||||||
|
#ifdef enable_N64
|
||||||
// Send some clock pulses to the Eeprom in case it locked up
|
// Send some clock pulses to the Eeprom in case it locked up
|
||||||
if ((mode == mode_N64_Cart) && ((saveType == 5) || (saveType == 6))) {
|
if ((mode == mode_N64_Cart) && ((saveType == 5) || (saveType == 6))) {
|
||||||
pulseClock_N64(1);
|
pulseClock_N64(1);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// if the cart readers input button is pressed shortly
|
// if the cart readers input button is pressed shortly
|
||||||
if (b == 1) {
|
if (b == 1) {
|
||||||
errorLvl = 0;
|
errorLvl = 0;
|
||||||
@ -1455,15 +1526,22 @@ page:
|
|||||||
Main loop
|
Main loop
|
||||||
*****************************************/
|
*****************************************/
|
||||||
void loop() {
|
void loop() {
|
||||||
|
#ifdef enable_N64
|
||||||
if (mode == mode_N64_Controller) {
|
if (mode == mode_N64_Controller) {
|
||||||
n64ControllerMenu();
|
n64ControllerMenu();
|
||||||
}
|
}
|
||||||
else if (mode == mode_N64_Cart) {
|
else if (mode == mode_N64_Cart) {
|
||||||
n64CartMenu();
|
n64CartMenu();
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if (1 == 0) { }
|
||||||
|
#endif
|
||||||
|
#ifdef enable_SNES
|
||||||
else if (mode == mode_SNES) {
|
else if (mode == mode_SNES) {
|
||||||
snesMenu();
|
snesMenu();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef enable_FLASH
|
||||||
else if (mode == mode_FLASH8) {
|
else if (mode == mode_FLASH8) {
|
||||||
flashromMenu8();
|
flashromMenu8();
|
||||||
}
|
}
|
||||||
@ -1473,42 +1551,62 @@ void loop() {
|
|||||||
else if (mode == mode_EPROM) {
|
else if (mode == mode_EPROM) {
|
||||||
epromMenu();
|
epromMenu();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef enable_NP
|
||||||
else if (mode == mode_SFM) {
|
else if (mode == mode_SFM) {
|
||||||
sfmMenu();
|
sfmMenu();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef enable_GBX
|
||||||
else if (mode == mode_GB) {
|
else if (mode == mode_GB) {
|
||||||
gbMenu();
|
gbMenu();
|
||||||
}
|
}
|
||||||
else if (mode == mode_GBA) {
|
else if (mode == mode_GBA) {
|
||||||
gbaMenu();
|
gbaMenu();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef enable_NP
|
||||||
else if (mode == mode_SFM_Flash) {
|
else if (mode == mode_SFM_Flash) {
|
||||||
sfmFlashMenu();
|
sfmFlashMenu();
|
||||||
}
|
}
|
||||||
else if (mode == mode_SFM_Game) {
|
else if (mode == mode_SFM_Game) {
|
||||||
sfmGameOptions();
|
sfmGameOptions();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef enable_GBX
|
||||||
else if (mode == mode_GBM) {
|
else if (mode == mode_GBM) {
|
||||||
gbmMenu();
|
gbmMenu();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
else if (mode == mode_MD_Cart) {
|
else if (mode == mode_MD_Cart) {
|
||||||
mdCartMenu();
|
mdCartMenu();
|
||||||
}
|
}
|
||||||
|
#ifdef enable_PCE
|
||||||
else if (mode == mode_PCE) {
|
else if (mode == mode_PCE) {
|
||||||
pceMenu();
|
pceMenu();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef enable_SV
|
||||||
else if (mode == mode_SV) {
|
else if (mode == mode_SV) {
|
||||||
svMenu();
|
svMenu();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef enable_NES
|
||||||
else if (mode == mode_NES) {
|
else if (mode == mode_NES) {
|
||||||
nesMenu();
|
nesMenu();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef enable_SMS
|
||||||
else if (mode == mode_SMS) {
|
else if (mode == mode_SMS) {
|
||||||
smsMenu();
|
smsMenu();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef enable_MD
|
||||||
else if (mode == mode_SEGA_CD) {
|
else if (mode == mode_SEGA_CD) {
|
||||||
segaCDMenu();
|
segaCDMenu();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef enable_GBX
|
||||||
else if (mode == mode_GB_GBSmart) {
|
else if (mode == mode_GB_GBSmart) {
|
||||||
gbSmartMenu();
|
gbSmartMenu();
|
||||||
}
|
}
|
||||||
@ -1518,12 +1616,17 @@ void loop() {
|
|||||||
else if (mode == mode_GB_GBSmart_Game) {
|
else if (mode == mode_GB_GBSmart_Game) {
|
||||||
gbSmartGameOptions();
|
gbSmartGameOptions();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef enable_WS
|
||||||
else if (mode == mode_WS) {
|
else if (mode == mode_WS) {
|
||||||
wsMenu();
|
wsMenu();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef enable_NGP
|
||||||
else if (mode == mode_NGP) {
|
else if (mode == mode_NGP) {
|
||||||
ngpMenu();
|
ngpMenu();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
else {
|
else {
|
||||||
display_Clear();
|
display_Clear();
|
||||||
println_Msg(F("Menu Error"));
|
println_Msg(F("Menu Error"));
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
// FLASHROM MODULE
|
// FLASHROM MODULE
|
||||||
//******************************************
|
//******************************************
|
||||||
|
|
||||||
|
#include "options.h"
|
||||||
|
#ifdef enable_FLASH
|
||||||
|
|
||||||
/******************************************
|
/******************************************
|
||||||
Variables
|
Variables
|
||||||
*****************************************/
|
*****************************************/
|
||||||
@ -2370,6 +2373,8 @@ void print_Eprom(int numBytes) {
|
|||||||
display_Update();
|
display_Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
//******************************************
|
//******************************************
|
||||||
// End of File
|
// End of File
|
||||||
//******************************************
|
//******************************************
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
// GAME BOY MODULE
|
// GAME BOY MODULE
|
||||||
//******************************************
|
//******************************************
|
||||||
|
|
||||||
|
#include "options.h"
|
||||||
|
#ifdef enable_GBX
|
||||||
|
|
||||||
/******************************************
|
/******************************************
|
||||||
Variables
|
Variables
|
||||||
*****************************************/
|
*****************************************/
|
||||||
@ -1062,6 +1065,8 @@ void writeFlash_GB(byte MBC) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
//******************************************
|
//******************************************
|
||||||
// End of File
|
// End of File
|
||||||
//******************************************
|
//******************************************
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
// GAME BOY ADVANCE MODULE
|
// GAME BOY ADVANCE MODULE
|
||||||
//******************************************
|
//******************************************
|
||||||
|
|
||||||
|
#include "options.h"
|
||||||
|
#ifdef enable_GBX
|
||||||
|
|
||||||
/******************************************
|
/******************************************
|
||||||
Variables
|
Variables
|
||||||
*****************************************/
|
*****************************************/
|
||||||
@ -2636,6 +2639,8 @@ void flashRepro_GBA() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
//******************************************
|
//******************************************
|
||||||
// End of File
|
// End of File
|
||||||
//******************************************
|
//******************************************
|
||||||
|
@ -2,6 +2,10 @@
|
|||||||
// GB SMART MODULE
|
// GB SMART MODULE
|
||||||
// Supports 32M cart with LH28F016SUT flash
|
// Supports 32M cart with LH28F016SUT flash
|
||||||
//******************************************
|
//******************************************
|
||||||
|
|
||||||
|
#include "options.h"
|
||||||
|
#ifdef enable_GBX
|
||||||
|
|
||||||
#define GB_SMART_GAMES_PER_PAGE 6
|
#define GB_SMART_GAMES_PER_PAGE 6
|
||||||
|
|
||||||
/******************************************
|
/******************************************
|
||||||
@ -771,3 +775,5 @@ uint8_t gbSmartGetResizeParam(uint8_t rom_size, uint8_t sram_size)
|
|||||||
|
|
||||||
return (sram_size | rom_size);
|
return (sram_size | rom_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -3,6 +3,9 @@
|
|||||||
//******************************************
|
//******************************************
|
||||||
// Writes to Sega CD Backup RAM Cart require an extra wire from MRES (B02) to VRES (B27)
|
// Writes to Sega CD Backup RAM Cart require an extra wire from MRES (B02) to VRES (B27)
|
||||||
|
|
||||||
|
#include "options.h"
|
||||||
|
#ifdef enable_MD
|
||||||
|
|
||||||
/******************************************
|
/******************************************
|
||||||
Variables
|
Variables
|
||||||
*****************************************/
|
*****************************************/
|
||||||
@ -136,6 +139,7 @@ void mdMenu() {
|
|||||||
mode = mode_SEGA_CD;
|
mode = mode_SEGA_CD;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifdef enable_FLASH
|
||||||
case 2:
|
case 2:
|
||||||
display_Clear();
|
display_Clear();
|
||||||
display_Update();
|
display_Update();
|
||||||
@ -180,6 +184,7 @@ void mdMenu() {
|
|||||||
display_Update();
|
display_Update();
|
||||||
wait();
|
wait();
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
resetArduino();
|
resetArduino();
|
||||||
@ -219,7 +224,7 @@ void mdCartMenu() {
|
|||||||
case 1:
|
case 1:
|
||||||
display_Clear();
|
display_Clear();
|
||||||
// Does cartridge have SRAM
|
// Does cartridge have SRAM
|
||||||
if ((saveType == 1) || (saveType == 2) || (saveType == 3)) {
|
if ((saveType == 1) || (saveType == 2) || (saveType == 3) || (saveType == 5)) {
|
||||||
// Change working dir to root
|
// Change working dir to root
|
||||||
sd.chdir("/");
|
sd.chdir("/");
|
||||||
println_Msg(F("Reading Sram..."));
|
println_Msg(F("Reading Sram..."));
|
||||||
@ -236,7 +241,7 @@ void mdCartMenu() {
|
|||||||
case 2:
|
case 2:
|
||||||
display_Clear();
|
display_Clear();
|
||||||
// Does cartridge have SRAM
|
// Does cartridge have SRAM
|
||||||
if ((saveType == 1) || (saveType == 2) || (saveType == 3)) {
|
if ((saveType == 1) || (saveType == 2) || (saveType == 3) || (saveType == 5)) {
|
||||||
// Change working dir to root
|
// Change working dir to root
|
||||||
sd.chdir("/");
|
sd.chdir("/");
|
||||||
// Launch file browser
|
// Launch file browser
|
||||||
@ -575,8 +580,11 @@ void getCartInfo_MD() {
|
|||||||
// 4 = 128KB (2045 Blocks) Sega CD Backup RAM Cart
|
// 4 = 128KB (2045 Blocks) Sega CD Backup RAM Cart
|
||||||
// 6 = 512KB (8189 Blocks) Ultra CD Backup RAM Cart (Aftermarket)
|
// 6 = 512KB (8189 Blocks) Ultra CD Backup RAM Cart (Aftermarket)
|
||||||
word bramCheck = readWord_MD(0x00);
|
word bramCheck = readWord_MD(0x00);
|
||||||
if (((bramCheck == 0x0004) && (chksum == 0x0004)) || ((bramCheck == 0x0006) && (chksum == 0x0006)))
|
if ( (((bramCheck & 0xFF) == 0x04) && ((chksum & 0xFF) == 0x04))
|
||||||
bramSize = pow(2, bramCheck) * 0x2000;
|
|| (((bramCheck & 0xFF) == 0x06) && ((chksum & 0xFF) == 0x06))) {
|
||||||
|
unsigned long p = 1 << (bramCheck & 0xFF);
|
||||||
|
bramSize = p * 0x2000L;
|
||||||
|
}
|
||||||
if (saveType != 4) { // NOT SERIAL EEPROM
|
if (saveType != 4) { // NOT SERIAL EEPROM
|
||||||
// Check if cart has sram
|
// Check if cart has sram
|
||||||
saveType = 0;
|
saveType = 0;
|
||||||
@ -600,6 +608,10 @@ void getCartInfo_MD() {
|
|||||||
sramSize = (sramEnd - sramBase + 2) / 2;
|
sramSize = (sramEnd - sramBase + 2) / 2;
|
||||||
// Right shift sram base address so [A21] is set to high 0x200000 = 0b001[0]00000000000000000000
|
// Right shift sram base address so [A21] is set to high 0x200000 = 0b001[0]00000000000000000000
|
||||||
sramBase = sramBase >> 1;
|
sramBase = sramBase >> 1;
|
||||||
|
if (chksum == 0x5D33 && sramEnd == 0x203FFF) { // Dragon Slayer Eiyuu Densetsu
|
||||||
|
// the high byte read as zero
|
||||||
|
saveType = 5; // BOTH
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (sramBase == 0x200000) {
|
else if (sramBase == 0x200000) {
|
||||||
// high byte
|
// high byte
|
||||||
@ -716,12 +728,20 @@ void getCartInfo_MD() {
|
|||||||
println_Msg(F(" "));
|
println_Msg(F(" "));
|
||||||
print_Msg(F("Name: "));
|
print_Msg(F("Name: "));
|
||||||
println_Msg(romName);
|
println_Msg(romName);
|
||||||
|
print_Msg(F("bramCheck: "));
|
||||||
|
print_Msg_PaddedHexByte(bramCheck >> 8);
|
||||||
|
print_Msg_PaddedHexByte(bramCheck & 0x00ff);
|
||||||
|
println_Msg(F(""));
|
||||||
|
if (bramSize > 0) {
|
||||||
|
print_Msg(F("bramSize(KB): "));
|
||||||
|
println_Msg(bramSize >> 10);
|
||||||
|
}
|
||||||
print_Msg(F("Size: "));
|
print_Msg(F("Size: "));
|
||||||
print_Msg(cartSize * 8 / 1024 / 1024 );
|
print_Msg(cartSize * 8 / 1024 / 1024 );
|
||||||
println_Msg(F(" MBit"));
|
println_Msg(F(" MBit"));
|
||||||
print_Msg(F("ChkS: "));
|
print_Msg(F("ChkS: "));
|
||||||
print_Msg((chksum >> 8), HEX);
|
print_Msg_PaddedHexByte((chksum >> 8));
|
||||||
print_Msg((chksum & 0x00ff), HEX);
|
print_Msg_PaddedHexByte((chksum & 0x00ff));
|
||||||
println_Msg(F(""));
|
println_Msg(F(""));
|
||||||
if (saveType == 4) {
|
if (saveType == 4) {
|
||||||
print_Msg(F("Serial EEPROM: "));
|
print_Msg(F("Serial EEPROM: "));
|
||||||
@ -958,6 +978,14 @@ void writeSram_MD() {
|
|||||||
writeWord_MD(currByte, ((myFile.read() << 8 ) & 0xFF));
|
writeWord_MD(currByte, ((myFile.read() << 8 ) & 0xFF));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Write to both bytes
|
||||||
|
else if (saveType == 5) {
|
||||||
|
for (unsigned long currByte = sramBase; currByte < sramBase + sramSize; currByte++) {
|
||||||
|
word w0 = (myFile.read() & 0xFF); // skip
|
||||||
|
word w1 = (myFile.read() & 0xFF);
|
||||||
|
writeWord_MD(currByte, w1);
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
print_Error(F("Unknown save type"), false);
|
print_Error(F("Unknown save type"), false);
|
||||||
|
|
||||||
@ -1007,12 +1035,16 @@ void readSram_MD() {
|
|||||||
// Only use the lower byte
|
// Only use the lower byte
|
||||||
sdBuffer[currWord] = (myWord & 0xFF);
|
sdBuffer[currWord] = (myWord & 0xFF);
|
||||||
}
|
}
|
||||||
else { // saveType == 3 (BOTH)
|
else if (saveType == 3) { // BOTH
|
||||||
sdBuffer[currWord * 2] = (( myWord >> 8 ) & 0xFF);
|
sdBuffer[currWord * 2] = (( myWord >> 8 ) & 0xFF);
|
||||||
sdBuffer[(currWord * 2) + 1] = (myWord & 0xFF);
|
sdBuffer[(currWord * 2) + 1] = (myWord & 0xFF);
|
||||||
}
|
}
|
||||||
|
else if (saveType == 5) { // duplicate the lower byte
|
||||||
|
sdBuffer[(currWord * 2) + 0] = (myWord & 0xFF);
|
||||||
|
sdBuffer[(currWord * 2) + 1] = (myWord & 0xFF);
|
||||||
}
|
}
|
||||||
if (saveType == 3)
|
}
|
||||||
|
if (saveType == 3 || saveType == 5)
|
||||||
myFile.write(sdBuffer, 512);
|
myFile.write(sdBuffer, 512);
|
||||||
else
|
else
|
||||||
myFile.write(sdBuffer, 256);
|
myFile.write(sdBuffer, 256);
|
||||||
@ -1062,6 +1094,7 @@ unsigned long verifySram_MD() {
|
|||||||
return writeErrors;
|
return writeErrors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef enable_FLASH
|
||||||
//******************************************
|
//******************************************
|
||||||
// Flashrom Functions
|
// Flashrom Functions
|
||||||
//******************************************
|
//******************************************
|
||||||
@ -1248,6 +1281,7 @@ void verifyFlash_MD() {
|
|||||||
display_Update();
|
display_Update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Delay between write operations based on status register
|
// Delay between write operations based on status register
|
||||||
void busyCheck_MD() {
|
void busyCheck_MD() {
|
||||||
@ -2008,6 +2042,8 @@ void readRealtec_MD() {
|
|||||||
myFile.close();
|
myFile.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
//******************************************
|
//******************************************
|
||||||
// End of File
|
// End of File
|
||||||
//******************************************
|
//******************************************
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
// NINTENDO 64 MODULE
|
// NINTENDO 64 MODULE
|
||||||
//******************************************
|
//******************************************
|
||||||
|
|
||||||
|
#include "options.h"
|
||||||
|
#ifdef enable_N64
|
||||||
|
|
||||||
/******************************************
|
/******************************************
|
||||||
Defines
|
Defines
|
||||||
*****************************************/
|
*****************************************/
|
||||||
@ -1643,53 +1646,6 @@ void printCartInfo_N64() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// CRC32 lookup table // 256 entries
|
|
||||||
static const uint32_t crc_32_tab[] PROGMEM = { /* CRC polynomial 0xedb88320 */
|
|
||||||
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
|
|
||||||
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
|
|
||||||
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
|
|
||||||
0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
|
|
||||||
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
|
|
||||||
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
|
|
||||||
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
|
|
||||||
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
|
|
||||||
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
|
|
||||||
0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
|
|
||||||
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
|
|
||||||
0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
|
|
||||||
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
|
|
||||||
0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
|
|
||||||
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
|
|
||||||
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
|
|
||||||
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
|
|
||||||
0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
|
|
||||||
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
|
|
||||||
0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
|
|
||||||
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
|
|
||||||
0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
|
|
||||||
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
|
|
||||||
0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
|
|
||||||
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
|
|
||||||
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
|
|
||||||
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
|
|
||||||
0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
|
|
||||||
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
|
|
||||||
0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
|
|
||||||
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
|
|
||||||
0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
|
|
||||||
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
|
|
||||||
0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
|
|
||||||
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
|
|
||||||
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
|
|
||||||
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
|
|
||||||
0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
|
|
||||||
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
|
|
||||||
0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
|
|
||||||
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
|
|
||||||
0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
|
|
||||||
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
|
|
||||||
};
|
|
||||||
|
|
||||||
// improved strcmp function that ignores case to prevent checksum comparison issues
|
// improved strcmp function that ignores case to prevent checksum comparison issues
|
||||||
int strcicmp(char const * a, char const * b)
|
int strcicmp(char const * a, char const * b)
|
||||||
{
|
{
|
||||||
@ -3846,6 +3802,8 @@ unsigned long verifyGameshark_N64() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
//******************************************
|
//******************************************
|
||||||
// End of File
|
// End of File
|
||||||
//******************************************
|
//******************************************
|
||||||
|
@ -5,6 +5,9 @@
|
|||||||
// also based on "CoolArduino" by HardWareMan
|
// also based on "CoolArduino" by HardWareMan
|
||||||
// Pinout changes: LED and CIRAM_A10
|
// Pinout changes: LED and CIRAM_A10
|
||||||
|
|
||||||
|
#include "options.h"
|
||||||
|
#ifdef enable_NES
|
||||||
|
|
||||||
//Line Content
|
//Line Content
|
||||||
//26 Supported Mappers
|
//26 Supported Mappers
|
||||||
//101 Defines
|
//101 Defines
|
||||||
@ -2163,17 +2166,13 @@ void readCHR() {
|
|||||||
|
|
||||||
case 26: // 128K/256K
|
case 26: // 128K/256K
|
||||||
banks = int_pow(2, chrsize) * 4;
|
banks = int_pow(2, chrsize) * 4;
|
||||||
write_prg_byte(0xB003, 0); // PPU Banking Mode 0
|
write_prg_byte(0xB003, 0x00);
|
||||||
for (int i = 0; i < banks; i += 8) {
|
for (int i = 0; i < banks; i += 4) {
|
||||||
write_prg_byte(0xD000, i); // CHR Bank 0
|
write_prg_byte(0xD000, i + 0); // CHR Bank 0
|
||||||
write_prg_byte(0xD002, i + 1); // CHR Bank 1
|
write_prg_byte(0xD002, i + 1); // CHR Bank 1
|
||||||
write_prg_byte(0xD001, i + 2); // CHR Bank 2
|
write_prg_byte(0xD001, i + 2); // CHR Bank 2
|
||||||
write_prg_byte(0xD003, i + 3); // CHR Bank 3
|
write_prg_byte(0xD003, i + 3); // CHR Bank 3
|
||||||
write_reg_byte(0xE000, i + 4); // CHR Bank 4 [WRITE RAM SAFE]
|
for (word address = 0x0; address < 0x1000; address += 512) { // 1K Banks
|
||||||
write_reg_byte(0xE002, i + 5); // CHR Bank 5 [WRITE RAM SAFE]
|
|
||||||
write_reg_byte(0xE001, i + 6); // CHR Bank 6 [WRITE RAM SAFE]
|
|
||||||
write_reg_byte(0xE003, i + 7); // CHR Bank 7 [WRITE RAM SAFE]
|
|
||||||
for (word address = 0x0; address < 0x2000; address += 512) { // 1K Banks
|
|
||||||
dumpCHR(address);
|
dumpCHR(address);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3284,6 +3283,8 @@ void writeFLASH() {
|
|||||||
filePath[0] = '\0'; // Reset filePath
|
filePath[0] = '\0'; // Reset filePath
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
//******************************************
|
//******************************************
|
||||||
// End of File
|
// End of File
|
||||||
//******************************************
|
//******************************************
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
// NGP MODULE
|
// NGP MODULE
|
||||||
//******************************************
|
//******************************************
|
||||||
|
|
||||||
|
#include "options.h"
|
||||||
|
#ifdef enable_NGP
|
||||||
|
|
||||||
static const char ngpMenuItem1[] PROGMEM = "Read Rom";
|
static const char ngpMenuItem1[] PROGMEM = "Read Rom";
|
||||||
static const char ngpMenuItemReset[] PROGMEM = "Reset";
|
static const char ngpMenuItemReset[] PROGMEM = "Reset";
|
||||||
static const char* const menuOptionsNGP[] PROGMEM = {ngpMenuItem1, ngpMenuItemReset};
|
static const char* const menuOptionsNGP[] PROGMEM = {ngpMenuItem1, ngpMenuItemReset};
|
||||||
@ -236,3 +239,5 @@ uint8_t readByte_NGP(uint32_t addr) {
|
|||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -3,6 +3,9 @@
|
|||||||
//******************************************
|
//******************************************
|
||||||
// (GB Memory starts at around line 1740)
|
// (GB Memory starts at around line 1740)
|
||||||
|
|
||||||
|
#include "options.h"
|
||||||
|
#ifdef enable_NP
|
||||||
|
|
||||||
/******************************************
|
/******************************************
|
||||||
SF Memory Cassette
|
SF Memory Cassette
|
||||||
******************************************/
|
******************************************/
|
||||||
@ -216,6 +219,7 @@ void sfmGameOptions() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef enable_FLASH
|
||||||
void sfmFlashMenu() {
|
void sfmFlashMenu() {
|
||||||
// create menu with title and 6 options to choose from
|
// create menu with title and 6 options to choose from
|
||||||
unsigned char flashSubMenu;
|
unsigned char flashSubMenu;
|
||||||
@ -453,6 +457,7 @@ void sfmFlashMenu() {
|
|||||||
wait();
|
wait();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Read the games from the menu area
|
// Read the games from the menu area
|
||||||
void getGames() {
|
void getGames() {
|
||||||
@ -2615,6 +2620,8 @@ void writeMapping_GBM() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
//******************************************
|
//******************************************
|
||||||
// End of File
|
// End of File
|
||||||
//******************************************
|
//******************************************
|
||||||
|
@ -11,6 +11,9 @@
|
|||||||
//
|
//
|
||||||
//******************************************
|
//******************************************
|
||||||
|
|
||||||
|
#include "options.h"
|
||||||
|
#ifdef enable_PCE
|
||||||
|
|
||||||
/******************************************
|
/******************************************
|
||||||
Defines
|
Defines
|
||||||
*****************************************/
|
*****************************************/
|
||||||
@ -844,6 +847,7 @@ void pceMenu() {
|
|||||||
wait();
|
wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
//******************************************
|
//******************************************
|
||||||
// End of File
|
// End of File
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
// SEGA MASTER SYSTEM MODULE
|
// SEGA MASTER SYSTEM MODULE
|
||||||
//******************************************
|
//******************************************
|
||||||
|
|
||||||
|
#include "options.h"
|
||||||
|
#ifdef enable_MD
|
||||||
|
|
||||||
/******************************************
|
/******************************************
|
||||||
Variables
|
Variables
|
||||||
*****************************************/
|
*****************************************/
|
||||||
@ -11,15 +14,22 @@
|
|||||||
*****************************************/
|
*****************************************/
|
||||||
// MD menu items
|
// MD menu items
|
||||||
static const char SMSMenuItem1[] PROGMEM = "Read Rom";
|
static const char SMSMenuItem1[] PROGMEM = "Read Rom";
|
||||||
static const char SMSMenuItem2[] PROGMEM = "Reset";
|
static const char SMSMenuItem2[] PROGMEM = "Read from SRAM";
|
||||||
static const char* const menuOptionsSMS[] PROGMEM = {SMSMenuItem1, SMSMenuItem2};
|
static const char SMSMenuItem3[] PROGMEM = "Write to SRAM";
|
||||||
|
static const char SMSMenuItem4[] PROGMEM = "Toggle Retrode Mode";
|
||||||
|
static const char SMSMenuItem5[] PROGMEM = "Reset";
|
||||||
|
static const char* const menuOptionsSMS[] PROGMEM = {SMSMenuItem1, SMSMenuItem2, SMSMenuItem3, SMSMenuItem4, SMSMenuItem5};
|
||||||
|
|
||||||
void smsMenu() {
|
// Set retrode_mode to true when using a retrode SMS/GG adapter
|
||||||
|
static bool retrode_mode = false;
|
||||||
|
|
||||||
|
void _smsMenu() {
|
||||||
// create menu with title and 2 options to choose from
|
// create menu with title and 2 options to choose from
|
||||||
unsigned char mainMenu;
|
unsigned char mainMenu;
|
||||||
// Copy menuOptions out of progmem
|
// Copy menuOptions out of progmem
|
||||||
convertPgm(menuOptionsSMS, 2);
|
int noptions = sizeof(menuOptionsSMS) / sizeof(menuOptionsSMS[0]);
|
||||||
mainMenu = question_box(F("Sega Master System"), menuOptions, 2, 0);
|
convertPgm(menuOptionsSMS, noptions);
|
||||||
|
mainMenu = question_box(retrode_mode ? F("SMS/GG Retrode:YES") : F("SMS/GG Retrode:NO"), menuOptions, noptions, 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 (mainMenu)
|
switch (mainMenu)
|
||||||
@ -34,16 +44,43 @@ void smsMenu() {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
|
display_Clear();
|
||||||
|
mode = mode_SMS;
|
||||||
|
setup_SMS();
|
||||||
|
// Change working dir to root
|
||||||
|
sd.chdir("/");
|
||||||
|
readSRAM_SMS();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
display_Clear();
|
||||||
|
mode = mode_SMS;
|
||||||
|
setup_SMS();
|
||||||
|
// Change working dir to root
|
||||||
|
sd.chdir("/");
|
||||||
|
writeSRAM_SMS();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
retrode_mode = !retrode_mode;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
// Reset
|
// Reset
|
||||||
resetArduino();
|
resetArduino();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
println_Msg(retrode_mode ? F("Retrode Mode On") : F("Retrode Mode Off"));
|
||||||
println_Msg(F(""));
|
println_Msg(F(""));
|
||||||
println_Msg(F("Press Button..."));
|
println_Msg(F("Press Button..."));
|
||||||
display_Update();
|
display_Update();
|
||||||
wait();
|
wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void smsMenu() {
|
||||||
|
for (;;) _smsMenu();
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************
|
/******************************************
|
||||||
Setup
|
Setup
|
||||||
*****************************************/
|
*****************************************/
|
||||||
@ -56,6 +93,25 @@ void setup_SMS() {
|
|||||||
//A15
|
//A15
|
||||||
DDRH |= (1 << 3);
|
DDRH |= (1 << 3);
|
||||||
|
|
||||||
|
if (retrode_mode) {
|
||||||
|
// Revert changes from the other mode
|
||||||
|
PORTH &= ~((1 << 0) | (1 << 3) | (1 << 5));
|
||||||
|
PORTL &= ~(1 << 1);
|
||||||
|
DDRH &= ~((1 << 0) | (1 << 5));
|
||||||
|
DDRL &= ~((1 << 1));
|
||||||
|
// Set Control Pins to Output OE(PH6)
|
||||||
|
DDRH |= (1 << 6);
|
||||||
|
// WR(PL5) and RD(PL6)
|
||||||
|
DDRL |= (1 << 5) | (1 << 6);
|
||||||
|
|
||||||
|
// Setting OE(PH6) HIGH
|
||||||
|
PORTH |= (1 << 6);
|
||||||
|
// Setting WR(PL5) and RD(PL6) HIGH
|
||||||
|
PORTL |= (1 << 5) | (1 << 6);
|
||||||
|
} else {
|
||||||
|
// Revert changes from the other mode
|
||||||
|
PORTL &= ~((1 << 5) | (1 << 6));
|
||||||
|
DDRL &= ~((1 << 5) | (1 << 6));
|
||||||
// Set Control Pins to Output RST(PH0) WR(PH5) OE(PH6)
|
// Set Control Pins to Output RST(PH0) WR(PH5) OE(PH6)
|
||||||
DDRH |= (1 << 0) | (1 << 5) | (1 << 6);
|
DDRH |= (1 << 0) | (1 << 5) | (1 << 6);
|
||||||
// CE(PL1)
|
// CE(PL1)
|
||||||
@ -65,6 +121,7 @@ void setup_SMS() {
|
|||||||
PORTH |= (1 << 0) | (1 << 5) | (1 << 6);
|
PORTH |= (1 << 0) | (1 << 5) | (1 << 6);
|
||||||
// CE(PL1)
|
// CE(PL1)
|
||||||
PORTL |= (1 << 1);
|
PORTL |= (1 << 1);
|
||||||
|
}
|
||||||
|
|
||||||
// ROM has 16KB banks which can be mapped to one of three slots via register writes
|
// ROM has 16KB banks which can be mapped to one of three slots via register writes
|
||||||
// Register Slot Address space
|
// Register Slot Address space
|
||||||
@ -88,61 +145,111 @@ void setup_SMS() {
|
|||||||
Low level functions
|
Low level functions
|
||||||
*****************************************/
|
*****************************************/
|
||||||
void writeByte_SMS(word myAddress, byte myData) {
|
void writeByte_SMS(word myAddress, byte myData) {
|
||||||
|
if (retrode_mode) {
|
||||||
|
// Set Data Pins (D8-D15) to Output
|
||||||
|
DDRA = 0xFF;
|
||||||
|
} else {
|
||||||
// Set Data Pins (D0-D7) to Output
|
// Set Data Pins (D0-D7) to Output
|
||||||
DDRC = 0xFF;
|
DDRC = 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
// Set address
|
// Set address
|
||||||
PORTF = myAddress & 0xFF;
|
PORTF = myAddress & 0xFF;
|
||||||
PORTK = (myAddress >> 8) & 0xFF;
|
PORTK = (myAddress >> 8) & 0xFF;
|
||||||
|
if (!retrode_mode) {
|
||||||
|
// CE(PH3) and OE(PH6) are connected
|
||||||
PORTH = (PORTH & 0b11110111) | ((myAddress >> 12) & 0b00001000);
|
PORTH = (PORTH & 0b11110111) | ((myAddress >> 12) & 0b00001000);
|
||||||
|
}
|
||||||
|
|
||||||
// Output data
|
// Output data
|
||||||
|
if (retrode_mode) {
|
||||||
|
PORTA = myData;
|
||||||
|
} else {
|
||||||
PORTC = myData;
|
PORTC = myData;
|
||||||
|
}
|
||||||
|
|
||||||
// Arduino running at 16Mhz -> one nop = 62.5ns
|
// Arduino running at 16Mhz -> one nop = 62.5ns
|
||||||
// Wait till output is stable
|
// Wait till output is stable
|
||||||
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t");
|
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t");
|
||||||
|
|
||||||
|
if (retrode_mode) {
|
||||||
|
// Switch WR(PL5) and OE/CE(PH6) to LOW
|
||||||
|
PORTL &= ~(1 << 5);
|
||||||
|
PORTH &= ~(1 << 6);
|
||||||
|
} else {
|
||||||
// Switch CE(PL1) and WR(PH5) to LOW
|
// Switch CE(PL1) and WR(PH5) to LOW
|
||||||
PORTL &= ~(1 << 1);
|
PORTL &= ~(1 << 1);
|
||||||
PORTH &= ~(1 << 5);
|
PORTH &= ~(1 << 5);
|
||||||
|
}
|
||||||
|
|
||||||
// Leave WE low for at least 60ns
|
// Leave WR low for at least 60ns
|
||||||
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t");
|
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t");
|
||||||
|
|
||||||
|
if (retrode_mode) {
|
||||||
|
// Switch WR(PL5) and OE/CE(PH6) to HIGH
|
||||||
|
PORTH |= (1 << 6);
|
||||||
|
PORTL |= (1 << 5);
|
||||||
|
} else {
|
||||||
// Switch CE(PL1) and WR(PH5) to HIGH
|
// Switch CE(PL1) and WR(PH5) to HIGH
|
||||||
PORTH |= (1 << 5);
|
PORTH |= (1 << 5);
|
||||||
PORTL |= (1 << 1);
|
PORTL |= (1 << 1);
|
||||||
|
}
|
||||||
|
|
||||||
// Leave WE high for at least 50ns
|
// Leave WR high for at least 50ns
|
||||||
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t");
|
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t");
|
||||||
|
|
||||||
|
if (retrode_mode) {
|
||||||
|
// Set Data Pins (D8-D15) to Input
|
||||||
|
DDRA = 0x00;
|
||||||
|
} else {
|
||||||
|
// Set Data Pins (D0-D7) to Input
|
||||||
|
DDRC = 0x00;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
byte readByte_SMS(word myAddress) {
|
||||||
|
if (retrode_mode) {
|
||||||
|
// Set Data Pins (D8-D15) to Input
|
||||||
|
DDRA = 0x00;
|
||||||
|
} else {
|
||||||
// Set Data Pins (D0-D7) to Input
|
// Set Data Pins (D0-D7) to Input
|
||||||
DDRC = 0x00;
|
DDRC = 0x00;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte readByte_SMS(word myAddress) {
|
|
||||||
// Set Data Pins (D0-D7) to Input
|
|
||||||
DDRC = 0x00;
|
|
||||||
|
|
||||||
// Set Address
|
// Set Address
|
||||||
PORTF = myAddress & 0xFF;
|
PORTF = myAddress & 0xFF;
|
||||||
PORTK = (myAddress >> 8) & 0xFF;
|
PORTK = (myAddress >> 8) & 0xFF;
|
||||||
|
if (!retrode_mode) {
|
||||||
|
// CE(PH3) and OE(PH6) are connected
|
||||||
PORTH = (PORTH & 0b11110111) | ((myAddress >> 12) & 0b00001000);
|
PORTH = (PORTH & 0b11110111) | ((myAddress >> 12) & 0b00001000);
|
||||||
|
}
|
||||||
|
|
||||||
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t");
|
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t");
|
||||||
|
|
||||||
|
if (retrode_mode) {
|
||||||
|
// Switch RD(PL6) and OE(PH6) to LOW
|
||||||
|
PORTL &= ~(1 << 6);
|
||||||
|
PORTH &= ~(1 << 6);
|
||||||
|
} else {
|
||||||
// Switch CE(PL1) and OE(PH6) to LOW
|
// Switch CE(PL1) and OE(PH6) to LOW
|
||||||
PORTL &= ~(1 << 1);
|
PORTL &= ~(1 << 1);
|
||||||
PORTH &= ~(1 << 6);
|
PORTH &= ~(1 << 6);
|
||||||
|
}
|
||||||
|
|
||||||
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t");
|
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t");
|
||||||
|
|
||||||
// Read
|
// Read
|
||||||
byte tempByte = PINC;
|
byte tempByte = retrode_mode ? PINA : PINC;
|
||||||
|
|
||||||
|
if (retrode_mode) {
|
||||||
|
// Switch RD(PL6) and OE(PH6) to HIGH
|
||||||
|
PORTH |= (1 << 6);
|
||||||
|
PORTL |= (1 << 6);
|
||||||
|
} else {
|
||||||
// Switch CE(PL1) and OE(PH6) to HIGH
|
// Switch CE(PL1) and OE(PH6) to HIGH
|
||||||
PORTH |= (1 << 6);
|
PORTH |= (1 << 6);
|
||||||
PORTL |= (1 << 1);
|
PORTL |= (1 << 1);
|
||||||
|
}
|
||||||
|
|
||||||
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t");
|
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t");
|
||||||
|
|
||||||
@ -186,7 +293,11 @@ void getCartInfo_SMS() {
|
|||||||
cartSize = 128 * 1024UL;
|
cartSize = 128 * 1024UL;
|
||||||
break;
|
break;
|
||||||
case 0x0:
|
case 0x0:
|
||||||
|
if (retrode_mode) {
|
||||||
|
cartSize = 512 * 1024UL;
|
||||||
|
} else {
|
||||||
cartSize = 256 * 1024UL;
|
cartSize = 256 * 1024UL;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 0x1:
|
case 0x1:
|
||||||
cartSize = 512 * 1024UL;
|
cartSize = 512 * 1024UL;
|
||||||
@ -280,6 +391,113 @@ void readROM_SMS() {
|
|||||||
myFile.close();
|
myFile.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Read SRAM and save to the SD card
|
||||||
|
void readSRAM_SMS() {
|
||||||
|
// Get name, add extension and convert to char array for sd lib
|
||||||
|
strcpy(fileName, romName);
|
||||||
|
strcat(fileName, ".SAV");
|
||||||
|
|
||||||
|
// create a new folder
|
||||||
|
EEPROM_readAnything(0, foldern);
|
||||||
|
sprintf(folder, "SMS/SAVE/%s/%d", romName, foldern);
|
||||||
|
sd.mkdir(folder, true);
|
||||||
|
sd.chdir(folder);
|
||||||
|
|
||||||
|
display_Clear();
|
||||||
|
print_Msg(F("Saving to "));
|
||||||
|
print_Msg(folder);
|
||||||
|
println_Msg(F("/..."));
|
||||||
|
display_Update();
|
||||||
|
|
||||||
|
// write new folder number back to eeprom
|
||||||
|
foldern = foldern + 1;
|
||||||
|
EEPROM_writeAnything(0, foldern);
|
||||||
|
|
||||||
|
// Open file on sd card
|
||||||
|
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||||
|
print_Error(F("SD Error"), true);
|
||||||
|
}
|
||||||
|
// Write the whole 32KB
|
||||||
|
// When there is only 8KB of SRAM, the contents should be duplicated
|
||||||
|
word bankSize = 16 * 1024UL;
|
||||||
|
for (byte currBank = 0x0; currBank < 2; currBank++) {
|
||||||
|
writeByte_SMS(0xFFFC, 0x08 | (currBank << 2));
|
||||||
|
|
||||||
|
// Blink led
|
||||||
|
PORTB ^= (1 << 4);
|
||||||
|
// Read 16KB from slot 2 which starts at 0x8000
|
||||||
|
for (word currBuffer = 0; currBuffer < bankSize; currBuffer += 512) {
|
||||||
|
// Fill SD buffer
|
||||||
|
for (int currByte = 0; currByte < 512; currByte++) {
|
||||||
|
sdBuffer[currByte] = readByte_SMS(0x8000 + currBuffer + currByte);
|
||||||
|
}
|
||||||
|
myFile.write(sdBuffer, 512);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Close the file:
|
||||||
|
myFile.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void writeSRAM_SMS() {
|
||||||
|
display_Clear();
|
||||||
|
|
||||||
|
if (false) {
|
||||||
|
print_Error(F("DISABLED"), false);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fileBrowser(F("Select file"));
|
||||||
|
|
||||||
|
sd.chdir();
|
||||||
|
sprintf(filePath, "%s/%s", filePath, fileName);
|
||||||
|
|
||||||
|
display_Clear();
|
||||||
|
println_Msg(F("Restoring from "));
|
||||||
|
println_Msg(filePath);
|
||||||
|
println_Msg(fileName);
|
||||||
|
display_Update();
|
||||||
|
|
||||||
|
if (myFile.open(filePath, O_READ)) {
|
||||||
|
// Get SRAM size from file, with a maximum of 32KB
|
||||||
|
uint32_t sramSize = myFile.fileSize();
|
||||||
|
if (sramSize > (32 * 1024)) {
|
||||||
|
sramSize = 32 * 1024;
|
||||||
|
}
|
||||||
|
print_Msg(F("sramSize: "));
|
||||||
|
print_Msg(sramSize);
|
||||||
|
println_Msg(F(""));
|
||||||
|
word bankSize = 16 * 1024;
|
||||||
|
for (word address = 0x0; address < sramSize; address += 512) {
|
||||||
|
byte currBank = address >= bankSize ? 1 : 0;
|
||||||
|
word page_address = address - (currBank * bankSize);
|
||||||
|
writeByte_SMS(0xFFFC, 0x08 | (currBank << 2));
|
||||||
|
// Blink led
|
||||||
|
PORTB ^= (1 << 4);
|
||||||
|
myFile.read(sdBuffer, 512);
|
||||||
|
for (int x = 0; x < 512; x++) {
|
||||||
|
writeByte_SMS(0x8000 + page_address + x, sdBuffer[x]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
myFile.close();
|
||||||
|
|
||||||
|
// Blink led
|
||||||
|
PORTB ^= (1 << 4);
|
||||||
|
|
||||||
|
println_Msg(F(""));
|
||||||
|
println_Msg(F("DONE"));
|
||||||
|
display_Update();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
print_Error(F("SD ERROR"), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
display_Clear();
|
||||||
|
|
||||||
|
sd.chdir(); // root
|
||||||
|
filePath[0] = '\0'; // Reset filePath
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
//******************************************
|
//******************************************
|
||||||
// End of File
|
// End of File
|
||||||
//******************************************
|
//******************************************
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
// SUPER NINTENDO MODULE
|
// SUPER NINTENDO MODULE
|
||||||
//******************************************
|
//******************************************
|
||||||
|
|
||||||
|
#include "options.h"
|
||||||
|
#ifdef enable_SNES
|
||||||
|
|
||||||
/******************************************
|
/******************************************
|
||||||
Defines
|
Defines
|
||||||
*****************************************/
|
*****************************************/
|
||||||
@ -86,6 +89,7 @@ void snsMenu() {
|
|||||||
mode = mode_SV;
|
mode = mode_SV;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifdef enable_FLASH
|
||||||
case 3:
|
case 3:
|
||||||
display_Clear();
|
display_Clear();
|
||||||
display_Update();
|
display_Update();
|
||||||
@ -105,6 +109,7 @@ void snsMenu() {
|
|||||||
wait();
|
wait();
|
||||||
mode = mode_FLASH8;
|
mode = mode_FLASH8;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
resetArduino();
|
resetArduino();
|
||||||
@ -1312,6 +1317,7 @@ void writeSRAM (boolean browseFile) {
|
|||||||
// Set RST RD WR to High and CS to Low
|
// Set RST RD WR to High and CS to Low
|
||||||
controlOut_SNES();
|
controlOut_SNES();
|
||||||
|
|
||||||
|
int sramBanks = 0;
|
||||||
// LoRom
|
// LoRom
|
||||||
if (romType == LO) {
|
if (romType == LO) {
|
||||||
// Sram size
|
// Sram size
|
||||||
@ -2095,6 +2101,8 @@ boolean eraseSRAM (byte b) {
|
|||||||
display_Update();
|
display_Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
//******************************************
|
//******************************************
|
||||||
// End of File
|
// End of File
|
||||||
//******************************************
|
//******************************************
|
||||||
|
@ -4,6 +4,9 @@
|
|||||||
// Added BSX Sram, copied from skamans enhanced sketch //sanni
|
// Added BSX Sram, copied from skamans enhanced sketch //sanni
|
||||||
//******************************************
|
//******************************************
|
||||||
|
|
||||||
|
#include "options.h"
|
||||||
|
#ifdef enable_SV
|
||||||
|
|
||||||
/******************************************
|
/******************************************
|
||||||
Satellaview 8M Memory Pack
|
Satellaview 8M Memory Pack
|
||||||
******************************************/
|
******************************************/
|
||||||
@ -665,6 +668,8 @@ void eraseAll_SV(void)
|
|||||||
writeBank_SV(0xC0, 0x0000, 0xFF); //Teriminate
|
writeBank_SV(0xC0, 0x0000, 0xFF); //Teriminate
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
//******************************************
|
//******************************************
|
||||||
// End of File
|
// End of File
|
||||||
//******************************************
|
//******************************************
|
||||||
|
@ -22,6 +22,9 @@
|
|||||||
// C46 : INT (for RTC alarm interrupt)
|
// C46 : INT (for RTC alarm interrupt)
|
||||||
// C47 : CLK (384KHz on WS)
|
// C47 : CLK (384KHz on WS)
|
||||||
|
|
||||||
|
#include "options.h"
|
||||||
|
#ifdef enable_WS
|
||||||
|
|
||||||
/******************************************
|
/******************************************
|
||||||
Menu
|
Menu
|
||||||
*****************************************/
|
*****************************************/
|
||||||
@ -1261,3 +1264,5 @@ void dataOut_WS()
|
|||||||
DDRC = 0xff;
|
DDRC = 0xff;
|
||||||
DDRA = 0xff;
|
DDRA = 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
36
Cart_Reader/options.h
Normal file
36
Cart_Reader/options.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
|
||||||
|
/******************************************
|
||||||
|
Options
|
||||||
|
******************************************/
|
||||||
|
// Change mainMenu to snsMenu, mdMenu, n64Menu, gbxMenu, pcsMenu,
|
||||||
|
// flashMenu, nesMenu or smsMenu for single slot Cart Readers
|
||||||
|
#define startMenu mainMenu
|
||||||
|
|
||||||
|
// Comment out to change to Serial Output
|
||||||
|
// be sure to change the Arduino Serial Monitor to no line ending
|
||||||
|
#define enable_OLED
|
||||||
|
|
||||||
|
// Skip OLED start-up animation
|
||||||
|
//#define fast_start
|
||||||
|
|
||||||
|
// Enable the second button
|
||||||
|
#define enable_Button2
|
||||||
|
|
||||||
|
// define enable_XXX to enable
|
||||||
|
#define enable_MD
|
||||||
|
#define enable_SMS
|
||||||
|
|
||||||
|
#define enable_PCE
|
||||||
|
|
||||||
|
#define enable_NES
|
||||||
|
#define enable_SNES
|
||||||
|
#define enable_SV
|
||||||
|
#define enable_NP
|
||||||
|
#define enable_GBX
|
||||||
|
#define enable_N64
|
||||||
|
|
||||||
|
#define enable_WS
|
||||||
|
|
||||||
|
#define enable_NGP
|
||||||
|
|
||||||
|
#define enable_FLASH
|
Loading…
Reference in New Issue
Block a user