From: Wouter V. <m97...@us...> - 2002-05-28 13:34:06
|
Update of /cvsroot/openmsx/openMSX/src In directory usw-pr-cvs1:/tmp/cvs-serv8198/src Modified Files: CommandLineParser.cc CommandLineParser.hh MSXGameCartridge.cc MSXGameCartridge.hh Log Message: fixed PAINTER.ROM cleanups Index: CommandLineParser.cc =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/CommandLineParser.cc,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- CommandLineParser.cc 28 Apr 2002 14:52:51 -0000 1.11 +++ CommandLineParser.cc 28 May 2002 12:46:27 -0000 1.12 @@ -12,18 +12,19 @@ CommandLineParser* CommandLineParser::instance() { - if (oneInstance == NULL) { - oneInstance=new CommandLineParser(); - }; - return oneInstance; + if (oneInstance == NULL) { + oneInstance = new CommandLineParser(); + } + return oneInstance; } -CommandLineParser::CommandLineOption::CommandLineOption(std::string cliOption,bool usesParameter,std::string help) +CommandLineParser::CommandLineOption::CommandLineOption(const std::string &cliOption, + bool usesParameter, const std::string &help) : + option(cliOption), + helpLine(help), + hasParameter(usesParameter) { - option=cliOption; - used=false; - hasParameter=usesParameter; - helpLine=help; + used = false; }; CommandLineParser::CommandLineParser() @@ -55,229 +56,229 @@ void CommandLineParser::addOption(CLIoption id,std::string cliOption,bool usesParameter, std::string help) { - optionList.insert( - std::pair<CLIoption,CommandLineParser::CommandLineOption*> - ( id, new CommandLineOption(cliOption,usesParameter,help) ) - ); + optionList.insert( + std::pair<CLIoption,CommandLineParser::CommandLineOption*> + ( id, new CommandLineOption(cliOption,usesParameter,help) ) + ); } void CommandLineParser::showHelp(const char* progname) { - PRT_INFO("OpenMSX command line options"); - PRT_INFO("============================\n\n"); - PRT_INFO("Normal usage of openMSX\n"); - PRT_INFO(" " << progname << " [extra options] [[specifier] <filename>[,<extra mode>]]\n"); - PRT_INFO("specifier: normally the files are recognized by their extension "); - PRT_INFO(" however it is possible to explicite state the files "); - PRT_INFO(" nature by using one of the folowing specifiers: "); - PRT_INFO(" -config,-disk,-diska,-diskb,-tape,-cart,-carta,-cartb"); - PRT_INFO("extra mode: * for diskimages "); - PRT_INFO(" ro : open read-only "); - PRT_INFO(" * for cartridges you can specify it types "); - PRT_INFO(" 8kB,16kB,SCC,KONAMI5,KONAMI4,ASCII8,ASCII16 "); - PRT_INFO(" GAMEMASTER2,KONAMIDAC "); - PRT_INFO("\nHere is the list of extra options: "); - std::map<CLIoption,CommandLineParser::CommandLineOption*>::iterator it; - for (it= optionList.begin(); it != optionList.end(); it++ ){ - PRT_INFO ( (*it).second->option <<" \t: " << (*it).second->helpLine ); - } + PRT_INFO("OpenMSX command line options"); + PRT_INFO("============================\n\n"); + PRT_INFO("Normal usage of openMSX\n"); + PRT_INFO(" " << progname << " [extra options] [[specifier] <filename>[,<extra mode>]]\n"); + PRT_INFO("specifier: normally the files are recognized by their extension "); + PRT_INFO(" however it is possible to explicite state the files "); + PRT_INFO(" nature by using one of the folowing specifiers: "); + PRT_INFO(" -config,-disk,-diska,-diskb,-tape,-cart,-carta,-cartb"); + PRT_INFO("extra mode: * for diskimages "); + PRT_INFO(" ro : open read-only "); + PRT_INFO(" * for cartridges you can specify it types "); + PRT_INFO(" 8kB,16kB,SCC,KONAMI5,KONAMI4,ASCII8,ASCII16 "); + PRT_INFO(" GAMEMASTER2,KONAMIDAC "); + PRT_INFO("\nHere is the list of extra options: "); + std::map<CLIoption,CommandLineParser::CommandLineOption*>::iterator it; + for (it= optionList.begin(); it != optionList.end(); it++ ){ + PRT_INFO ( (*it).second->option <<" \t: " << (*it).second->helpLine ); + } } int CommandLineParser::checkFileType(char* parameter,int &i, char **argv) { - int fileType=0; - printf("parameter: %s\n",parameter); - // this option does not impact the filetype of the next element :-) - if ( (0 == strcasecmp(parameter,"-?")) || - (0 == strcasecmp(parameter,"-h")) || - (0 == strcasecmp(parameter,"-help")) ) { - showHelp(argv[0]); - exit(0); - }; - // now we see if there is a 'general' option that matches - // and if it needs a parameter - std::map<CLIoption,CommandLineParser::CommandLineOption*>::iterator it; - for (it= optionList.begin(); it != optionList.end(); it++ ){ - if ( 0 == strcasecmp(parameter,(*it).second->option.c_str())){ - if ((*it).second->used){ - PRT_INFO ("Parameter "<< (*it).second->option <<" specified twice\nAborting!!"); - exit(1); + int fileType=0; + printf("parameter: %s\n",parameter); + // this option does not impact the filetype of the next element :-) + if ( (0 == strcasecmp(parameter,"-?")) || + (0 == strcasecmp(parameter,"-h")) || + (0 == strcasecmp(parameter,"-help")) ) { + showHelp(argv[0]); + exit(0); + }; + // now we see if there is a 'general' option that matches + // and if it needs a parameter + std::map<CLIoption,CommandLineParser::CommandLineOption*>::iterator it; + for (it= optionList.begin(); it != optionList.end(); it++ ){ + if ( 0 == strcasecmp(parameter,(*it).second->option.c_str())){ + if ((*it).second->used){ + PRT_INFO ("Parameter "<< (*it).second->option <<" specified twice\nAborting!!"); + exit(1); + } + (*it).second->used=true; + if ((*it).second->hasParameter){ + i++; + (*it).second->parameter=argv[i]; + }; + break; } - (*it).second->used=true; - if ((*it).second->hasParameter){ - i++; - (*it).second->parameter=argv[i]; - }; - break; } - } - // these options do impact the filetype the next element that will be parsed later on - if ( 0 == strcasecmp(parameter,"-config")) { fileType=1; }; - if ( 0 == strcasecmp(parameter,"-disk")) { fileType=2; }; - if ( 0 == strcasecmp(parameter,"-diska")) { fileType=2; driveLetter='A'; }; - if ( 0 == strcasecmp(parameter,"-diskb")) { fileType=2; driveLetter='B'; }; - if ( 0 == strcasecmp(parameter,"-tape")) { fileType=3; }; - if ( 0 == strcasecmp(parameter,"-cart")) { fileType=4; }; - if ( 0 == strcasecmp(parameter,"-carta")) { fileType=4; cartridgeNr=0; }; - if ( 0 == strcasecmp(parameter,"-cartb")) { fileType=4; cartridgeNr=1; }; - return fileType; + // these options do impact the filetype the next element that will be parsed later on + if ( 0 == strcasecmp(parameter,"-config")) { fileType=1; }; + if ( 0 == strcasecmp(parameter,"-disk")) { fileType=2; }; + if ( 0 == strcasecmp(parameter,"-diska")) { fileType=2; driveLetter='A'; }; + if ( 0 == strcasecmp(parameter,"-diskb")) { fileType=2; driveLetter='B'; }; + if ( 0 == strcasecmp(parameter,"-tape")) { fileType=3; }; + if ( 0 == strcasecmp(parameter,"-cart")) { fileType=4; }; + if ( 0 == strcasecmp(parameter,"-carta")) { fileType=4; cartridgeNr=0; }; + if ( 0 == strcasecmp(parameter,"-cartb")) { fileType=4; cartridgeNr=1; }; + return fileType; } int CommandLineParser::checkFileExt(char* filename){ - int fileType=0; - char* Extension=filename + strlen(filename); - //trace back until first '.' - for (;(*Extension!='.') && (Extension>filename);Extension--){}; - - printf("Extension : %s\n",Extension); - // check the extension caseinsensitive - if (0 == strncasecmp(Extension,".xml",4)) fileType=1; - if (0 == strncasecmp(Extension,".dsk",4)) fileType=2; - if (0 == strncasecmp(Extension,".di1",4)) fileType=2; - if (0 == strncasecmp(Extension,".di2",4)) fileType=2; - if (0 == strncasecmp(Extension,".cas",4)) fileType=3; - if (0 == strncasecmp(Extension,".rom",4)) fileType=4; - if (0 == strncasecmp(Extension,".crt",4)) fileType=4; - if (0 == strncasecmp(Extension,".ri",3)) fileType=4; - return fileType; + int fileType=0; + char* Extension=filename + strlen(filename); + //trace back until first '.' + for (;(*Extension!='.') && (Extension>filename);Extension--){}; + + printf("Extension : %s\n",Extension); + // check the extension caseinsensitive + if (0 == strncasecmp(Extension,".xml",4)) fileType=1; + if (0 == strncasecmp(Extension,".dsk",4)) fileType=2; + if (0 == strncasecmp(Extension,".di1",4)) fileType=2; + if (0 == strncasecmp(Extension,".di2",4)) fileType=2; + if (0 == strncasecmp(Extension,".cas",4)) fileType=3; + if (0 == strncasecmp(Extension,".rom",4)) fileType=4; + if (0 == strncasecmp(Extension,".crt",4)) fileType=4; + if (0 == strncasecmp(Extension,".ri",3)) fileType=4; + return fileType; } void CommandLineParser::configureTape(char* filename) { - /* - // The split to test for ",ro" isn't used for the moment since tapes are always - // opened with openFilePreferRW - char* file; - char* readonly; - for (readonly=file=filename ; (*readonly!=0) && (*readonly!=',') ; readonly++){}; - if (*readonly == ','){ - *(readonly++)=0; - }; - */ - std::string sfilename(filename); XML::Escape(sfilename); - std::ostringstream s; - s << "<?xml version=\"1.0\"?>"; - s << "<msxconfig>"; - s << " <config id=\"tapepatch\">"; - s << " <type>tape</type>"; - s << " <parameter name=\"filename\">"; - s << sfilename << "</parameter>"; - s << " </config>"; - s << "</msxconfig>"; - PRT_DEBUG(s.str()); - config->loadStream(s); + /* + // The split to test for ",ro" isn't used for the moment since tapes are always + // opened with openFilePreferRW + char* file; + char* readonly; + for (readonly=file=filename ; (*readonly!=0) && (*readonly!=',') ; readonly++){}; + if (*readonly == ','){ + *(readonly++)=0; + }; + */ + std::string sfilename(filename); XML::Escape(sfilename); + std::ostringstream s; + s << "<?xml version=\"1.0\"?>"; + s << "<msxconfig>"; + s << " <config id=\"tapepatch\">"; + s << " <type>tape</type>"; + s << " <parameter name=\"filename\">"; + s << sfilename << "</parameter>"; + s << " </config>"; + s << "</msxconfig>"; + PRT_DEBUG(s.str()); + config->loadStream(s); } void CommandLineParser::configureDisk(char* filename) { - char* file; - char* readonly; - for (readonly=file=filename ; (*readonly!=0) && (*readonly!=',') ; readonly++){}; - if (*readonly == ','){ - *(readonly++)=0; - }; + char* file; + char* readonly; + for (readonly=file=filename ; (*readonly!=0) && (*readonly!=',') ; readonly++){}; + if (*readonly == ','){ + *(readonly++)=0; + }; std::string sfile(file); XML::Escape(sfile); - std::ostringstream s; - s << "<?xml version=\"1.0\"?>"; - s << "<msxconfig>"; - s << "<config id=\"diskpatch_disk" << driveLetter << "\">"; - s << "<type>disk</type>"; - s << "<parameter name=\"filename\">" << sfile << "</parameter>"; - s << "<parameter name=\"readonly\">"; - if (*readonly == 0){ - s << "false"; - } else { - s << "true"; - } - s << "</parameter>"; - s << "<parameter name=\"defaultsize\">720</parameter>"; - s << "</config>"; - s << "</msxconfig>"; - PRT_DEBUG(s.str()); - config->loadStream(s); - driveLetter++; + std::ostringstream s; + s << "<?xml version=\"1.0\"?>"; + s << "<msxconfig>"; + s << "<config id=\"diskpatch_disk" << driveLetter << "\">"; + s << "<type>disk</type>"; + s << "<parameter name=\"filename\">" << sfile << "</parameter>"; + s << "<parameter name=\"readonly\">"; + if (*readonly == 0){ + s << "false"; + } else { + s << "true"; + } + s << "</parameter>"; + s << "<parameter name=\"defaultsize\">720</parameter>"; + s << "</config>"; + s << "</msxconfig>"; + PRT_DEBUG(s.str()); + config->loadStream(s); + driveLetter++; } void CommandLineParser::configureCartridge(char* filename) { - char* file; - char* mapper; - for (mapper=file=filename ; (*mapper!=0) && (*mapper!=',') ; mapper++){}; - if (*mapper == ','){ - *(mapper++)=0; - }; + char* file; + char* mapper; + for (mapper=file=filename ; (*mapper!=0) && (*mapper!=',') ; mapper++){}; + if (*mapper == ','){ + *(mapper++)=0; + }; std::string sfile(file); XML::Escape(sfile); std::string smapper(mapper); XML::Escape(smapper); - std::ostringstream s; - s << "<?xml version=\"1.0\"?>"; - s << "<msxconfig>"; - s << " <device id=\"GameCartridge"<< (int)cartridgeNr <<"\">"; - s << " <type>GameCartridge</type><slotted><ps>"; - s << (int)(1+cartridgeNr) <<"</ps><ss>0</ss><page>1</page></slotted>"; - s << "<slotted><ps>"; - s << (int)(1+cartridgeNr) <<"</ps><ss>0</ss><page>2</page></slotted>"; - s << "<parameter name=\"filename\">"; - s << sfile << "</parameter>"; - s << "<parameter name=\"filesize\">0</parameter>"; - s << "<parameter name=\"volume\">9000</parameter>"; - s << "<parameter name=\"automappertype\">"; - if (*mapper != 0){ - s << "false</parameter>"; - s << "<parameter name=\"mappertype\">"<<smapper<<"</parameter>"; - } else { - s << "true</parameter>"; - }; - s << "<parameter name=\"loadsram\">true</parameter>"; - s << "<parameter name=\"savesram\">true</parameter>"; - s << "<parameter name=\"sramname\">"<<sfile<<".SRAM</parameter>"; - s << " </device>"; - s << "</msxconfig>"; - PRT_DEBUG(s.str()); - config->loadStream(s); - cartridgeNr++; + std::ostringstream s; + s << "<?xml version=\"1.0\"?>"; + s << "<msxconfig>"; + s << "<device id=\"GameCartridge"<< (int)cartridgeNr <<"\">"; + s << "<type>GameCartridge</type>"; + s << "<slotted><ps>"<<(int)(1+cartridgeNr)<<"</ps><ss>0</ss><page>0</page></slotted>"; + s << "<slotted><ps>"<<(int)(1+cartridgeNr)<<"</ps><ss>0</ss><page>1</page></slotted>"; + s << "<slotted><ps>"<<(int)(1+cartridgeNr)<<"</ps><ss>0</ss><page>2</page></slotted>"; + s << "<slotted><ps>"<<(int)(1+cartridgeNr)<<"</ps><ss>0</ss><page>3</page></slotted>"; + s << "<parameter name=\"filename\">"<<sfile<<"</parameter>"; + s << "<parameter name=\"filesize\">0</parameter>"; + s << "<parameter name=\"volume\">9000</parameter>"; + s << "<parameter name=\"automappertype\">"; + if (*mapper != 0) { + s << "false</parameter>"; + s << "<parameter name=\"mappertype\">"<<smapper<<"</parameter>"; + } else { + s << "true</parameter>"; + }; + s << "<parameter name=\"loadsram\">true</parameter>"; + s << "<parameter name=\"savesram\">true</parameter>"; + s << "<parameter name=\"sramname\">"<<sfile<<".SRAM</parameter>"; + s << "</device>"; + s << "</msxconfig>"; + PRT_DEBUG(s.str()); + config->loadStream(s); + cartridgeNr++; } void CommandLineParser::configureMusMod(std::string mode) { - std::ostringstream s; - s << "<?xml version=\"1.0\"?>"; - s << "<msxconfig>"; - s << " <device id=\"MSX-Audio\">"; - s << " <type>Audio</type>"; - s << "<parameter name=\"volume\">9000</parameter>"; - s << "<parameter name=\"sampleram\">256</parameter>"; - s << "<parameter name=\"mode\">"<< XML::Escape(mode) <<"</parameter>"; - s << " </device>"; - s << "<device id=\"MSX-Audio-Midi\">"; - s << " <type>Audio-Midi</type>"; - s << "</device>"; - s << "</msxconfig>"; - PRT_DEBUG(s.str()); - config->loadStream(s); - cartridgeNr++; + std::ostringstream s; + s << "<?xml version=\"1.0\"?>"; + s << "<msxconfig>"; + s << "<device id=\"MSX-Audio\">"; + s << "<type>Audio</type>"; + s << "<parameter name=\"volume\">9000</parameter>"; + s << "<parameter name=\"sampleram\">256</parameter>"; + s << "<parameter name=\"mode\">"<< XML::Escape(mode) <<"</parameter>"; + s << "</device>"; + s << "<device id=\"MSX-Audio-Midi\">"; + s << "<type>Audio-Midi</type>"; + s << "</device>"; + s << "</msxconfig>"; + PRT_DEBUG(s.str()); + config->loadStream(s); + cartridgeNr++; } void CommandLineParser::configureFmPac(std::string mode) { - std::ostringstream s; - s << "<?xml version=\"1.0\"?>"; - s << "<msxconfig>"; - s << " <device id=\"FM PAC\">"; - s << " <type>FM-PAC</type>"; - s << "<slotted><ps>2</ps><ss>0</ss><page>1</page></slotted>"; - s << "<parameter name=\"filename\">FMPAC.ROM</parameter>"; - s << "<parameter name=\"volume\">13000</parameter>"; - s << "<parameter name=\"mode\">"<< XML::Escape(mode) <<"</parameter>"; - s << "<parameter name=\"load\">true</parameter>"; - s << "<parameter name=\"save\">true</parameter>"; - s << "<parameter name=\"sramname\">FMPAC.PAC</parameter>"; - s << " </device>"; - s << "</msxconfig>"; - PRT_DEBUG(s.str()); - config->loadStream(s); - cartridgeNr++; + std::ostringstream s; + s << "<?xml version=\"1.0\"?>"; + s << "<msxconfig>"; + s << "<device id=\"FM PAC\">"; + s << "<type>FM-PAC</type>"; + s << "<slotted><ps>2</ps><ss>0</ss><page>1</page></slotted>"; + s << "<parameter name=\"filename\">FMPAC.ROM</parameter>"; + s << "<parameter name=\"volume\">13000</parameter>"; + s << "<parameter name=\"mode\">"<< XML::Escape(mode) <<"</parameter>"; + s << "<parameter name=\"load\">true</parameter>"; + s << "<parameter name=\"save\">true</parameter>"; + s << "<parameter name=\"sramname\">FMPAC.PAC</parameter>"; + s << "</device>"; + s << "</msxconfig>"; + PRT_DEBUG(s.str()); + config->loadStream(s); + cartridgeNr++; } void CommandLineParser::parse(MSXConfig::Backend* Backconfig,int argc, char **argv) @@ -311,22 +312,22 @@ switch (fileType) { case 0: //no filetype determined - break; + break; case 1: //xml files - config->loadFile(std::string(argv[i])); - nrXMLfiles++; - break; + config->loadFile(std::string(argv[i])); + nrXMLfiles++; + break; case 2: //dsk,di2,di1 files - configureDisk(argv[i]); - break; + configureDisk(argv[i]); + break; case 3: //cas files - configureTape(argv[i]); - break; + configureTape(argv[i]); + break; case 4: //rom files - configureCartridge(argv[i]); - break; + configureCartridge(argv[i]); + break; default: - PRT_INFO("Couldn't make sense of argument\n"); + PRT_INFO("Couldn't make sense of argument\n"); } fileType=0; } @@ -334,7 +335,7 @@ if ( isUsed(MSX1)) { config->loadFile(std::string("msx1.xml")); - nrXMLfiles++; + nrXMLfiles++; } else if ( isUsed(MSX2)) { Index: CommandLineParser.hh =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/CommandLineParser.hh,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- CommandLineParser.hh 15 Apr 2002 17:35:36 -0000 1.5 +++ CommandLineParser.hh 28 May 2002 12:46:28 -0000 1.6 @@ -11,55 +11,57 @@ class CommandLineParser { - public: - static CommandLineParser* instance(); - int checkFileType(char* parameter,int &i, char **argv); - int checkFileExt(char* filename); - void parse(MSXConfig::Backend* Backconfig,int argc, char **argv); - - void showHelp(const char* progname); + public: + static CommandLineParser* instance(); + int checkFileType(char* parameter,int &i, char **argv); + int checkFileExt(char* filename); + void parse(MSXConfig::Backend* Backconfig,int argc, char **argv); - void configureDisk(char* filename); - void configureTape(char* filename); - void configureCartridge(char* filename); - void configureMusMod(std::string mode); - void configureFmPac(std::string mode); + void showHelp(const char* progname); - void configureKeyInsert(const char *const arg); + void configureDisk(char* filename); + void configureTape(char* filename); + void configureCartridge(char* filename); + void configureMusMod(std::string mode); + void configureFmPac(std::string mode); - enum CLIoption { - HELP,MSX1,MSX2,MSX2PLUS,TURBOR, - FMPAC,MUSMOD,MBSTEREO,JOY,KEYINS - }; + void configureKeyInsert(const char *const arg); - void addOption(CLIoption id,std::string cliOption,bool usesParameter, std::string help); - bool isUsed(CLIoption id); - char* getParameter(CLIoption id); + enum CLIoption { + HELP,MSX1,MSX2,MSX2PLUS,TURBOR, + FMPAC,MUSMOD,MBSTEREO,JOY,KEYINS + }; - protected: - CommandLineParser(); + void addOption(CLIoption id,std::string cliOption,bool usesParameter, std::string help); + bool isUsed(CLIoption id); + char* getParameter(CLIoption id); - private: - // some parameters for internal use. - MSXConfig::Backend* config; - int nrXMLfiles; - char driveLetter; - byte cartridgeNr; - class CommandLineOption - { - public: - std::string option; - bool hasParameter; - std::string helpLine; - bool used; - char* parameter; + protected: + CommandLineParser(); - CommandLineOption(std::string cliOption,bool usesParameter, std::string help); - }; + private: + // some parameters for internal use. + MSXConfig::Backend* config; + int nrXMLfiles; + char driveLetter; + byte cartridgeNr; + + class CommandLineOption { + public: + CommandLineOption(const std::string &cliOption, + bool usesParameter, + const std::string &help); + + const std::string option; + const std::string helpLine; + const bool hasParameter; + bool used; + char* parameter; + }; - std::map<CLIoption,CommandLineParser::CommandLineOption*> optionList; + std::map<CLIoption,CommandLineParser::CommandLineOption*> optionList; - static CommandLineParser* oneInstance; + static CommandLineParser* oneInstance; }; #endif Index: MSXGameCartridge.cc =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/MSXGameCartridge.cc,v retrieving revision 1.40 retrieving revision 1.41 diff -u -d -r1.40 -r1.41 --- MSXGameCartridge.cc 8 May 2002 18:17:26 -0000 1.40 +++ MSXGameCartridge.cc 28 May 2002 12:46:28 -0000 1.41 @@ -36,19 +36,14 @@ for (mapperMask=1; mapperMask<nrblocks; mapperMask<<=1); mapperMask--; - SRAMEnableBit=0; - mapperType = retrieveMapperType(); - PRT_INFO("mapperType: "<<mapperType); + retrieveMapperType(); // only if needed reserve memory for SRAM - regioSRAM=0; - maskSRAM = (mapperType == 16) ? 0x07FF : 0x1FFF ; - if (mapperType&16) { - enabledSRAM= true; + if (mapperType & 16) { + regioSRAM=0; + enabledSRAM = true; memorySRAM = new byte[0x2000]; - //"Clear" ram contents - //TODO: can one use the C memfil here ? - for (int i=0 ; i<0x2000 ; i++)memorySRAM[i]=255; + memset(memorySRAM, 255, 0x2000); try { if (deviceConfig->getParameterAsBool("loadsram")) { std::string filename = deviceConfig->getParameter("sramname"); @@ -68,7 +63,7 @@ #ifndef DONT_WANT_SCC // only instantiate SCC if needed - if (mapperType==2) { + if (mapperType == 2) { short volume = (short)config->getParameterAsInt("volume"); cartridgeSCC = new SCC(volume); } else { @@ -77,13 +72,14 @@ #endif // only instantiate DACSound if needed - if (mapperType==64) { + if (mapperType == 64) { short volume = (short)config->getParameterAsInt("volume"); dac = new DACSound(volume, 16000, time); } else { dac = NULL; } + unmapped = NULL; reset(time); } @@ -96,15 +92,16 @@ if (cartridgeSCC) delete cartridgeSCC; #endif - if ((mapperType&16) && deviceConfig->getParameterAsBool("savesram")) { + if ((mapperType & 16) && deviceConfig->getParameterAsBool("savesram")) { std::string filename = deviceConfig->getParameter("sramname"); - PRT_INFO("Trying to save to "<<filename<<" for SRAM of the cartrdige"); + PRT_DEBUG("Trying to save to "<<filename<<" for SRAM of the cartrdige"); IOFILETYPE* file = FileOpener::openFileTruncate(filename); file->write(memorySRAM, 0x2000); file->close(); delete file; } - delete [] memorySRAM; + delete[] memorySRAM; + delete[] unmapped; } void MSXGameCartridge::reset(const EmuTime &time) @@ -122,54 +119,58 @@ regioSRAM=0; if (mapperType < 128 ) { + if (unmapped == NULL) { + unmapped = new byte[0x1000]; + memset(unmapped, 255, 0x1000); + } // TODO: mirror if number of 8kB blocks not fully filled ? - setBank(0, 0); // unused - setBank(1, 0); // unused - setBank(2, memoryBank); // 0x4000 - 0x5fff - setBank(3, memoryBank+0x2000); // 0x6000 - 0x7fff + setBank8kB(2, memoryBank); // 0x4000 - 0x5fff + setBank8kB(3, memoryBank+0x2000); // 0x6000 - 0x7fff if (mapperType == 16 || mapperType == 5) { - setBank(4, memoryBank); // 0x8000 - 0x9fff - setBank(5, memoryBank+0x2000); // 0xa000 - 0xbfff + setBank8kB(4, memoryBank+0x0000); // 0x8000 - 0x9fff + setBank8kB(5, memoryBank+0x2000); // 0xa000 - 0xbfff } else { - setBank(4, memoryBank+0x4000); // 0x8000 - 0x9fff - setBank(5, memoryBank+0x6000); // 0xa000 - 0xbfff + setBank8kB(4, memoryBank+0x4000); // 0x8000 - 0x9fff + setBank8kB(5, memoryBank+0x6000); // 0xa000 - 0xbfff } - setBank(6, 0); // unused - setBank(7, 0); // unused + setBank4kB(0, unmapped); // 0x0000 - 0x3fff + setBank4kB(1, unmapped); + setBank4kB(2, unmapped); + setBank4kB(3, unmapped); + setBank4kB(12, unmapped); // 0xc000 - 0xffff + setBank4kB(13, unmapped); + setBank4kB(14, unmapped); + setBank4kB(15, unmapped); } else { // this is a simple gamerom less then 64 kB byte* ptr; - switch (romSize>>14) { // blocks of 16kB - case 0: - // An 8 Kb game ???? + switch (romSize >> 14) { // blocks of 16kB + case 0: // An 8 kB game ???? for (int i=0; i<8; i++) { - setBank(i, memoryBank); + setBank8kB(i, memoryBank); } break; - case 1: + case 1: // 16kB for (int i=0; i<8; i+=2) { - setBank(i, memoryBank); - setBank(i+1, memoryBank+0x2000); + setBank8kB(i, memoryBank+0x0000); + setBank8kB(i+1, memoryBank+0x2000); } break; - case 2: - setBank(0, memoryBank); // 0x0000 - 0x1fff - setBank(1, memoryBank+0x2000); // 0x2000 - 0x3fff - setBank(2, memoryBank); // 0x4000 - 0x5fff - setBank(3, memoryBank+0x2000); // 0x6000 - 0x7fff - setBank(4, memoryBank+0x4000); // 0x8000 - 0x9fff - setBank(5, memoryBank+0x6000); // 0xa000 - 0xbfff - setBank(6, memoryBank+0x4000); // 0xc000 - 0xdfff - setBank(7, memoryBank+0x6000); // 0xe000 - 0xffff + case 2: // 32kB + setBank8kB(0, memoryBank+0x0000); // 0x0000 - 0x1fff + setBank8kB(1, memoryBank+0x2000); // 0x2000 - 0x3fff + setBank8kB(2, memoryBank+0x0000); // 0x4000 - 0x5fff + setBank8kB(3, memoryBank+0x2000); // 0x6000 - 0x7fff + setBank8kB(4, memoryBank+0x4000); // 0x8000 - 0x9fff + setBank8kB(5, memoryBank+0x6000); // 0xa000 - 0xbfff + setBank8kB(6, memoryBank+0x4000); // 0xc000 - 0xdfff + setBank8kB(7, memoryBank+0x6000); // 0xe000 - 0xffff break; - case 3: - // TODO 48kb, is this possible? - //assert (false); - //break; - case 4: + case 3: // 48kB, is this possible? + case 4: // 64kB ptr = memoryBank; for (int i=0; i<8; i++) { - setBank(i, ptr); + setBank8kB(i, ptr); ptr += 0x2000; } break; @@ -181,21 +182,20 @@ } struct ltstr { - bool operator()(const char* s1, const char* s2) const { - return strcmp(s1, s2) < 0; + bool operator()(const std::string s1, const std::string s2) const { + return strcasecmp(s1.c_str(), s2.c_str()) < 0; } }; -int MSXGameCartridge::retrieveMapperType() +void MSXGameCartridge::retrieveMapperType() { try { if (deviceConfig->getParameterAsBool("automappertype")) { - return guessMapperType(); + mapperType = guessMapperType(); } else { std::string type = deviceConfig->getParameter("mappertype"); - PRT_DEBUG("Using mapper type " << type); - std::map<const char*, int, ltstr> mappertype; + std::map<const std::string, int, ltstr> mappertype; mappertype["0"]=0; mappertype["8kB"]=0; @@ -216,10 +216,6 @@ mappertype["5"]=5; mappertype["ASCII16"]=5; - //Taken over by 19, since it has SRAM - mappertype["6"]=6; - mappertype["GAMEMASTER2"]=6; - //Not implemented yet mappertype["7"]=7; mappertype["RTYPE"]=7; @@ -240,24 +236,26 @@ mappertype["GAMEMASTER2"]=19; mappertype["RC755"]=19; - // Done - mappertype["64"]=64; mappertype["KONAMIDAC"]=64; + mappertype["128"]=128; + mappertype["64kB"]=128; + //TODO: catch wrong options passed - int selecttype= mappertype[type.c_str()]; - if (selecttype==17){ - SRAMEnableBit=0x20; - } else if (selecttype==18){ - SRAMEnableBit=0x80; - }; - return selecttype; + mapperType = mappertype[type]; } } catch (MSXConfig::Exception& e) { // missing parameter - return guessMapperType(); + mapperType = guessMapperType(); } + + if (mapperType == 17) { + SRAMEnableBit = 0x20; + } else if (mapperType == 18) { + SRAMEnableBit=0x80; + } + PRT_DEBUG("mapperType: " << mapperType); } int MSXGameCartridge::guessMapperType() @@ -284,7 +282,7 @@ return 128; } } else { - unsigned int typeGuess[]={0,0,0,0,0,0,0}; + unsigned int typeGuess[] = {0,0,0,0,0,0,0}; for (int i=0; i<romSize-2; i++) { if (memoryBank[i] == 0x32) { int value = memoryBank[i+1]+(memoryBank[i+2]<<8); @@ -329,19 +327,17 @@ if (typeGuess[6] != 75) typeGuess[6] = 0; // There is only one Game Master 2 int type = 0; for (int i=0; i<7; i++) { - if ( (typeGuess[i]) && (typeGuess[i]>=typeGuess[type])){ - type = i; + if ((typeGuess[i]) && (typeGuess[i]>=typeGuess[type])) { + type = i; } - }; + } // in case of doubt we go for type 0 // in case of even type 5 and 4 we would prefer 5 // but we would still prefer 0 above 4 or 5 - if ((type==5) && (typeGuess[0] == typeGuess[5] ) ){type=0;}; - for (int i=0; i<7; i++) { - PRT_DEBUG("MSXGameCartridge: typeGuess["<<i<<"]="<<typeGuess[i]); - } - std::string typeNames[]={"8kB","16kB","SCC","KONAMI4","ASCII8","ASCII16","GameMaster2"}; - PRT_INFO("MSXGameCartridge: I Guess this is a " << typeNames[type] << " GameCartridge type."); + if ((type==5) && (typeGuess[0] == typeGuess[5])) + type=0; + for (int i=0; i<7; i++) + PRT_DEBUG("MSXGameCartridge: typeGuess["<<i<<"]="<<typeGuess[i]); return type == 6 ? 19 : type; } } @@ -404,7 +400,7 @@ if (address<0x4000 || address>=0xC000) return; // change internal mapper value &= mapperMask; - setBank(address>>13, memoryBank+(value<<13)); + setBank8kB(address>>13, memoryBank+(value<<13)); break; case 1: //--==**>> Generic 16kB cartridges (MSXDOS2, Hole in one special) <<**==-- @@ -412,8 +408,8 @@ return; region = (address&0xC000)>>13; // 0, 2, 4, 6 value = (2*value)&mapperMask; - setBank(region, memoryBank+(value<<13)); - setBank(region+1, memoryBank+(value<<13)+0x2000); + setBank8kB(region, memoryBank+(value<<13)); + setBank8kB(region+1, memoryBank+(value<<13)+0x2000); break; case 2: //--==**>> KONAMI5 8kB cartridges <<**==-- @@ -445,7 +441,7 @@ // Page selection? if ((address & 0x1800) != 0x1000) return; value &= mapperMask; - setBank(address>>13, memoryBank+(value<<13)); + setBank8kB(address>>13, memoryBank+(value<<13)); break; case 3: //--==**>> KONAMI4 8kB cartridges <<**==-- @@ -458,7 +454,7 @@ if (address&0x1FFF || address<0x6000 || address>=0xC000) return; value &= mapperMask; - setBank(address>>13, memoryBank+(value<<13)); + setBank8kB(address>>13, memoryBank+(value<<13)); break; case 4: //--==**>> ASCII 8kB cartridges <<**==-- @@ -474,7 +470,7 @@ if (address<0x6000 || address>=0x8000) return; region = ((address>>11)&3)+2; value &= mapperMask; - setBank(region, memoryBank+(value<<13)); + setBank8kB(region, memoryBank+(value<<13)); break; case 5: //--==**>> ASCII 16kB cartridges <<**==-- @@ -489,12 +485,9 @@ if (address<0x6000 || address>=0x7800 || (address&0x800)) return; region = ((address>>11)&2)+2; value = (2*value)&mapperMask; - setBank(region, memoryBank+(value<<13)); - setBank(region+1, memoryBank+(value<<13)+0x2000); + setBank8kB(region, memoryBank+(value<<13)); + setBank8kB(region+1, memoryBank+(value<<13)+0x2000); break; -// case 6: - //--==**>> GameMaster2+SRAM cartridge <<**==-- - // GameMaster2 is implemented as device 19, since it has SRAM case 16: //--==**>> HYDLIDE2 cartridges <<**==-- // this type is is almost completely a ASCII16 cartrdige @@ -512,21 +505,21 @@ //Normal ASCII16 would return but maybe //we are writting to the SRAM? if (adr2pag[address>>13]®ioSRAM&0x0C){ - for (word adr=address & maskSRAM;adr<0x2000;adr+=0x800) + for (word adr=address&0x7ff; adr<0x2000; adr+=0x800) memorySRAM[adr]=value; } } else { region = ((address>>11)&2)+2; if (value == 0x10){ // SRAM block - setBank(region, memorySRAM); - setBank(region+1, memorySRAM); + setBank8kB(region, memorySRAM); + setBank8kB(region+1, memorySRAM); regioSRAM|=(region==2?0x03:0x0c); } else { // Normal 16 kB ROM page value = (2*value)&mapperMask; - setBank(region, memoryBank+(value<<13)); - setBank(region+1, memoryBank+(value<<13)+0x2000); + setBank8kB(region, memoryBank+(value<<13)); + setBank8kB(region+1, memoryBank+(value<<13)+0x2000); regioSRAM&=(region==2?0xFD:0xF4); } }; @@ -547,7 +540,7 @@ //we are writting to the SRAM? PRT_DEBUG(std::hex << "regioSRAM "<< (int)regioSRAM << std::dec << std::hex << "adr2pag[address>>13] "<< (int)adr2pag[address>>13] << std::dec ); if (adr2pag[address>>13]®ioSRAM&0x0C){ - memorySRAM[address & maskSRAM]=value; + memorySRAM[address & 0x1fff]=value; PRT_DEBUG(std::hex << "SRAM write [" << address << "] := " << (int)value << std::dec ); } } else { @@ -556,12 +549,12 @@ if (value & SRAMEnableBit){ //bit 7 for Royal Blood //bit 5 for Xanadu - setBank(region, memorySRAM); + setBank8kB(region, memorySRAM); regioSRAM|=adr2pag[region]; PRT_DEBUG("SRAM mapped in (region "<<(int)region<<"): regioSRAM="<<(int)regioSRAM<<"\n"); } else { value &= mapperMask; - setBank(region, memoryBank+(value<<13)); + setBank8kB(region, memoryBank+(value<<13)); regioSRAM&=(~adr2pag[region]); } }; @@ -592,19 +585,19 @@ int page = value & (1 << 5); if (page) { pageSRAM |= 1 << (address >> 13); - realSetBank((address>>12)&0xe, memorySRAM + 0x1000); - realSetBank(((address>>12)&0xe)+1, memorySRAM + 0x1000); + setBank4kB((address>>12)&0xe, memorySRAM + 0x1000); + setBank4kB(((address>>12)&0xe)+1, memorySRAM + 0x1000); } else { pageSRAM &= ~(1 << (address >> 13)); - realSetBank((address>>12)&0xe, memorySRAM); - realSetBank(((address>>12)&0xe)+1, memorySRAM); + setBank4kB((address>>12)&0xe, memorySRAM); + setBank4kB(((address>>12)&0xe)+1, memorySRAM); } // PRT_DEBUG (std::hex<<"GM2 Switched SRAM page="<<page<<", value="<<(int)value<<", addr="<<address<<std::dec<<std::endl); } else { // switch normal memory regioSRAM &= ~(1 << ((address >> 13) - 2)); value &= mapperMask; - setBank(address>>13, memoryBank+(value<<13)); + setBank8kB(address>>13, memoryBank+(value<<13)); // PRT_DEBUG (std::hex<<"GM2 Switched bank="<<(address>>13)<<", value="<<(int)value<<", addr="<<address<<std::dec<<std::endl); } break; @@ -625,13 +618,13 @@ } } -void MSXGameCartridge::setBank(int region, byte* value) +void MSXGameCartridge::setBank8kB(int region, byte* value) { - realSetBank (region * 2, value); - realSetBank (region * 2 + 1, value + 0x1000); + setBank4kB(region*2, value); + setBank4kB(region*2+1, value + 0x1000); } -void MSXGameCartridge::realSetBank(int region, byte * value) +void MSXGameCartridge::setBank4kB(int region, byte* value) { internalMemoryBank[region] = value; MSXCPU::instance()->invalidateCache(region*0x1000, 0x1000/CPU::CACHE_LINE_SIZE); Index: MSXGameCartridge.hh =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/MSXGameCartridge.hh,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- MSXGameCartridge.hh 5 May 2002 01:36:59 -0000 1.13 +++ MSXGameCartridge.hh 28 May 2002 12:46:28 -0000 1.14 @@ -39,21 +39,22 @@ static const byte adr2pag[]={128,128,1,2,4,8,128,128}; private: - void setBank(int regio, byte* value); // for ROMs thinking they have 8kB blocks - void realSetBank(int regio, byte* value); + void retrieveMapperType(); + int guessMapperType(); + void setBank8kB(int regio, byte* value); + void setBank4kB(int regio, byte* value); + int romSize; int mapperType; byte mapperMask; - byte *internalMemoryBank[16]; // 16 blocks of 4kB starting at #4000 + byte *internalMemoryBank[16]; // 16 blocks of 4kB + byte *unmapped; bool enabledSRAM; byte *memorySRAM; // SRAM area of Hydlide2/Xanadu/Royal Blood/Gamemaster2 byte SRAMEnableBit; - word maskSRAM; byte regioSRAM; //bit 0 if SRAM in 0x4000-0x5FFF,1 for 0x6000-0x7FFF,... int pageSRAM; //one bit per bank, telling which page of GameMaster 2 SRAM is swiched in. - int retrieveMapperType(); - int guessMapperType(); #ifndef DONT_WANT_SCC SCC* cartridgeSCC; bool enabledSCC; |