Merge branch 'master' into support-casio-loopy

This commit is contained in:
Roger Braunstein 2023-06-28 13:13:26 -07:00
commit 52da1a1c36
35 changed files with 4189 additions and 1730 deletions

View File

@ -56,6 +56,9 @@ static const char arcMenuItem4[] PROGMEM = "Reset";
static const char* const menuOptionsARC[] PROGMEM = { arcMenuItem1, arcMenuItem2, arcMenuItem3, arcMenuItem4 };
void setup_ARC() {
// Request 5V
setVoltage(VOLTS_SET_5V);
// Set Address Pins to Output
// Arcadia 2001 uses A0-A13 [A14-A23 UNUSED]
//A0-A7
@ -94,7 +97,6 @@ void setup_ARC() {
}
void arcMenu() {
setVoltage(VOLTS_SET_5V);
convertPgm(menuOptionsARC, 4);
uint8_t mainMenu = question_box(F("ARCADIA 2001 MENU"), menuOptions, 4, 0);

View File

@ -63,6 +63,9 @@ static const char atariMenuItem4[] PROGMEM = "Reset";
static const char* const menuOptionsATARI[] PROGMEM = { atariMenuItem1, atariMenuItem2, atariMenuItem3, atariMenuItem4 };
void setup_ATARI() {
// Request 5V
setVoltage(VOLTS_SET_5V);
// Set Address Pins to Output
// Atari 2600 uses A0-A12 [A13-A23 UNUSED]
//A0-A7
@ -101,7 +104,6 @@ void setup_ATARI() {
}
void atariMenu() {
setVoltage(VOLTS_SET_5V);
convertPgm(menuOptionsATARI, 4);
uint8_t mainMenu = question_box(F("ATARI 2600 MENU"), menuOptions, 4, 0);

View File

@ -55,6 +55,9 @@ static const char colMenuItem3[] PROGMEM = "Set Size";
static const char* const menuOptionsCOL[] PROGMEM = { colMenuItem1, colMenuItem2, colMenuItem3, string_reset2 };
void setup_COL() {
// Request 5V
setVoltage(VOLTS_SET_5V);
// Set Address Pins to Output
// Colecovision uses A0-A14 [A15-A23 UNUSED]
//A0-A7
@ -93,7 +96,6 @@ void setup_COL() {
}
void colMenu() {
setVoltage(VOLTS_SET_5V);
convertPgm(menuOptionsCOL, 4);
uint8_t mainMenu = question_box(F("COLECOVISION MENU"), menuOptions, 4, 0);

View File

@ -4,8 +4,8 @@
This project represents a community-driven effort to provide
an easy to build and easy to modify cartridge dumper.
Date: 2023-03-29
Version: 12.5
Date: 2023-06-26
Version: 12.6
SD lib: https://github.com/greiman/SdFat
LCD lib: https://github.com/olikraus/u8g2
@ -15,13 +15,13 @@
RTC lib: https://github.com/adafruit/RTClib
Frequency lib: https://github.com/PaulStoffregen/FreqCount
Compiled with Arduino IDE 2.0.4
Compiled with Arduino IDE 2.1.0
Thanks to:
MichlK - ROM Reader for Super Nintendo
Jeff Saltzman - 4-Way Button
Wayne and Layne - Video Game Shield menu
skaman - Cart ROM READER SNES ENHANCED, Famicom Cart Dumper, Coleco-, Intellivision, Virtual Boy, WSV, PCW, ARC, Atari, ODY2, Fairchild modules
skaman - Cart ROM READER SNES ENHANCED, Famicom Cart Dumper, Coleco-, Intellivision, Virtual Boy, WSV, PCW, ARC, Atari, ODY2, Fairchild, MSX2, Pokemon Mini modules
Tamanegi_taro - PCE and Satellaview modules
splash5 - GBSmart, Wonderswan, NGP and Super A'can modules
hkz & themanbehindthecurtain - N64 flashram commands
@ -38,7 +38,7 @@
jiyunomegami, splash5, Kreeblah, ramapcsx2, PsyK0p4T, Dakkaron, majorpbx, Pickle, sdhizumi,
Uzlopak, sakman55, Tombo89, scrap-a, borti4938, vogelfreiheit, CaitSith2, Modman,
philenotfound, karimhadjsalem, nsx0r, ducky92, niklasweber, Lesserkuma, BacteriaMage,
vpelletier, Ancyker, mattiacci, RWeick
vpelletier, Ancyker, mattiacci, RWeick, joshman196
And to nocash for figuring out the secrets of the SFC Nintendo Power cartridge.
@ -248,6 +248,8 @@ void print_STR(byte string_number, boolean newline) {
#define mode_ARC 30
#define mode_FAIRCHILD 31
#define mode_SUPRACAN 32
#define mode_MSX 33
#define mode_POKE 34
// optimization-safe nop delay
#define NOP __asm__ __volatile__("nop\n\t")
@ -367,7 +369,6 @@ void draw_progressbar(uint32_t processedsize, uint32_t totalsize);
byte eepbit[8];
byte eeptemp;
#ifdef nointro
// Array to hold iNES header
byte iNES_HEADER[16];
//ID 0-3
@ -382,7 +383,6 @@ byte iNES_HEADER[16];
//TV_system 12
//VS_hardware 13
//reserved 14, 15
#endif
//******************************************
// CRC32
@ -491,7 +491,7 @@ uint32_t calculateCRC(char* fileName, char* folder, int offset) {
/******************************************
CRC Functions for Atari, Fairchild, Ody2, Arc modules
*****************************************/
#if (defined(enable_ATARI) || defined(enable_ODY2) || defined(enable_ARC) || defined(enable_FAIRCHILD))
#if (defined(enable_ATARI) || defined(enable_ODY2) || defined(enable_ARC) || defined(enable_FAIRCHILD) || defined(enable_MSX) || defined(enable_POKE))
inline uint32_t updateCRC(uint8_t ch, uint32_t crc) {
uint32_t idx = ((crc) ^ (ch)) & 0xff;
@ -610,7 +610,6 @@ void rewind_line(FsFile& readfile, byte count = 1) {
// Calculate CRC32 if needed and compare it to CRC read from database
boolean compareCRC(const char* database, uint32_t crc32sum, boolean renamerom, int offset) {
#ifdef nointro
char crcStr[9];
print_Msg(F("CRC32... "));
display_Update();
@ -688,7 +687,7 @@ boolean compareCRC(const char* database, uint32_t crc32sum, boolean renamerom, i
if (renamerom) {
println_Msg(gamename);
// Rename file to nointro
// Rename file to database name
sd.chdir(folder);
delay(100);
if (myFile.open(fileName, O_READ)) {
@ -712,9 +711,6 @@ boolean compareCRC(const char* database, uint32_t crc32sum, boolean renamerom, i
print_Error(F("Database missing"));
return 0;
}
#else // nointro
println_Msg("");
#endif // !nointro
return 0;
}
@ -835,18 +831,20 @@ static const char modeItem9[] PROGMEM = "NeoGeo Pocket (3V)";
static const char modeItem10[] PROGMEM = "Intellivision";
static const char modeItem11[] PROGMEM = "Colecovision";
static const char modeItem12[] PROGMEM = "Virtual Boy";
static const char modeItem13[] PROGMEM = "Watara Supervision";
static const char modeItem13[] PROGMEM = "Watara Supervision (3V)";
static const char modeItem14[] PROGMEM = "Pocket Challenge W";
static const char modeItem15[] PROGMEM = "Atari 2600";
static const char modeItem16[] PROGMEM = "Magnavox Odyssey 2";
static const char modeItem17[] PROGMEM = "Arcadia 2001";
static const char modeItem18[] PROGMEM = "Fairchild Channel F";
static const char modeItem19[] PROGMEM = "Super A'can";
static const char modeItem20[] PROGMEM = "Flashrom Programmer";
static const char modeItem21[] PROGMEM = "Self Test";
static const char modeItem22[] PROGMEM = "About";
//static const char modeItem22[] PROGMEM = "Reset"; (stored in common strings array)
static const char* const modeOptions[] PROGMEM = { modeItem1, modeItem2, modeItem3, modeItem4, modeItem5, modeItem6, modeItem7, modeItem8, modeItem9, modeItem10, modeItem11, modeItem12, modeItem13, modeItem14, modeItem15, modeItem16, modeItem17, modeItem18, modeItem19, modeItem20, modeItem21, modeItem22, string_reset2 };
static const char modeItem20[] PROGMEM = "MSX";
static const char modeItem21[] PROGMEM = "Pokemon Mini (3V)";
static const char modeItem22[] PROGMEM = "Flashrom Programmer";
static const char modeItem23[] PROGMEM = "Self Test (3V)";
static const char modeItem24[] PROGMEM = "About";
//static const char modeItem25[] PROGMEM = "Reset"; (stored in common strings array)
static const char* const modeOptions[] PROGMEM = { modeItem1, modeItem2, modeItem3, modeItem4, modeItem5, modeItem6, modeItem7, modeItem8, modeItem9, modeItem10, modeItem11, modeItem12, modeItem13, modeItem14, modeItem15, modeItem16, modeItem17, modeItem18, modeItem19, modeItem20, modeItem21, modeItem22, modeItem23, modeItem24, string_reset2 };
// All included slots
void mainMenu() {
@ -872,7 +870,7 @@ void mainMenu() {
num_answers = 7;
} else { // currPage == 4
option_offset = 21;
num_answers = 2;
num_answers = 4;
}
// Copy menuOptions out of progmem
convertPgm(modeOptions + option_offset, num_answers);
@ -901,9 +899,7 @@ void mainMenu() {
display_Clear();
display_Update();
setup_NES();
#ifdef nointro
getMapping();
#endif
checkStatus_NES();
nesMenu();
break;
@ -1026,23 +1022,40 @@ void mainMenu() {
break;
#endif
#ifdef enable_FLASH
#ifdef enable_MSX
case 19:
setup_MSX();
msxMenu();
break;
#endif
#ifdef enable_POKE
case 20:
setup_POKE();
pokeMenu();
break;
#endif
#ifdef enable_FLASH
case 21:
#ifdef ENABLE_VSELECT
setup_FlashVoltage();
#endif
flashMenu();
break;
#endif
#ifdef enable_selftest
case 20:
case 22:
selfTest();
break;
#endif
case 21:
case 23:
aboutScreen();
break;
case 22:
case 24:
resetArduino();
break;
@ -1093,8 +1106,9 @@ static const char* const consoles70Options[] PROGMEM = { consoles70Item1, consol
static const char consoles80Item1[] PROGMEM = "NES/Famicom";
static const char consoles80Item2[] PROGMEM = "PC Engine/TG16";
static const char consoles80Item3[] PROGMEM = "SMS/GG/MIII/SG-1000";
//static const char consoles80Item4[] PROGMEM = "Reset"; (stored in common strings array)
static const char* const consoles80Options[] PROGMEM = { consoles80Item1, consoles80Item2, consoles80Item3, string_reset2 };
static const char consoles80Item4[] PROGMEM = "MSX";
//static const char consoles80Item5[] PROGMEM = "Reset"; (stored in common strings array)
static const char* const consoles80Options[] PROGMEM = { consoles80Item1, consoles80Item2, consoles80Item3, consoles80Item4, string_reset2 };
// 90s Consoles submenu
static const char consoles90Item1[] PROGMEM = "Super A'can";
@ -1104,10 +1118,11 @@ static const char* const consoles90Options[] PROGMEM = { consoles90Item1, string
static const char handheldsItem1[] PROGMEM = "Virtual Boy";
static const char handheldsItem2[] PROGMEM = "WonderSwan (3V)";
static const char handheldsItem3[] PROGMEM = "NeoGeo Pocket (3V)";
static const char handheldsItem4[] PROGMEM = "Watara Supervision";
static const char handheldsItem4[] PROGMEM = "Watara Supervision (3V)";
static const char handheldsItem5[] PROGMEM = "Pocket Challenge W";
static const char handheldsItem6[] PROGMEM = "Pokemon Mini (3V)";
//static const char handheldsItem6[] PROGMEM = "Reset"; (stored in common strings array)
static const char* const handheldsOptions[] PROGMEM = { handheldsItem1, handheldsItem2, handheldsItem3, handheldsItem4, handheldsItem5, string_reset2 };
static const char* const handheldsOptions[] PROGMEM = { handheldsItem1, handheldsItem2, handheldsItem3, handheldsItem4, handheldsItem5, handheldsItem6, string_reset2 };
// All included slots
void mainMenu() {
@ -1191,6 +1206,9 @@ void addonMenu() {
#ifdef enable_FLASH
case 4:
#ifdef ENABLE_VSELECT
setup_FlashVoltage();
#endif
flashMenu();
break;
#endif
@ -1275,8 +1293,8 @@ void consoles80Menu() {
// create menu with title and 6 options to choose from
unsigned char consoles80Menu;
// Copy menuOptions out of progmem
convertPgm(consoles80Options, 4);
consoles80Menu = question_box(F("Choose Adapter"), menuOptions, 4, 0);
convertPgm(consoles80Options, 5);
consoles80Menu = question_box(F("Choose Adapter"), menuOptions, 5, 0);
// wait for user choice to come back from the question box menu
switch (consoles80Menu) {
@ -1286,9 +1304,7 @@ void consoles80Menu() {
display_Clear();
display_Update();
setup_NES();
#ifdef nointro
getMapping();
#endif
checkStatus_NES();
nesMenu();
break;
@ -1306,7 +1322,14 @@ void consoles80Menu() {
break;
#endif
#ifdef enable_MSX
case 3:
setup_MSX();
msxMenu();
break;
#endif
case 4:
resetArduino();
break;
@ -1345,8 +1368,8 @@ void handheldMenu() {
// create menu with title and 6 options to choose from
unsigned char handheldsMenu;
// Copy menuOptions out of progmem
convertPgm(handheldsOptions, 6);
handheldsMenu = question_box(F("Choose Adapter"), menuOptions, 6, 0);
convertPgm(handheldsOptions, 7);
handheldsMenu = question_box(F("Choose Adapter"), menuOptions, 7, 0);
// wait for user choice to come back from the question box menu
switch (handheldsMenu) {
@ -1389,7 +1412,14 @@ void handheldMenu() {
break;
#endif
#ifdef enable_POKE
case 5:
setup_POKE();
pokeMenu();
break;
#endif
case 6:
resetArduino();
break;
@ -1405,6 +1435,11 @@ void handheldMenu() {
#ifdef enable_selftest
void selfTest() {
#ifdef ENABLE_VSELECT
// Set Automatic Voltage Selection to 3V
setVoltage(VOLTS_SET_3V3);
#endif
display_Clear();
println_Msg(F("Self Test"));
println_Msg(F(""));
@ -2036,8 +2071,10 @@ void setup() {
#endif
#endif
#ifdef ENABLE_VSELECT
// Set power to low to protect carts
setVoltage(VOLTS_SET_3V3);
#endif
#ifdef enable_OLED
display.begin();
@ -2100,7 +2137,7 @@ void setup() {
statusLED(true);
// Start menu system
startMenu();
mainMenu();
}
/******************************************
@ -3548,6 +3585,16 @@ void loop() {
else if (mode == mode_SUPRACAN) {
suprAcanMenu();
}
#endif
#ifdef enable_MSX
else if (mode == mode_MSX) {
msxMenu();
}
#endif
#ifdef enable_POKE
else if (mode == mode_POKE) {
pokeMenu();
}
#endif
else {
display_Clear();

View File

@ -151,6 +151,13 @@
/****/
/* [ MSX ------------------------------------------- ]
*/
//#define enable_MSX
/****/
/* [ PC Engine/TurboGrafx 16 -------------------------------------- ]
*/
@ -158,6 +165,13 @@
/****/
/* [ Pokemon Mini -------------------------------------- ]
*/
//#define enable_POKE
/****/
/* [ Sega Master System/Mark III/Game Gear/SG-1000 ---------------- ]
*/
@ -253,7 +267,7 @@
* other than HW5 and HW3.
*/
#define ENABLE_UPDATER
//#define ENABLE_UPDATER
/****/
@ -265,19 +279,6 @@
/****/
/* [ Start Menu --------------------------------------------------- ]
* Change this when using a single slot cart reader to always start
* in that menu.
*
* OPTIONS :
* mainMenu, snsMenu, mdMenu, n64Menu, gbxMenu, pcsMenu,
* flashMenu, nesMenu, smsMenu
*/
#define startMenu mainMenu
/****/
/* [ Logging ------------------------------------------------------ ]
* Write all info to OSCR_LOG.txt in root dir
*/
@ -286,14 +287,6 @@
/****/
/* [ Use No Intro Database ---------------------------------------- ]
* Renames ROM if found in database
*/
#define nointro
/****/
/* [ SNES Core/CLOCKGEN: Read Clock Generator Calibration Data ---- ]
* Toggle to use calibration data from snes_clk.txt
*/

View File

@ -87,6 +87,9 @@ static const char fairchildMenuItem5[] PROGMEM = "Reset";
static const char* const menuOptionsFAIRCHILD[] PROGMEM = { fairchildMenuItem1, fairchildMenuItem2, fairchildMenuItem3, fairchildMenuItem4, fairchildMenuItem5 };
void setup_FAIRCHILD() {
// Request 5V
setVoltage(VOLTS_SET_5V);
// Set Address Pins to Output
// Channel F uses A0-A4 [A5-A23 UNUSED]
//A0-A7
@ -126,7 +129,6 @@ void setup_FAIRCHILD() {
}
void fairchildMenu() {
setVoltage(VOLTS_SET_5V);
convertPgm(menuOptionsFAIRCHILD, 5);
uint8_t mainMenu = question_box(F("CHANNEL F MENU"), menuOptions, 5, 0);

View File

@ -680,6 +680,41 @@ void id_Flash16() {
/******************************************
Setup
*****************************************/
#if defined(ENABLE_VSELECT) || defined(ENABLE_3V3FIX)
static const char flashvoltItem1[] PROGMEM = "3.3V";
static const char flashvoltItem2[] PROGMEM = "5V";
//static const char flashvoltItem3[] PROGMEM = "Reset"; (stored in common strings array)
static const char* const flashvoltOptions[] PROGMEM = { flashvoltItem1, flashvoltItem2, string_reset2 };
void setup_FlashVoltage() {
// create menu with title and 3 options to choose from
unsigned char flashvolt;
// Copy menuOptions out of progmem
convertPgm(flashvoltOptions, 3);
flashvolt = question_box(F("Select Flash Voltage"), menuOptions, 3, 0);
// wait for user choice to come back from the question box menu
switch (flashvolt) {
case 0:
// Request 3.3V
setVoltage(VOLTS_SET_3V3);
break;
case 1:
// Request 5V
setVoltage(VOLTS_SET_5V);
break;
case 2:
resetArduino();
break;
}
}
#else
// The compiler will optimize this out when this condition is met.
void setup_FlashVoltage() {}
#endif
void setup_Flash8() {
// Set Address Pins to Output
//A0-A7

View File

@ -41,8 +41,7 @@ static const char* const menuOptionsGBFlash[] PROGMEM = { GBFlashItem1, GBFlashI
// Start menu for both GB and GBA
void gbxMenu() {
setVoltage(VOLTS_SET_3V3);
// create menu with title and 4 options to choose from
// create menu with title and 5 options to choose from
unsigned char gbType;
// Copy menuOptions out of progmem
convertPgm(menuOptionsGBx, 5);
@ -51,7 +50,6 @@ void gbxMenu() {
// wait for user choice to come back from the question box menu
switch (gbType) {
case 0:
setVoltage(VOLTS_SET_5V);
display_Clear();
display_Update();
setup_GB();
@ -59,7 +57,6 @@ void gbxMenu() {
break;
case 1:
setVoltage(VOLTS_SET_3V3);
display_Clear();
display_Update();
setup_GBA();
@ -69,7 +66,6 @@ void gbxMenu() {
case 2:
// create submenu with title and 7 options to choose from
unsigned char gbFlash;
setVoltage(VOLTS_SET_5V);
// Copy menuOptions out of progmem
convertPgm(menuOptionsGBFlash, 7);
gbFlash = question_box(F("Select type"), menuOptions, 7, 0);
@ -97,7 +93,6 @@ void gbxMenu() {
case 1:
//Flash MBC5
setVoltage(VOLTS_SET_5V);
display_Clear();
display_Update();
setup_GB();
@ -291,7 +286,7 @@ void gbxMenu() {
}
void gbMenu() {
// create menu with title and 3 options to choose from
// create menu with title and 4 options to choose from
unsigned char mainMenu;
// Copy menuOptions out of progmem
convertPgm(menuOptionsGB, 4);
@ -375,6 +370,9 @@ void gbMenu() {
Setup
*****************************************/
void setup_GB() {
// Request 5V
setVoltage(VOLTS_SET_5V);
// Set Address Pins to Output
//A0-A7
DDRF = 0xFF;
@ -876,7 +874,7 @@ void getCartInfo_GB() {
if (romType == 32) {
sramBanks = 8;
lastByte = 0xAFFF;
} else if (romType == 34) { // MBC7
} else if (romType == 34) { // MBC7
lastByte = (*((uint16_t*)(eepbit + 6)) == 0xa5be ? 512 : 256); // Only "Command Master" use LC66 EEPROM
}

View File

@ -34,7 +34,6 @@ static const char GBASaveItem6[] PROGMEM = "1M FLASH";
static const char* const saveOptionsGBA[] PROGMEM = { GBASaveItem1, GBASaveItem2, GBASaveItem3, GBASaveItem4, GBASaveItem5, GBASaveItem6 };
void gbaMenu() {
setVoltage(VOLTS_SET_3V3);
// create menu with title and 4 options to choose from
unsigned char mainMenu;
// Copy menuOptions out of progmem
@ -247,6 +246,9 @@ void gbaMenu() {
Setup
*****************************************/
void setup_GBA() {
// Request 3.3V
setVoltage(VOLTS_SET_3V3);
setROM_GBA();
// Get cart info
@ -761,7 +763,7 @@ void getCartInfo_GBA() {
}
// Get name
buildRomName(romName, &sdBuffer[0xA0], 11);
buildRomName(romName, &sdBuffer[0xA0], 12);
// Get ROM version
romVersion = sdBuffer[0xBC];
@ -894,6 +896,18 @@ void readROM_GBA() {
draw_progressbar(processedProgressBar, totalProgressBar);
}
// Fix unmapped ROM area of cartridges with 32 MB ROM + EEPROM save type
if ((cartSize == 0x2000000) && ((saveType == 1) || (saveType == 2))) {
byte padding_byte[256];
char tempStr[32];
myFile.seek(0x1FFFEFF);
myFile.read(padding_byte, 1);
sprintf(tempStr, "Fixing ROM padding (0x%02X)", padding_byte[0]);
println_Msg(tempStr);
memset(padding_byte + 1, padding_byte[0], 255);
myFile.write(padding_byte, 256);
}
// Close the file:
myFile.close();
}

View File

@ -17,7 +17,6 @@ static const char gbmMenuItem7[] PROGMEM = "Write Mapping";
static const char* const menuOptionsGBM[] PROGMEM = { gbmMenuItem1, gbmMenuItem2, gbmMenuItem3, gbmMenuItem4, gbmMenuItem5, gbmMenuItem6, gbmMenuItem7 };
void gbmMenu() {
setVoltage(VOLTS_SET_5V);
// create menu with title and 7 options to choose from
unsigned char mainMenu;
// Copy menuOptions out of progmem
@ -185,6 +184,9 @@ void gbmMenu() {
Setup
*****************************************/
void setup_GBM() {
// Request 5V
setVoltage(VOLTS_SET_5V);
// Set RST(PH0) to Input
DDRH &= ~(1 << 0);
// Activate Internal Pullup Resistors

View File

@ -109,6 +109,9 @@ byte readByte_GBS(word myAddress) {
}
void setup_GBSmart() {
// Request 5V
setVoltage(VOLTS_SET_5V);
// take from setup_GB
// Set RST(PH0) to Input
DDRH &= ~(1 << 0);
@ -145,7 +148,6 @@ void setup_GBSmart() {
}
void gbSmartMenu() {
setVoltage(VOLTS_SET_5V);
uint8_t mainMenu;
// Copy menuOptions out of progmem

View File

@ -99,6 +99,9 @@ static const char intvMenuItem3[] PROGMEM = "Set Mapper + Size";
static const char* const menuOptionsINTV[] PROGMEM = { intvMenuItem1, intvMenuItem2, intvMenuItem3, string_reset2 };
void setup_INTV() {
// Request 5V
setVoltage(VOLTS_SET_5V);
// Set Address Pins to Output (UNUSED)
//A0-A7
DDRF = 0xFF;
@ -135,7 +138,6 @@ void setup_INTV() {
}
void intvMenu() {
setVoltage(VOLTS_SET_5V);
convertPgm(menuOptionsINTV, 4);
uint8_t mainMenu = question_box(F("INTELLIVISION MENU"), menuOptions, 4, 0);

View File

@ -13,6 +13,7 @@ word addrhi;
word addrlo;
word chksum;
boolean is32x = 0;
boolean isSVP = 0;
//***********************************************
// EEPROM SAVE TYPES
@ -86,7 +87,7 @@ unsigned long bramSize = 0;
boolean realtec = 0;
#ifndef DEFAULT_VALUE_segaSram16bit
#define DEFAULT_VALUE_segaSram16bit 0
#define DEFAULT_VALUE_segaSram16bit 0
#endif
int segaSram16bit = DEFAULT_VALUE_segaSram16bit;
@ -183,6 +184,11 @@ void mdLoadConf() {
}
#endif
void pulse_clock(int n) {
for (int i = 0; i < n; i++)
PORTH ^= (1 << 1);
}
/******************************************
Menu
*****************************************/
@ -211,7 +217,6 @@ static const char* const menuOptionsSCD[] PROGMEM = { SCDMenuItem1, SCDMenuItem2
// Sega start menu
void mdMenu() {
setVoltage(VOLTS_SET_5V);
// create menu with title and 4 options to choose from
unsigned char mdDev;
// Copy menuOptions out of progmem
@ -308,7 +313,7 @@ void mdCartMenu() {
readRealtec_MD();
} else {
readROM_MD();
// Calculate and compare CRC32 with nointro
// Calculate and compare CRC32 with database
if (is32x)
//database, crcString, renamerom, offset
compareCRC("32x.txt", 0, 1, 0);
@ -458,6 +463,9 @@ void segaCDMenu() {
Setup
*****************************************/
void setup_MD() {
// Request 5V
setVoltage(VOLTS_SET_5V);
#ifdef use_md_conf
mdLoadConf();
#endif
@ -473,18 +481,24 @@ void setup_MD() {
// Set Control Pins to Output RST(PH0) CLK(PH1) CS(PH3) WRH(PH4) WRL(PH5) OE(PH6)
DDRH |= (1 << 0) | (1 << 1) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6);
// Set TIME(PJ0) to Output
DDRJ |= (1 << 0);
// Set TIME(PJ0), AS(PJ1) to Output
DDRJ |= (1 << 0) | (1 << 1);
//set ASEL(PG5) to Output
DDRG |= (1 << 5);
// Set Data Pins (D0-D15) to Input
DDRC = 0x00;
DDRA = 0x00;
// Setting RST(PH0) CLK(PH1) CS(PH3) WRH(PH4) WRL(PH5) OE(PH6) HIGH
PORTH |= (1 << 0) | (1 << 1) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6);
// Setting RST(PH0) CS(PH3) WRH(PH4) WRL(PH5) OE(PH6) HIGH
PORTH |= (1 << 0) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6);
// Setting TIME(PJ0) HIGH
PORTJ |= (1 << 0);
// Setting TIME(PJ0) AS(PJ1) HIGH
PORTJ |= (1 << 0) | (1 << 1);
// setting ASEL(PG5) HIGH
PORTG |= (1 << 5);
delay(200);
@ -556,6 +570,12 @@ word readWord_MD(unsigned long myAddress) {
PORTH &= ~(1 << 3);
// Setting OE(PH6) LOW
PORTH &= ~(1 << 6);
// Setting AS(PJ1) LOW
PORTJ &= ~(1 << 1);
// Setting ASEL(PG5) LOW
PORTG &= ~(1 << 5);
// Pulse CLK(PH1), needed for SVP enhanced carts
pulse_clock(10);
// most MD ROMs are 200ns, comparable to SNES > use similar access delay of 6 x 62.5 = 375ns
NOP;
@ -572,6 +592,12 @@ word readWord_MD(unsigned long myAddress) {
PORTH |= (1 << 3);
// Setting OE(PH6) HIGH
PORTH |= (1 << 6);
// Setting AS(PJ1) HIGH
PORTJ |= (1 << 1);
// Setting ASEL(PG5) HIGH
PORTG |= (1 << 5);
// Pulse CLK(PH1), needed for SVP enhanced carts
pulse_clock(10);
// these 6x nop delays have been here before, unknown what they mean
NOP;
@ -718,6 +744,12 @@ void getCartInfo_MD() {
id[c + 1] = loByte;
}
//Identify games using SVP chip
if (!strncmp("GM MK-1229 ", id, 11) || !strncmp("GM G-7001 ", id, 11)) // Virtua Racing (E/U/J)
isSVP = 1;
else
isSVP = 0;
// Fix cartridge sizes according to no-intro database
if (cartSize == 0x400000) {
switch (chksum) {
@ -1414,6 +1446,14 @@ void readROM_MD() {
PORTH &= ~(1 << 3);
// Setting OE(PH6) LOW
PORTH &= ~(1 << 6);
// Setting AS(PJ1) LOW
PORTJ &= ~(1 << 1);
// Setting ASEL(PG5) LOW
PORTG &= ~(1 << 5);
// Pulse CLK(PH1)
if (isSVP)
pulse_clock(10);
// most MD ROMs are 200ns, comparable to SNES > use similar access delay of 6 x 62.5 = 375ns
NOP;
NOP;
@ -1430,6 +1470,13 @@ void readROM_MD() {
PORTH |= (1 << 3);
// Setting OE(PH6) HIGH
PORTH |= (1 << 6);
// Setting AS(PJ1) HIGH
PORTJ |= (1 << 1);
// Setting ASEL(PG5) HIGH
PORTG |= (1 << 5);
// Pulse CLK(PH1)
if (isSVP)
pulse_clock(10);
// Skip first 256 words
if (((currBuffer == 0) && (currWord >= 256)) || (currBuffer > 0)) {
@ -1463,6 +1510,14 @@ void readROM_MD() {
PORTH &= ~(1 << 3);
// Setting OE(PH6) LOW
PORTH &= ~(1 << 6);
// Setting AS(PJ1) LOW
PORTJ &= ~(1 << 1);
// Setting ASEL(PG5) LOW
PORTG &= ~(1 << 5);
// Pulse CLK(PH1)
if (isSVP)
pulse_clock(10);
// most MD ROMs are 200ns, comparable to SNES > use similar access delay of 6 x 62.5 = 375ns
NOP;
NOP;
@ -1479,6 +1534,13 @@ void readROM_MD() {
PORTH |= (1 << 3);
// Setting OE(PH6) HIGH
PORTH |= (1 << 6);
// Setting AS(PJ1) HIGH
PORTJ |= (1 << 1);
// Setting ASEL(PG5) HIGH
PORTG |= (1 << 5);
// Pulse CLK(PH1)
if (isSVP)
pulse_clock(10);
// Skip first 256 words
if (((currBuffer == 0) && (currWord >= 256)) || (currBuffer > 0)) {
@ -1513,6 +1575,14 @@ void readROM_MD() {
PORTH &= ~(1 << 3);
// Setting OE(PH6) LOW
PORTH &= ~(1 << 6);
// Setting AS(PJ1) LOW
PORTJ &= ~(1 << 1);
// Setting ASEL(PG5) LOW
PORTG &= ~(1 << 5);
// Pulse CLK(PH1)
if (isSVP)
PORTH ^= (1 << 1);
// most MD ROMs are 200ns, comparable to SNES > use similar access delay of 6 x 62.5 = 375ns
NOP;
NOP;
@ -1529,6 +1599,13 @@ void readROM_MD() {
PORTH |= (1 << 3);
// Setting OE(PH6) HIGH
PORTH |= (1 << 6);
// Setting AS(PJ1) HIGH
PORTJ |= (1 << 1);
// Setting ASEL(PG5) HIGH
PORTG |= (1 << 5);
// Pulse CLK(PH1)
if (isSVP)
PORTH ^= (1 << 1);
calcCKSSonic2 += ((buffer[d] << 8) | buffer[d + 1]);
d += 2;
@ -2006,13 +2083,12 @@ void busyCheck_MD() {
//******************************************
// EEPROM Functions
//******************************************
void EepromInit(byte eepmode) { // Acclaim Type 2
PORTF = 0x00; // ADDR A0-A7
PORTK = 0x00; // ADDR A8-A15
PORTL = 0x10; // ADDR A16-A23
PORTA = 0x00; // DATA D8-D15
PORTH |= (1 << 0); // /RES HIGH
void EepromInit(byte eepmode) { // Acclaim Type 2
PORTF = 0x00; // ADDR A0-A7
PORTK = 0x00; // ADDR A8-A15
PORTL = 0x10; // ADDR A16-A23
PORTA = 0x00; // DATA D8-D15
PORTH |= (1 << 0); // /RES HIGH
PORTC = eepmode; // EEPROM Switch: 0 = Enable (Read EEPROM), 1 = Disable (Read ROM)
PORTH &= ~(1 << 3); // CE LOW
PORTH &= ~(1 << 4) & ~(1 << 5); // /UDSW + /LDSW LOW
@ -2250,7 +2326,6 @@ void EepromSet1() {
}
}
void EepromDevice() { // 24C02+
EepromSet1();
EepromSet0();

1662
Cart_Reader/MSX.ino Normal file

File diff suppressed because it is too large Load Diff

View File

@ -114,7 +114,6 @@ static const char* const sectorOptionsN64[] PROGMEM = { N64SectorItem1, N64Secto
// N64 start menu
void n64Menu() {
setVoltage(VOLTS_SET_3V3);
// create menu with title and 5 options to choose from
unsigned char n64Dev;
// Copy menuOptions out of progmem
@ -400,6 +399,9 @@ void n64CartMenu() {
Setup
*****************************************/
void setup_N64_Controller() {
// Request 3.3V
setVoltage(VOLTS_SET_3V3);
// Output a low signal
PORTH &= ~(1 << 4);
// Set Controller Data Pin(PH4) to Input
@ -407,6 +409,9 @@ void setup_N64_Controller() {
}
void setup_N64_Cart() {
// Request 3.3V
setVoltage(VOLTS_SET_3V3);
// Set Address Pins to Output and set them low
//A0-A7
DDRF = 0xFF;
@ -1052,7 +1057,7 @@ void nextscreen() {
}
void controllerTest_Display() {
int mode = 0;
boolean cmode = 1;
//name of the current displayed result
String anastick = "";
@ -1162,7 +1167,7 @@ void controllerTest_Display() {
display.drawStr(36, 8, "Range Test");
display.drawLine(0, 9, 128, 9);
if (mode == 0) {
if (cmode == 0) {
// Print Stick X Value
String stickx = String("X:" + String(N64_status.stick_x, DEC) + " ");
printSTR(stickx, 22 + 54, 26);
@ -1186,7 +1191,7 @@ void controllerTest_Display() {
display.drawPixel(10 + xax - 68 / 4, 12 + yax + 68 / 4);
//Draw Analog Stick
if (mode == 1) {
if (cmode == 1) {
display.drawPixel(10 + xax + N64_status.stick_x / 4, 12 + yax - N64_status.stick_y / 4);
//Update LCD
display.updateDisplay();
@ -1199,11 +1204,11 @@ void controllerTest_Display() {
// switch mode
if (button == "Press a button" && lastbutton == "Z") {
if (mode == 0) {
mode = 1;
if (cmode == 0) {
cmode = 1;
display.clearDisplay();
} else {
mode = 0;
cmode = 0;
display.clearDisplay();
}
}

File diff suppressed because it is too large Load Diff

View File

@ -21,6 +21,9 @@ uint8_t manufacturerID;
uint8_t deviceID;
void setup_NGP() {
// Request 3.3V
setVoltage(VOLTS_SET_3V3);
// A0 - A7
DDRF = 0xff;
// A8 - A15
@ -52,7 +55,6 @@ void setup_NGP() {
}
void ngpMenu() {
setVoltage(VOLTS_SET_3V3);
uint8_t mainMenu;
convertPgm(menuOptionsNGP, 4);

View File

@ -69,6 +69,9 @@ static const char ody2MenuItem4[] PROGMEM = "Reset";
static const char* const menuOptionsODY2[] PROGMEM = { ody2MenuItem1, ody2MenuItem2, ody2MenuItem3, ody2MenuItem4 };
void setup_ODY2() {
// Request 5V
setVoltage(VOLTS_SET_5V);
// Set Address Pins to Output
// Odyssey 2 uses A0-A13 [A14-A23 UNUSED]
//A0-A7
@ -110,7 +113,6 @@ void setup_ODY2() {
}
void ody2Menu() {
setVoltage(VOLTS_SET_5V);
convertPgm(menuOptionsODY2, 4);
uint8_t mainMenu = question_box(F("ODYSSEY 2 MENU"), menuOptions, 4, 0);

View File

@ -41,7 +41,7 @@
/*==== VARIABLES ==================================================*/
// Firmware Version
char ver[5] = "12.5";
char ver[5] = "12.6";
// Clock speed
unsigned long clock = CS_16MHZ;
@ -173,55 +173,76 @@ VOLTS setVoltage(VOLTS volts) {
switch(volts) {
/* 5V */
case VOLTS_SET_5V:
if (clock == CS_16MHZ && volts == VOLTS_SET_5V) return VOLTS_SUCCESS; // Just return if already as requested
if (
#if defined(ENABLE_3V3FIX)
clock == CS_16MHZ
#endif
#if defined(ENABLE_VSELECT) && defined(ENABLE_3V3FIX)
&&
#endif
#if defined(ENABLE_VSELECT)
VOLTS_SET_5V == voltage
#endif
) return VOLTS_SUCCESS; // Just return if already as requested
// Adjust voltage high if VSELECT is available
#if defined(ENABLE_VSELECT)
PORTD &= ~(1 << 7); /*[1]*/
voltage = VOLTS_SET_5V;
#endif
#if defined(ENABLE_VSELECT)
PORTD &= ~(1 << 7); /*[1]*/
voltage = VOLTS_SET_5V;
#endif
// Adjust clock speed when 3V3FIX is enabled
#if defined(ENABLE_3V3FIX)
// Stop serial if running
#if !defined(enable_serial) && defined(ENABLE_UPDATER)
ClockedSerial.end();
#endif
// Set clock speed
clock = CS_16MHZ;
setClockScale(volts); /*[2]*/
// Restart serial
#if !defined(enable_serial) && defined(ENABLE_UPDATER)
ClockedSerial.begin(UPD_BAUD);
#endif
#else
clock = CS_16MHZ;
#endif
#if defined(ENABLE_3V3FIX)
// Stop serial if running
#if !defined(enable_serial) && defined(ENABLE_UPDATER)
ClockedSerial.end();
#endif
// Set clock speed
clock = CS_16MHZ;
setClockScale(volts); /*[2]*/
// Restart serial
#if !defined(enable_serial) && defined(ENABLE_UPDATER)
ClockedSerial.begin(UPD_BAUD);
#endif
#else
clock = CS_16MHZ;
#endif
// Done
return VOLTS_SUCCESS;
/* 3.3V */
case VOLTS_SET_3V3:
if (clock == CS_8MHZ && volts == VOLTS_SET_3V3) return VOLTS_SUCCESS; // Just return if already as requested
if (
#if defined(ENABLE_3V3FIX)
clock == CS_8MHZ
#endif
#if defined(ENABLE_VSELECT) && defined(ENABLE_3V3FIX)
&&
#endif
#if defined(ENABLE_VSELECT)
VOLTS_SET_3V3 == voltage
#endif
) return VOLTS_SUCCESS; // Just return if already as requested
// Adjust clock speed when 3V3FIX is enabled
#if defined(ENABLE_3V3FIX)
#if !defined(enable_serial) && defined(ENABLE_UPDATER)
ClockedSerial.end();
#endif
clock = CS_8MHZ;
setClockScale(volts); /*[2]*/
#if !defined(enable_serial) && defined(ENABLE_UPDATER)
ClockedSerial.begin(UPD_BAUD);
#endif
#endif
#if defined(ENABLE_3V3FIX)
#if !defined(enable_serial) && defined(ENABLE_UPDATER)
ClockedSerial.end();
#endif
// Set clock speed
clock = CS_8MHZ;
setClockScale(volts); /*[2]*/
#if !defined(enable_serial) && defined(ENABLE_UPDATER)
ClockedSerial.begin(UPD_BAUD);
#endif
#endif
// Adjust voltage high if VSELECT is available
#if defined(ENABLE_VSELECT)
PORTD |= (1 << 7); /*[1]*/
voltage = VOLTS_SET_3V3;
#endif
#if defined(ENABLE_VSELECT)
PORTD |= (1 << 7); /*[1]*/
voltage = VOLTS_SET_3V3;
#endif
// Done
return VOLTS_SUCCESS;
@ -232,6 +253,9 @@ VOLTS setVoltage(VOLTS volts) {
}
}
#else
// The compiler will optimize this out when this condition is met.
// Yes, even though it has a return value it will only be compiled
// if something reads that value. Currently nothing does.
VOLTS setVoltage(VOLTS volts __attribute__((unused))) {
return VOLTS_NOTENABLED;
}

View File

@ -70,7 +70,6 @@ static const char *const menuOptionspceTC[] PROGMEM = { pceTCMenuItem1, string_r
// PCE start menu
void pcsMenu(void) {
setVoltage(VOLTS_SET_5V);
// create menu with title and 3 options to choose from
unsigned char pceDev;
// Copy menuOptions out of progmem
@ -171,6 +170,9 @@ void pin_init_PCE(void) {
}
void setup_cart_PCE(void) {
// Request 5V
setVoltage(VOLTS_SET_5V);
// Set cicrstPin(PG1) to Output
DDRG |= (1 << 1);
// Output a high to disable CIC
@ -411,6 +413,12 @@ uint32_t detect_rom_size_PCE(void) {
rom_size = 512;
}
}
if (rom_size == 384) {
//"CD-ROM² Super System Card (v3.0)(Japan)" or "Arcade Card Pro CD-ROM²"
if (read_byte_PCE(0x29D1) == 'V' && read_byte_PCE(0x29D2) == 'E' && read_byte_PCE(0x29D3) == 'R' && read_byte_PCE(0x29D4) == '.' && read_byte_PCE(0x29D5) == ' ' && read_byte_PCE(0x29D6) == '3' && read_byte_PCE(0x29D7) == '.' && read_byte_PCE(0x29D8) == '0' && read_byte_PCE(0x29D9) == '0') {
rom_size = 256;
}
}
return rom_size;
}

View File

@ -101,6 +101,9 @@ byte bank1;
//******************************************
void setup_PCW() {
// Request 5V
setVoltage(VOLTS_SET_5V);
// Set Address Pins to Output
//A8-A15
DDRK = 0xFF;
@ -141,7 +144,6 @@ static const char pcwmenuItem3[] PROGMEM = "Write SRAM";
static const char* const menuOptionsPCW[] PROGMEM = { pcwmenuItem1, pcwmenuItem2, pcwmenuItem3, string_reset2 };
void pcwMenu() {
setVoltage(VOLTS_SET_5V);
convertPgm(menuOptionsPCW, 4);
uint8_t mainMenu = question_box(F(" POCKET CHALLENGE W"), menuOptions, 4, 0);
@ -629,7 +631,7 @@ uint32_t detect_rom_size_PCW(void) {
} else if (detect_2m == DETECTION_SIZE) {
rom_size = 0x200000;
} else {
rom_size = 0x400000;
rom_size = 0x400000;
}
return rom_size;

283
Cart_Reader/POKEMINI.ino Normal file
View File

@ -0,0 +1,283 @@
//******************************************
// POKEMON MINI MODULE
//******************************************
#ifdef enable_POKE
// Pokemon Mini
// Cartridge Pinout
// 32P 0.5mm pitch
// NOTE: Console SMD connector - 33P 1.0mm pitch
//
// TOP ROW BOTTOM ROW
// +----------+
// VCC (3.3V) -| B1 |
// | A1 |- VCC (3.3V)
// A20 -| B2 |
// | A2 |- A9/A19
// A8/A18 -| B3 |
// | A3 |- A7/A17
// A6/A16 -| B4 |
// | A4 |- A5/A15
// A4/A14 -| B5 |
// | A5 |- A3/A13
// A2/A12 -| B6 |
// | A6 |- A1/A11
// A0/A10 -| B7 |
// | A7 |- VCC (3.3V)
// HALE -| B8 |
// | -- |
// LALE -| B9 |
// | A8 |- GND
// D0 -| B10 |
// | A9 |- D1
// D2 -| B11 |
// | A10 |- D3
// D4 -| B12 |
// | A11 |- D5
// D6 -| B13 |
// | A12 |- D7
// OE -| B14 |
// | A13 |- IRQ
// WE -| B15 |
// | A14 |- CS
// CARD_N -| B16 |
// | A15 |- GND
// GND -| B17 |
// +----------+
//
// TOP
// +----------------------------------------------------------------------------+
// | B17 B16 B15 B14 B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 |
// LEFT | | RIGHT
// | A15 A14 A13 A12 A11 A10 A9 A8 --- A7 A6 A5 A4 A3 A2 A1 |
// +----------------------------------------------------------------------------+
// BOTTOM
// CONTROL PINS:
// HALE(PH0) - SNES RESET
// CS(PH3) - SNES /CS
// LALE(PH4) - SNES /IRQ
// WE(PH5) - SNES /WR
// OE(PH6) - SNES /RD
// NOTE: SET VOLTAGE TO 3.3V
//******************************************
// Defines
//******************************************
#define HALE_ENABLE PORTH |= (1 << 0) // LATCH HIGH ADDRESS
#define HALE_DISABLE PORTH &= ~(1 << 0)
#define LALE_ENABLE PORTH |= (1 << 4) // LATCH LOW ADDRESS
#define LALE_DISABLE PORTH &= ~(1 << 4)
#define CS_ENABLE PORTH |= (1 << 3) // CHIP SELECT
#define CS_DISABLE PORTH &= ~(1 << 3)
#define WE_ENABLE PORTH |= (1 << 5) // WRITE ENABLE
#define WE_DISABLE PORTH &= ~(1 << 5)
#define OE_ENABLE PORTH |= (1 << 6) // OUTPUT ENABLE
#define OE_DISABLE PORTH &= ~(1 << 6)
//******************************************
// Menu
//******************************************
// Base Menu
static const char pokeMenuItem1[] PROGMEM = "Read ROM";
static const char* const menuOptionsPOKE[] PROGMEM = { pokeMenuItem1, string_reset2 };
void pokeMenu() {
convertPgm(menuOptionsPOKE, 2);
uint8_t mainMenu = question_box(F("POKEMON MINI MENU"), menuOptions, 2, 0);
switch (mainMenu) {
case 0:
// Read ROM
sd.chdir("/");
readROM_POKE();
sd.chdir("/");
break;
case 1:
// reset
resetArduino();
break;
}
}
//******************************************
// SETUP
//******************************************
void setup_POKE() {
// Request 3.3V
setVoltage(VOLTS_SET_3V3);
// Set Address Pins to Output
// Pokemon Mini uses A0-A9 (DUAL A10-A19) + A20 (CONNECT TO SNES A10) [A11-A23 UNUSED]
//A0-A7
DDRF = 0xFF;
//A8-A15
DDRK = 0xFF;
//A16-A23
DDRL = 0xFF;
// Set Control Pins to Output
// LALE(PH0) ---(PH1) CS(PH3) HALE(PH4) WE(PH5) OE(PH6)
DDRH |= (1 << 0) | (1 << 1) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6);
// Set TIME(PJ0) to Output (UNUSED)
DDRJ |= (1 << 0);
// Set Pins (D0-D7) to Input
DDRC = 0x00;
// Setting Control Pins to LOW (DISABLE)
// LALE(PH0) CS(PH3) HALE(PH4) WE(PH5) OE(PH6)
PORTH &= ~(1 << 0) & ~(1 << 3) & ~(1 << 4) & ~(1 << 5) & ~(1 << 6);
// SET CS HIGH
PORTH |= (1 << 3); // CS HIGH (ENABLE)
// Set Unused Data Pins (PA0-PA7) to Output
DDRA = 0xFF;
// Set Unused Pins HIGH
PORTA = 0xFF;
PORTH |= (1 << 1); // CPUCLK(PH1)
PORTL = 0xFF; // A16-A23
PORTJ |= (1 << 0); // TIME(PJ0)
strcpy(romName, "POKEMINI");
mode = mode_POKE;
}
//******************************************
// READ DATA
//******************************************
uint8_t readData_POKE(uint32_t addr) {
// Address Lines A0-A20 = 1MB (ALL ROMS ARE 512K)
// 100000 = 1 0000 0000 0000 0000 0000 = 100 0000 0000|00 0000 0000
// High Address A10-A20
PORTF = (addr >> 10) & 0xFF; // A10-A17
PORTK = (addr >> 18) & 0x07; // A18-A20
HALE_ENABLE; // LATCH HIGH ADDRESS
NOP;
NOP;
HALE_DISABLE;
// Low Address A0-A9
PORTF = addr & 0xFF; // A0-A7
PORTK = (addr >> 8) & 0x03; // A8-A9
LALE_ENABLE; // LATCH LOW ADDRESS
NOP;
NOP;
// Read Enable
OE_ENABLE; // OE HIGH
NOP;
NOP;
NOP;
NOP;
NOP;
// Data
uint8_t ret = PINC;
// Read Disable
OE_DISABLE; // OE LOW
NOP;
NOP;
NOP;
NOP;
LALE_DISABLE;
return ret;
}
//******************************************
// WRITE DATA
//******************************************
void writeData_POKE(uint32_t addr, uint8_t data) {
// High Address A10-A20
PORTF = (addr >> 10) & 0xFF; // A10-A17
PORTK = (addr >> 18) & 0x07; // A18-A20
HALE_ENABLE; // LATCH HIGH ADDRESS
NOP;
NOP;
HALE_DISABLE;
// Low Address A0-A9
PORTF = addr & 0xFF; // A0-A7
PORTK = (addr >> 8) & 0x03; // A8-A9
LALE_ENABLE; // LATCH LOW ADDRESS
// Set Data to Output
DDRC = 0xFF;
PORTC = data;
// Write Enable
WE_ENABLE; // WE HIGH
NOP;
NOP;
NOP;
NOP;
NOP;
// Write Disable
WE_DISABLE; // OE LOW
NOP;
NOP;
NOP;
NOP;
LALE_DISABLE;
// Reset Data to Input
DDRC = 0x00;
}
//******************************************
// READ ROM
//******************************************
void readROM_POKE() {
strcpy(fileName, romName);
strcat(fileName, ".min");
// create a new folder for storing rom file
EEPROM_readAnything(0, foldern);
sprintf(folder, "POKE/ROM/%d", foldern);
sd.mkdir(folder, true);
sd.chdir(folder);
display_Clear();
print_STR(saving_to_STR, 0);
print_Msg(folder);
println_Msg(F("/..."));
display_Update();
// open file on sdcard
if (!myFile.open(fileName, O_RDWR | O_CREAT))
print_FatalError(sd_error_STR);
// write new folder number back to EEPROM
foldern++;
EEPROM_writeAnything(0, foldern);
for (uint32_t addr = 0; addr < 0x80000; addr += 512) { // 512K
for (int w = 0; w < 512; w++) {
uint8_t temp = readData_POKE(addr + w);
sdBuffer[w] = temp;
}
myFile.write(sdBuffer, 512);
}
myFile.close();
calcCRC(fileName, 0x80000, NULL, 0); // 512K
println_Msg(F(""));
// Prints string out of the common strings array either with or without newline
print_STR(press_button_STR, 1);
display_Update();
wait();
}
#endif

View File

@ -50,7 +50,6 @@ static const char sfmGameMenuItem4[] PROGMEM = "Switch Game";
static const char* const menuOptionsSFMGame[] PROGMEM = { sfmGameMenuItem1, sfmGameMenuItem2, sfmGameMenuItem3, sfmGameMenuItem4, string_reset2 };
void sfmMenu() {
setVoltage(VOLTS_SET_5V);
// create menu with title and 3 options to choose from
unsigned char mainMenu;
// Copy menuOptions out of progmem
@ -525,6 +524,9 @@ void getGames(char gameCode[8][20], boolean* hasMenu, byte* numGames) {
Setup
*****************************************/
void setup_SFM() {
// Request 5V
setVoltage(VOLTS_SET_5V);
// Set cicrstPin(PG1) to Output
DDRG |= (1 << 1);
// Output a high signal to disable snesCIC

View File

@ -26,31 +26,30 @@ static const char SMSRomSizeItem1[] PROGMEM = "8 KB";
static const char SMSRomSizeItem2[] PROGMEM = "16 KB";
static const char SMSRomSizeItem3[] PROGMEM = "24 KB";
static const char SMSRomSizeItem4[] PROGMEM = "32 KB";
static const char SMSRomSizeItem5[] PROGMEM = "40 KB"; //SG-1000 40k mapping not yet supported
static const char SMSRomSizeItem6[] PROGMEM = "48 KB"; //SG-1000 40k mapping not yet supported
static const char SMSRomSizeItem5[] PROGMEM = "40 KB"; //SG-1000 40k mapping not yet supported
static const char SMSRomSizeItem6[] PROGMEM = "48 KB"; //SG-1000 40k mapping not yet supported
static const char SMSRomSizeItem7[] PROGMEM = "64 KB";
static const char SMSRomSizeItem8[] PROGMEM = "128 KB";
static const char SMSRomSizeItem9[] PROGMEM = "256 KB";
static const char SMSRomSizeItem10[] PROGMEM = "512 KB";
static const char SMSRomSizeItem11[] PROGMEM = "1024 KB";
static const char* const SG1RomSizeMenu[] PROGMEM = { SMSRomSizeItem1, SMSRomSizeItem2, SMSRomSizeItem3, SMSRomSizeItem4}; // Rom sizes for SG-1000
static const char* const SMSRomSizeMenu[] PROGMEM = { SMSRomSizeItem4, SMSRomSizeItem7, SMSRomSizeItem8, SMSRomSizeItem9, SMSRomSizeItem10, SMSRomSizeItem11}; // Rom sizes for SMS and GG
static const char* const SG1RomSizeMenu[] PROGMEM = { SMSRomSizeItem1, SMSRomSizeItem2, SMSRomSizeItem3, SMSRomSizeItem4 }; // Rom sizes for SG-1000
static const char* const SMSRomSizeMenu[] PROGMEM = { SMSRomSizeItem4, SMSRomSizeItem7, SMSRomSizeItem8, SMSRomSizeItem9, SMSRomSizeItem10, SMSRomSizeItem11 }; // Rom sizes for SMS and GG
// Init systems
static bool system_sms = false; // SMS or MarkIII
static bool system_gg = false; // GameGear
static bool system_sg1000 = false; // SG-1000
static bool system_sms = false; // SMS or MarkIII
static bool system_gg = false; // GameGear
static bool system_sg1000 = false; // SG-1000
// Init adapters
static bool adapter_raphnet = false; // raphet adapater (SMS-to-MD or MIII-to-MD)
static bool adapter_retrode = false; // Retrode adapter (SMS-to-MD or GG-to-MD)
static bool adapter_retron = false; // Retron 3in1 adapter (SMS-to-MD or GG-to-MD)
static bool adapter_raphnet = false; // raphet adapater (SMS-to-MD or MIII-to-MD)
static bool adapter_retrode = false; // Retrode adapter (SMS-to-MD or GG-to-MD)
static bool adapter_retron = false; // Retron 3in1 adapter (SMS-to-MD or GG-to-MD)
//*********************************************************
// Main menu with systems/adapters setups to choose from
//*********************************************************
void smsMenu() {
setVoltage(VOLTS_SET_5V);
unsigned char SMSSetup;
convertPgm(SMSAdapterMenu, 6);
SMSSetup = question_box(F("Select your setup"), menuOptions, 6, 0);
@ -62,7 +61,7 @@ void smsMenu() {
adapter_raphnet = true;
break;
case 1:
case 1:
// SMS with Retrode adapter
system_sms = true;
adapter_retrode = true;
@ -156,6 +155,9 @@ void smsOperations() {
// Setup I/O
//********************************
void setup_SMS() {
// Request 5V
setVoltage(VOLTS_SET_5V);
// Set Address Pins to Output
//A0-A7
DDRF = 0xFF;
@ -460,23 +462,23 @@ void getCartInfo_SMS() {
SMSRomSize = question_box(F("Select ROM size"), menuOptions, 4, 0);
switch (SMSRomSize) {
case 0:
cartSize = 8 * 1024UL; // 8KB
cartSize = 8 * 1024UL; // 8KB
break;
case 1:
cartSize = 16 * 1024UL; // 16KB
cartSize = 16 * 1024UL; // 16KB
break;
case 2:
cartSize = 24 * 1024UL; // 24KB
cartSize = 24 * 1024UL; // 24KB
break;
case 3:
cartSize = 32 * 1024UL; // 32KB
cartSize = 32 * 1024UL; // 32KB
break;
//case 4:
// cartSize = 40 * 1024UL; // 40KB
// break;
//case 5:
// cartSize = 48 * 1024UL; // 48KB
// break;
//case 4:
// cartSize = 40 * 1024UL; // 40KB
// break;
//case 5:
// cartSize = 48 * 1024UL; // 48KB
// break;
}
} else {
// Rom sizes for SMS and GG
@ -484,22 +486,22 @@ void getCartInfo_SMS() {
SMSRomSize = question_box(F("Select ROM size"), menuOptions, 6, 0);
switch (SMSRomSize) {
case 0:
cartSize = 32 * 1024UL; // 32KB
cartSize = 32 * 1024UL; // 32KB
break;
case 1:
cartSize = 64 * 1024UL; // 64KB
cartSize = 64 * 1024UL; // 64KB
break;
case 2:
cartSize = 128 * 1024UL; // 128KB
cartSize = 128 * 1024UL; // 128KB
break;
case 3:
cartSize = 256 * 1024UL; // 256KB
cartSize = 256 * 1024UL; // 256KB
break;
case 4:
cartSize = 512 * 1024UL; // 512KB
cartSize = 512 * 1024UL; // 512KB
break;
case 5:
cartSize = 1024 * 1024UL; // 1MB
cartSize = 1024 * 1024UL; // 1MB
break;
}
}
@ -534,13 +536,13 @@ void getCartInfo_SMS() {
println_Msg(F(" "));
}
// Wait for user input
#if (defined(enable_LCD) || defined(enable_OLED))
// Prints string out of the common strings array either with or without newline
print_STR(press_button_STR, 1);
display_Update();
wait();
#endif
// Wait for user input
#if (defined(enable_LCD) || defined(enable_OLED))
// Prints string out of the common strings array either with or without newline
print_STR(press_button_STR, 1);
display_Update();
wait();
#endif
// Turn off LED
setColor_RGB(0, 0, 0);
@ -647,9 +649,9 @@ void readROM_SMS() {
compareCRC("sg1000.txt", 0, 1, 0);
}
#ifdef global_log
save_log();
#endif
#ifdef global_log
save_log();
#endif
print_STR(press_button_STR, 1);
}
@ -709,7 +711,7 @@ void readSRAM_SMS() {
print_STR(press_button_STR, 1);
display_Update();
} else {
print_FatalError(sd_error_STR);
print_FatalError(sd_error_STR);
}
}

View File

@ -70,7 +70,6 @@ static const char* const menuOptionsRepro[] PROGMEM = { reproMenuItem1, reproMen
// SNES repro menu
void reproMenu() {
setVoltage(VOLTS_SET_5V);
// create menu with title and 6 options to choose from
unsigned char snsRepro;
// Copy menuOptions out of progmem
@ -133,7 +132,6 @@ void reproMenu() {
// SNES start menu
void snsMenu() {
setVoltage(VOLTS_SET_5V);
// create menu with title and 6 options to choose from
unsigned char snsCart;
// Copy menuOptions out of progmem
@ -174,6 +172,7 @@ void snsMenu() {
#ifdef enable_FLASH
case 3:
setup_FlashVoltage();
reproMenu();
break;
#endif
@ -192,7 +191,6 @@ void snsMenu() {
// SNES Menu
void snesMenu() {
setVoltage(VOLTS_SET_5V);
// create menu with title and 7 options to choose from
unsigned char mainMenu;
// Copy menuOptions out of progmem
@ -388,6 +386,9 @@ void stopSnesClocks_resetCic_resetCart() {
Setup
*****************************************/
void setup_Snes() {
// Request 5V
setVoltage(VOLTS_SET_5V);
// Set cicrstPin(PG1) to Output
DDRG |= (1 << 1);
// Output a high signal until we're ready to start

View File

@ -17,6 +17,7 @@ static const char acanMenuItem6[] PROGMEM = "Flash repro";
static const char *const menuOptionsAcan[] PROGMEM = { acanMenuItem1, acanMenuItem2, acanMenuItem3, acanMenuItem4, acanMenuItem5, string_reset2, acanMenuItem6 };
void setup_SuprAcan() {
// Request 5V
setVoltage(VOLTS_SET_5V);
// addr as output

View File

@ -42,7 +42,6 @@ static const char* const menuOptionsSVFlash[] PROGMEM = { svFlashMenuItem1, svFl
void svMenu() {
setVoltage(VOLTS_SET_5V);
// create menu with title and 3 options to choose from
unsigned char mainMenu;
// Copy menuOptions out of progmem
@ -102,6 +101,9 @@ void svMenu() {
Setup
*****************************************/
void setup_SV() {
// Request 5V
setVoltage(VOLTS_SET_5V);
// Set cicrstPin(PG1) to Output
DDRG |= (1 << 1);
// Output a high signal until we're ready to start

View File

@ -56,6 +56,9 @@
//******************************************
void setup_VBOY() {
// Request 5V
setVoltage(VOLTS_SET_5V);
// Set Address Pins to Output
//A0-A7
DDRF = 0xFF;
@ -101,7 +104,6 @@ static const char vboyMenuItem3[] PROGMEM = "Write SRAM";
static const char* const menuOptionsVBOY[] PROGMEM = { vboyMenuItem1, vboyMenuItem2, vboyMenuItem3, string_reset2 };
void vboyMenu() {
setVoltage(VOLTS_SET_5V);
convertPgm(menuOptionsVBOY, 4);
uint8_t mainMenu = question_box(F("VIRTUALBOY MENU"), menuOptions, 4, 0);

View File

@ -46,6 +46,9 @@ static uint8_t wsEepromShiftReg[2];
static boolean wsWitch = false;
void setup_WS() {
// Request 3.3V
setVoltage(VOLTS_SET_3V3);
// A-1 - A6
DDRF = 0xff;
// A7 - A14
@ -117,7 +120,6 @@ static boolean headerCheck() {
}
void wsMenu() {
setVoltage(VOLTS_SET_3V3);
uint8_t mainMenu = (wsWitch ? 5 : 4);
convertPgm(menuOptionsWS, mainMenu);

View File

@ -53,6 +53,9 @@ byte newwsvsize;
//******************************************
void setup_WSV() {
// Request 3.3V
setVoltage(VOLTS_SET_3V3);
// Set Address Pins to Output
//A0-A7
DDRF = 0xFF;
@ -106,7 +109,6 @@ static const char wsvMenuItem3[] PROGMEM = "Set Size";
static const char* const menuOptionsSV[] PROGMEM = { wsvMenuItem1, wsvMenuItem2, wsvMenuItem3, string_reset2 };
void wsvMenu() {
setVoltage(VOLTS_SET_3V3);
convertPgm(menuOptionsSV, 4);
uint8_t mainMenu = question_box(F("SUPERVISION MENU"), menuOptions, 4, 0);

View File

@ -50,6 +50,8 @@ Happy making. 🔧🔨😊
- Fairchild Channel F
- Magnavox Odyssey 2
- Super A'Can
- MSX
- Pokemon Mini
#### Open Source Licenses:
- Software(everything in Cart_Reader folder) = GPL v3

View File

@ -78,11 +78,6 @@ BA58ED29,716956B4,4E45531A100010080000070700000001
Name
CRC32 (prg+chr combined), CRC32 (512 bytes), iNES Header
## nes20db.txt
This file stores NES 2.0 data about NES ROMs, generated from [NewRisingSun's nes20db XML file on NesDev](https://forums.nesdev.org/viewtopic.php?t=19940). Converting updated versions of the XML file to this format requires compiling and running [NES20Tool](https://github.com/Kreeblah/NES20Tool) with the following options at runtime:
NES20Tool -operation transform -xml-file nes20db.xml -xml-format nes20db -format-transform-type sanni -format-transform-destination nes20db.txt
## snes.txt
This file is needed for odd sized SNES games like Final Fantasy (JAP), Super Metroid(US/JAP) or Tales of Symphonia. Without this file you will get overdumps and the checksum calculation will fail.

View File

@ -364,8 +364,8 @@ Sky Jinks,32,17
Sky Skipper,64,17
Slot Machine,32,19
Slot Racers,32,20
Smurf - Rescue in Gargamel's Castle,248,19
Smurfs Save the Day,248,44
Smurf Rescue in Gargamels Castle,248,19
Smurfs Save the Day,248,41
Sneak 'n Peek,64,28
Snoopy and the Red Baron,248,21
Solar Fox,248,33

727
sd/msxcart.txt Normal file
View File

@ -0,0 +1,727 @@
1942,1,5,0,0
10-Yard Fight,0,3,0,15
3-D Golf Simulation,0,2,0,24
3D Tennis,0,2,0,30
3D Water Driver,0,2,0,20
A Life Planet M36,1,5,0,26
A Ressha de Ikou,2,5,2,28
A.E.,0,2,0,27
A1 Spirit,9,5,0,15
AcroJet,2,5,0,20
Actman,0,2,0,18
Adven' Chuta!,0,2,0,17
Adventure Island,0,3,0,24
Afternoon Angels,0,3,0,27
Albatross,0,3,0,27
Alcazar,0,2,0,20
Aleste,2,6,0,18
Algeese no Tsubasa,1,6,0,17
Alibaba and 40 Thieves,0,2,0,29
Alien 8,0,3,0,33
Aliens,2,5,0,18
Alpha Roid,0,3,0,17
Alpha Squadron,0,2,0,21
American Soccer,1,4,0,25
American Truck,0,3,0,26
Anaza,0,3,0,25
Androgynus,2,6,0,16
Angelo,0,2,0,21
Animal Land,1,5,0,17
Antarctic Adventure,0,2,0,22
Anty,0,2,0,30
Aoki Ookami - Genchou Hishi,7,8,4,15
Aoki Ookami - Genghis Khan,7,7,2,38
Aquapolis SOS,0,2,0,37
Aquattack,0,2,0,24
Aramo,0,3,0,20
Arctic,2,5,0,16
Arkanoid,0,3,0,17
Arkanoid II,1,5,0,19
AshGuine,1,5,0,22
AshGuine Story II,1,6,0,19
AshGuine Story III,1,6,0,28
Athletic Ball,0,2,0,29
Athletic Land,0,2,0,24
Attack Four,0,3,0,24
B.C.'s Quest,0,3,0,22
B.C. II - Grog's Revenge,0,3,0,23
Back to the Future,0,3,0,35
Backgammon,0,3,0,29
Balance,0,2,0,21
Banana,0,2,0,18
Bank Panic,0,3,0,17
Baseball Craze,0,3,0,21
BASIC Lessons 1,0,3,0,25
BASIC Lessons 2,0,3,0,26
Batman,1,4,0,26
Batten Tanuki no Daibouken,0,3,0,17
Battle Cross,0,2,0,37
Battle Ship Clapton II,0,2,0,23
Beamrider,0,3,0,33
Becky,0,2,0,20
Bee & Flower,0,2,0,16
Black Onyx,0,3,0,23
Black Onyx II,2,5,0,21
Blockade Runner,0,2,0,24
Boggy '84,0,1,0,26
Boing Boing,0,1,0,20
Bokosuka Wars,0,2,0,22
Bomber King,1,5,0,24
Bomber Man,0,1,0,22
Boogie Woogi Jungle,0,2,0,21
Boomerang,0,2,0,30
Borfesu,2,5,0,20
Bosconian (Star Destroyer),0,3,0,18
Bouken Roman,0,3,0,37
Boulder Dash,0,3,0,23
Brain,0,2,0,23
Break In,0,4,0,16
Break Out,0,2,0,19
Bruce Lee,0,3,0,20
Bubble Bobble,1,5,0,20
Bug Bomb,0,2,0,24
Bull and Mighty's Slim Chance,0,3,0,19
Burger Time,0,3,0,40
Butamaru Pants,0,2,0,22
Cabbage Patch Kids,0,2,0,25
Candoo Ninja,0,2,0,29
Cannon Ball,0,2,0,23
Captain Chef,0,1,0,22
Captain Cosmo,0,2,0,23
Car Fighter,0,2,0,24
Car Jamboree,0,3,0,22
Car Race,0,2,0,23
Carry's Great Escape,0,3,0,19
Casio Daishogai Keiba,0,2,0,31
Casio World Open,0,3,0,32
Castle,0,3,0,27
Castle Excellent,0,3,0,17
Chack'n Pop,0,2,0,27
Challenge Derby,0,3,0,22
Champion Boxing,0,3,0,26
Champion Ice Hockey,0,3,0,26
Champion Kendo,0,3,0,30
Champion Pro Wrestling,0,3,0,25
Champion Soccer,0,2,0,33
Championship Lode Runner,0,3,0,26
Checkers in Tan Tan Tanuki,0,2,0,35
Cheese,0,2,0,37
Cheese 2,0,3,0,17
Chess,0,2,0,19
Chima Chima,0,3,0,16
Choplifter,0,3,0,22
ChoroQ,0,2,0,21
Circus Charlie,0,2,0,17
City Connection,0,3,0,25
Coaster Race,0,3,0,26
Cockpit,2,5,0,23
Color Ball,0,2,0,18
Color Midway,0,2,0,21
Come On! Picot,0,3,0,23
Comet Tail,0,2,0,25
Comic Bakery,0,2,0,21
Computer Billiards,0,1,0,23
Computer Master,0,3,0,29
Computer Othello,0,2,0,26
Computer Pachinko,0,2,0,27
Computer Painting,0,2,0,28
Con-dori,0,2,0,28
Contra,9,5,0,19
Cosmo Explorer,0,3,0,17
Courageous Perseus,0,3,0,25
Craze,2,5,0,29
Crazy Bullet,0,2,0,16
Crazy Cars,0,3,0,23
Crazy Train,0,1,0,21
Creamy Lemon - Star Trap,0,3,0,22
Crest of the Dragon King,0,3,0,35
Crimson,1,6,0,35
Cross Blaim,3,4,0,18
Crusader,0,3,0,22
C-So!,0,2,0,19
Dai Dassou,0,3,0,16
Daikoukai Jidai,7,7,4,21
Daisenryaku,2,5,1,26
Daiva Story 4,1,6,0,22
Dam Busters,0,3,0,24
DangerX4,0,2,0,22
Darwin 4078,1,5,0,19
David II,0,2,0,22
Dawn Patrol,0,4,0,19
D-Day,0,2,0,22
Decathlon,0,3,0,16
Deep Dungeon,1,5,2,20
Deep Dungeon II,1,5,2,23
Deep Forest,1,5,0,26
Demon Crystal,0,3,0,22
Designer's Pencil,0,2,0,24
Devil's Heaven,0,2,0,28
Dig Dug,0,3,0,25
Digital Devil Monogatari,1,5,0,18
Dip Dip,0,2,0,35
Dires,1,5,1,18
Doki Doki Penguin Land,0,3,0,16
Door Door mkII,0,2,0,33
Dorodon,0,2,0,25
Double Vision,1,6,0,18
Dr. Copy,0,2,0,24
Dragon Attack,0,2,0,19
Dragon Buster,1,5,0,24
Dragon Quest,1,5,0,24
Dragon Quest II,1,6,0,23
Dragon Slayer,0,3,0,26
Dragon Slayer II,1,6,2,24
Dragon Slayer IV,1,6,0,27
Dragon Slayer Jr.,2,5,0,27
Drainer,0,3,0,28
Druaga no Tou,0,3,0,18
Druid,1,5,0,24
Dungeon Hunter,2,5,0,16
Dungeon Master,0,3,0,25
Dunk Shot,0,3,0,25
DX7 Voicing Program,0,2,0,20
Dynamite Bowl,2,5,0,30
E.I.,0,2,0,24
Eagle Fighter,0,3,0,15
Eddy II,0,2,0,24
Eggerland Mystery,0,3,0,18
Eidolon,1,5,0,28
Eiwa Jiten,1,5,0,18
Elevator Action,0,3,0,21
Elthlead,1,5,2,26
Erika,0,3,0,19
Europe Sensen,7,8,4,16
Exchanger,0,2,0,24
Exciting Baseball,0,2,0,20
Exciting Jockey,0,2,0,28
Exerion,0,2,0,26
Exerion II,0,2,0,18
Exoide-Z,0,2,0,21
Exoide-Z Area 5,0,3,0,19
F-1 Spirit,9,5,0,26
F-15 Strike Eagle,1,5,0,21
F16 Fighting Falcon,0,2,0,28
Fairy,0,2,0,30
Fairy Land Story,1,5,0,16
Famicle Parodic,1,6,0,27
Family Automation Language,0,3,0,26
Family Billiards,1,4,0,37
Family Boxing,1,6,0,27
Family Stadium Pro Baseball,2,6,0,24
Fandom Library #1,1,6,0,38
Fandom Library #2,1,6,0,28
Fandom Library #3,1,6,0,28
Fantasy Zone,1,5,0,28
Fantasy Zone II,2,6,0,23
Farm Kit,0,3,0,26
Fathom,0,3,0,19
FB-01 Voicing Program,0,3,0,17
Final Justice,0,2,0,32
Final Mahjong,0,2,0,24
Final Mystery Murder Club,1,7,0,24
Final Zone Wolf,1,5,0,36
Fire Ball,1,5,0,26
Fire Rescue,0,2,0,20
Firebird,8,5,0,22
Flappy Limited '85,0,2,0,19
Flash Splash,0,1,0,29
Fleet Commander II,1,6,0,23
Flicky,0,3,0,29
Flight Deck II,0,4,0,17
Flight Simulator,1,5,0,25
Flipper Slipper,0,2,0,27
Flower Card a Carp,0,2,0,26
FM Music Composer,0,2,0,29
FM Music Composer II,0,3,0,28
FM Music Macro,0,3,0,31
FM Musiwriter,0,2,0,25
FM PAC,11,4,2,24
FM Voicing Program,0,2,0,18
Formation Z,0,3,0,29
Four Battle Mahjong,0,2,0,22
Frogger,0,2,0,30
Front Line,0,2,0,18
Fruit Search,0,2,0,21
Funky Mouse,0,2,0,23
G.P. World,0,3,0,22
Gakuen Monogatari,2,6,0,21
Galactic Drifter Vifam,0,2,0,28
Galaga,0,3,0,33
Galaxian,0,1,0,17
Gall Force,2,5,0,19
Gambler Jiko Chuushinha,1,6,0,21
Gambler Jiko Chuushinha 2,1,6,0,34
Game Land,0,3,0,36
Game Master,0,2,0,20
Game Master II,4,5,2,22
Ganbare Goemon!,8,5,0,25
Gang Master,0,2,0,26
Garakuta,2,4,0,22
Garyuu Ou,1,6,0,19
Gate of Labyrinth,2,5,0,20
Gekitotsu Pennant Race,9,5,0,28
Gekitotsu Pennant Race 2,9,5,0,33
Ghost House,0,3,0,35
Ghostbusters,0,3,0,22
Girly Block,2,5,0,23
Glider,0,2,0,22
Goblin,0,4,0,17
Gojira vs 3 Daikaijuu,0,2,0,17
Gojira-kun,0,3,0,32
Gokiburi Daisakusen,0,2,0,21
Golf Game,0,2,0,30
Golgo 13 - Wolf's Nest,0,3,0,20
Golvellius,2,5,0,33
Gomoku Narabe,0,2,0,21
Goonies,0,3,0,24
Green Beret,0,3,0,18
Grog's Revenge,0,3,0,22
Guardic,0,3,0,25
Gulkave,0,3,0,18
Gun Fright,0,3,0,18
Gyrodine,0,3,0,21
H.E.R.O.,0,3,0,19
Hacker,2,5,0,19
Hades no Monshou,0,3,0,17
Hai no Majutsushi,8,5,0,27
Haja No Fuin,1,5,0,28
Hal Note,5,8,3,23
Han Seimei Senki Androgynus,2,6,0,19
Hanafuda,0,3,0,38
Hanafuda Koi Koi,0,2,0,19
Hang On,0,3,0,27
Harapeko Pakkun,0,1,0,18
Hard Ball,1,5,0,26
Harry Fox MSX Special,2,5,1,20
Harry Fox - Yuki no Maou Hen,6,4,0,32
Heavy Boxing,0,2,0,39
Heist,0,3,0,23
Heli-tank,0,2,0,16
Heroes of the Lance,1,7,2,20
Hi no Tori,8,5,0,30
Higemaru Makai Shima,2,5,0,21
High School! Kimengumi,1,5,0,31
High Way Star,0,2,0,33
Hisha,0,2,0,24
Hitsuji Yai,0,1,0,16
Hole in One,0,2,0,22
Hole in One Professional,0,3,0,22
Hole in One Special,2,5,0,35
Home Calc,0,2,0,30
Home Writer,0,2,0,20
Hudson 3D Golf,0,3,0,22
Hustle! Chumy,0,2,0,25
Hydlide,0,3,0,24
Hydlide II,2,5,1,18
Hydlide 3,1,7,0,21
Hyper Olympic 1,0,2,0,20
Hyper Olympic 2,0,2,0,26
Hyper Rally,0,2,0,26
Hyper Sports 1,0,2,0,22
Hyper Sports 2,0,2,0,25
Hyper Sports 3,0,3,0,25
Ice World,0,2,0,25
Ide Yousuke Meijin Mahjong,1,5,0,20
Iga Ninpou Chou,0,2,0,37
Iga Ninpou Chou 2,0,3,0,26
Ikari,2,6,0,28
Indian no Bouken,0,2,0,16
Inemuri-ryuu Asada Mahjong,2,5,0,27
Inindou,7,8,4,37
Iriegas - Theseus,0,2,0,18
Iriegas Episode IV,0,2,0,28
Inspecteur Z,0,3,0,29
Ishin no Arashi,7,7,4,23
Issunboushi no Donnamondai,0,3,0,26
J.P. Winkle,0,3,0,37
Jagur,2,5,0,22
Janka,0,2,0,16
Jansei,2,5,1,16
Janyu Mahjong,0,3,0,17
Japanese MSX-Write,1,7,0,24
Japanese MSX-Write II,1,7,2,29
Jet Set Willy,0,2,0,32
Jigsaw Set,0,2,0,24
Jissen - 4-nin Mahjong,0,2,0,21
Jong Kyo,0,2,0,33
Joytelop,0,3,0,19
Jump,0,2,0,19
Jump Coaster,0,1,0,15
Junior High English Words 1,0,3,0,23
Juno First,0,3,0,38
Kage no Densetsu,0,3,0,21
Kakikukekon,0,2,0,27
Karamaru's Strange Trip,0,2,0,22
Karuizawa,1,5,0,34
Kazuo Morita's Othello,0,3,0,20
Kempelen Chess,2,5,0,33
Keystone Kapers,0,3,0,25
Kick It!,0,3,0,26
Kiki Kaikai,1,5,0,19
King & Balloon,0,3,0,22
King Knight,2,5,0,25
King Kong 2,8,5,0,22
King's Valley,0,2,0,22
King's Valley II,9,5,0,24
Kin-nikuman,0,3,0,27
Kisei,1,5,2,22
Kitahei,1,5,0,16
Knight Lore,0,3,0,18
Knightmare,0,3,0,22
Knightmare II,8,5,0,21
Knightmare III,8,6,0,24
Knither Special,2,5,0,25
Koji Tanigawa's Shougi,0,3,0,26
Koji Tanigawa's Shougi 2,1,5,2,33
Konami's Baseball,0,2,0,35
Konami's Billiards,0,1,0,28
Konami's Boxing,0,3,0,29
Konami's Football,0,3,0,26
Konami's Golf,0,2,0,28
Konami's Mahjong,0,3,0,24
Konami's Ping Pong,0,2,0,27
Konami's Soccer,0,3,0,29
Konami's Tennis,0,2,0,26
Koneko no Daibouken,0,3,0,26
Koronis Rift,2,6,0,30
Kung Fu Master,0,2,0,23
Kung Fu Taigun,0,2,0,25
L' Empereur,7,7,4,25
Labyrinth,1,6,0,22
Ladder Building,0,2,0,20
Laptick'2,0,3,0,26
Legend of Kage,0,3,0,20
Legend of Takeru,0,3,0,25
Let's Take the A-Train,2,5,2,27
Light Corridor,2,4,0,33
Lode Runner,0,3,0,25
Lode Runner II,0,3,0,22
Lord Over,0,2,0,25
Lot Lot,0,3,0,20
Lunar Ball,0,3,0,18
Lupin Sansei - Babylon,1,5,0,21
Lupin Sansei - Cagliostro,1,5,0,33
M36,1,5,0,36
Macross Countdown,0,3,0,14
Mad Rider,1,5,0,28
Mado Fuki Kaisha no Swing-kun,0,2,0,20
Magical Kid Wiz,0,3,0,40
Magical Tree,0,2,0,26
Magnum Prohibition 1931,2,5,0,23
Mahjong Friend,0,2,0,34
Maison Ikkoku - Kanketsu Hen,1,7,0,25
Maison Ikkoku - Omoide,1,6,0,39
Make-a-Face,0,1,0,33
Malaya no Hihou,2,5,0,22
Manes,0,2,0,26
Mappy,0,3,0,16
Marchen Veil I,1,5,0,16
Marine Battle,0,2,0,25
Mashou no Yakata Goblin,0,4,0,24
Megalopolis SOS,0,2,0,34
Meikyuu Shinwa,2,5,0,26
Metal Gear,8,5,0,25
Metal Gear 2,9,7,0,21
MIDI Macro,0,3,0,23
Midnight Brothers,0,3,0,21
Midnight Building,0,2,0,28
Mini Golf,0,3,0,28
Mirai,1,5,0,20
Mississippi Satsujinjiken,1,5,0,16
Mitsumega Toohru,1,5,0,36
Moai no Hihou,0,3,0,27
Mobile Planet Styllus,0,3,0,24
Mobile-Suit Gundam,0,3,0,32
Moero!! Nettou Yakyuu '88,1,6,0,29
Mo-Karimakka,0,3,0,36
Mole,0,2,0,23
Mole Mole 2,0,3,0,15
Monkey Academy,0,2,0,22
Monmon Kaibutsu,1,5,0,25
Monster's Fair,0,3,0,26
Moon Landing,0,2,0,25
Moon Patrol,0,2,0,23
Moonsweeper,0,3,0,22
Mopiranger,0,2,0,22
Morita Kazuo no Othello,0,3,0,21
Mouser,0,2,0,34
Mr. Chin,0,1,0,17
Mr. Do!,0,1,0,19
Mr. Do! vs Unicorns,0,2,0,18
Mr. Do's Wild Ride,0,2,0,30
MSX Baseball,0,2,0,29
MSX Baseball II,0,2,0,23
MSX Derby,0,2,0,26
MSX Rugby,0,2,0,20
MSX Shougi Game,0,3,0,20
MSX Soccer,0,2,0,26
MSX-21,0,2,0,21
MSX-AID,0,2,0,17
MSX-BASIC-kun,0,2,0,18
MSX-BASIC-kun Plus,0,2,0,24
MSX-Logo,0,3,0,29
Mugen Senshi Valis,1,5,0,19
Music Editor,0,2,0,29
Music Harmonizer 3,0,2,0,23
Music Studio G7,0,3,0,29
Nausicaa,0,2,0,26
Nekketsu Juudou,1,6,0,19
Nemesis,8,5,0,26
Nemesis 2,9,5,0,18
Nemesis 3,9,6,0,20
Nessen Koushien,0,2,0,20
New Horizon,1,5,0,26
Night Shade,0,3,0,22
Nihon-Shi Nenpyou,0,3,0,22
Ninja Jajamaru-kun,0,3,0,28
Ninja Princess,0,3,0,29
Ninja-kun,0,2,0,25
Ninja-kun - Asura no Shou,1,5,0,20
Ninja-kun - Majou no Bouken,0,3,0,36
Ninjya Kage,0,2,0,38
Nobunaga no Yabou - Bushou,7,8,4,22
Nobunaga no Yabou - Sengoku,7,7,4,37
Nobunaga no Yabou Zenkoku MSX,7,6,2,38
Nobunaga no Yabou Zenkoku MSX2,7,7,2,40
Nyan Nyan Pro Wrestling,0,3,0,41
Nyorols,0,2,0,34
Ogre,2,6,0,18
Oil's Well,0,3,0,15
O'Mac Farmer,0,2,0,21
Othello,0,3,0,23
Ouke no Tani,9,5,0,18
Out Run,1,6,0,23
Oyoide Tango,0,1,0,18
PAC,11,0,2,23
Pachi Pro Densetsu,1,5,0,15
Pachicom,0,3,0,29
Pachinko-U.F.O.,0,2,0,19
Pac-Man,0,3,0,26
Pac-Mania,1,6,0,18
Pai Panic,0,2,0,20
Pairs,0,2,0,20
Parodius,9,5,0,16
Pass Ball,0,2,0,19
Pastfinder,0,2,0,20
Payload,0,3,0,21
Peetan,0,1,0,18
Pegasus,0,3,0,17
Penguin Adventure,8,5,0,18
Penguin-kun Wars,0,3,0,28
Penguin-kun Wars 2,2,6,0,27
Picture Puzzle,0,1,0,29
Pillbox,0,2,0,25
Pinball Blaster,2,4,0,18
Pinball Maker,0,2,0,26
Pine Applin,0,2,0,24
Pinky Chase,0,2,0,22
Pipi,0,3,0,22
Pippols,0,2,0,15
Pitfall II,0,2,0,18
Pitfall!,0,2,0,21
Playball,0,3,0,19
Point X Senryou Sakusen,0,3,0,19
Police Story,0,3,0,34
Poppaq the Fish,0,2,0,23
Predator,1,5,0,26
Pretty Sheep,0,1,0,19
Price of Magik,2,4,0,23
Pro Yakyuu Family Stadium,2,6,0,25
Pro Yakyuu Fan,1,6,0,36
Professional Baseball,0,3,0,25
Professional Mahjong,0,3,0,32
Professional Mahjong Gokuu,2,5,1,31
Project A2,1,5,0,37
Protector,0,2,0,21
PSG Musiwriter,0,2,0,20
Psychic War,1,6,2,25
Puzzle Panic,0,3,0,22
Pyramid Warp,0,1,0,23
Q-bert,0,3,0,23
Quarth,9,5,0,17
Queen's Golf,0,2,0,17
Quinpl,1,6,0,23
Raccoon Dog,0,3,0,17
Raid on Bungeling Bay,0,3,0,22
Rally-X,0,3,0,32
Rambo,0,3,0,18
Rastan Saga,1,6,0,16
Real Tennis,0,1,0,22
Red Zone,0,2,0,22
Relics MSX,1,5,0,19
Relics MSX2,1,6,0,21
Renju & Ojama Dogs,0,2,0,22
Replicart,1,5,0,29
Return of Ishtar,2,6,0,20
Return of Jelda,1,5,0,27
Rick to Mick no Daibouken,1,5,0,26
Rise Out,0,2,0,36
River Raid,0,3,0,19
Road Fighter,0,2,0,21
Robo Wres 2001,2,5,0,23
Robofrog,0,2,0,25
Rockn' Bolt,0,2,0,19
Roger Rubbish,0,2,0,22
Roller Ball,0,2,0,24
Romancia,2,5,0,22
Rotors,0,2,0,19
Royal Blood,7,8,4,17
R-Type,12,7,0,22
Salamander,9,5,0,18
Sangokushi MSX,7,6,0,21
Sangokushi MSX2,7,7,4,25
Sangokushi II,7,8,4,26
Sasa,0,2,0,24
Scarlet 7,0,3,0,15
Scion,0,2,0,20
Scope On,0,2,0,16
Scramble Eggs,0,1,0,19
Scramble Formation,1,6,0,24
Sea Hunter,0,2,0,29
Secret Treasure of Moai,0,3,0,21
Seiken Acho,0,3,0,34
Seikima II Special,1,5,0,22
Senjo no Ookami,1,5,0,29
Senjyo,0,2,0,26
Sewer Sam,0,3,0,17
Shanghai,2,5,0,20
Shiryou Sensen,1,6,2,19
Shougi (Micro Cabin),0,2,0,25
Shougi (Pony),0,3,0,31
Shougi Expert,0,3,0,24
Shougi Meijin,0,3,0,24
Shougun,1,5,2,24
Shout Match,0,3,0,18
Simple ASM 1.0,0,2,0,22
Sinbad,0,2,0,25
Ski Command,0,2,0,17
Skooter,0,3,0,22
Sky Jaguar,0,2,0,18
Skygaldo,0,3,0,21
Slapshot,0,2,0,19
Small Boy's Quiz,0,3,0,19
Snake It,0,3,0,27
Sofia,1,4,0,19
Soukoban,0,3,0,16
Space Camp,0,3,0,19
Space Invaders,0,2,0,21
Space Manbow,9,6,0,25
Space Maze Attack,0,2,0,23
Space Trouble,0,1,0,28
Sparkie,0,3,0,24
Spelunker,0,3,0,18
Square Dancer,0,2,0,20
Squish'em,0,2,0,24
Star Blazer,0,2,0,20
Star Command,0,2,0,22
Star Trap,0,3,0,23
Star Virgin,1,5,0,20
Starship Simulator,0,2,0,22
Step Up,0,1,0,29
Stepper,0,2,0,18
Stone of Wisdom,0,3,0,18
Strange Loop,0,3,0,26
Strategic Mars,2,5,0,23
Suikoden,7,7,4,25
Super Billiards,0,1,0,19
Super Cobra,0,1,0,26
Super Cross Force,0,2,0,22
Super Daisenryaku,2,6,1,28
Super Drinker,0,2,0,28
Super Golf,0,3,0,24
Super Laydock,1,6,0,21
Super Lode Runner,13,5,0,24
Super Pachinko,0,2,0,29
Super Pierrot,2,5,0,25
Super Rambo Special,2,5,0,24
Super Runner,1,5,0,30
Super Snake,0,2,0,23
Super Soccer,0,3,0,22
Super Synth,0,2,0,23
Super Tennis,0,2,0,22
Super Tritorn,1,5,0,23
Supertripper,0,3,0,24
Sweet Acorn,0,2,0,23
Swimming Tango,0,1,0,22
Synth Saurus,1,4,0,25
Taiyou no Shinden,1,6,2,23
Takahashi Meijin no Boukenjima,0,3,0,28
Takeru Densetsu,0,3,0,41
Tanigawa Koji no Shougi,0,3,0,26
Tanigawa Koji no Shougi 2,1,5,2,34
Tank Battalion,0,1,0,36
Tatica,0,2,0,25
Tawara-kun,0,2,0,17
Tear of Nile,0,3,0,21
Teitoku no Ketsudan,7,8,4,23
Telebunnie,0,2,0,30
Tengoku Yoitoko,1,5,0,21
Tensai Rabbian Daifunsen,0,3,0,26
Tenshi-tachi no Gogo,0,3,0,35
Tetra Horror,0,2,0,31
Tetris,1,5,0,23
Tetsuman,0,2,0,17
Thexder,0,3,0,19
Thunder Ball,0,3,0,18
Thunderbolt,0,3,0,23
Time Pilot,0,2,0,22
Top Roller,0,2,0,21
Topple Zip MSX,0,3,0,21
Topple Zip MSX2,1,5,0,25
Tower of Druaga,0,3,0,26
Track & Field 1,0,2,0,26
Track & Field 2,0,2,0,26
Traffic,0,3,0,26
Treasure of Usas,8,5,0,18
Trial Ski,0,2,0,27
Tritorn,0,3,0,20
Trump Aid,0,3,0,18
Tsumego 120,2,5,0,20
Tsurikichi Sanpei - Blue,1,5,0,22
Tsurikichi Sanpei - Tsuri,1,6,0,35
Turboat,0,2,0,36
Turmoil,0,2,0,18
Twinbee,0,3,0,18
TZR Grandprix Rider,0,3,0,18
Ultima Exodus,1,6,2,30
Ultraman,0,2,0,24
Urusei Yatsura,1,7,0,19
Vampire Killer,8,5,0,25
Vaxol,2,5,0,25
Venus Fire,0,3,0,16
Victorious Nine II,2,5,0,21
Video Hustler,0,1,0,29
Vifam,0,2,0,24
Volguard,0,3,0,16
Warp & Warp,0,1,0,19
Warroid,0,3,0,22
Wing Man 2,1,5,0,18
Wizardry,1,7,2,21
Wonderboy,0,3,0,19
Woody Poco,2,5,0,20
Wrangler,0,2,0,21
Wreck,0,3,0,19
Xanadu,1,6,2,16
Xevious,2,6,0,17
Xyzolog,0,2,0,18
Yaksa,1,6,0,18
Yakyuu-kyou,0,3,0,16
Yamaha Play Card System,0,2,0,22
Yamamura Misa Suspense,1,6,0,34
Yellow Submarine,0,2,0,33
Yie Ar Kung-Fu,0,2,0,27
Yie Ar Kung-Fu II,0,3,0,25
Youkai Yashiki,0,3,0,28
Young Sherlock,1,5,0,25
Yuurei-kun,1,6,0,25
Zaider,0,3,0,21
Zanac A.I.,0,3,0,17
Zanac Ex,2,5,0,21
Zaxxon,0,3,0,19
Zenji,0,3,0,17
Zexas Limited,0,3,0,16
Zoids,2,5,0,24
Zombie Hunter,1,5,0,16
Zoom 909,0,3,0,24
Zukkoke Yajikita,1,5,0,19
EOF,0,0,0,0

Binary file not shown.