Mesen-X/Core/MapperFactory.cpp

276 lines
8.2 KiB
C++
Raw Normal View History

#include "stdafx.h"
#include "MessageManager.h"
#include "MapperFactory.h"
2016-01-28 20:47:16 -05:00
#include "RomLoader.h"
#include "ActionEnterprises.h"
#include "AXROM.h"
#include "Bandai74161_7432.h"
#include "BandaiFcg.h"
2015-12-31 09:51:01 -05:00
#include "BnRom.h"
2016-01-18 20:47:29 -05:00
#include "BF909x.h"
#include "BF9096.h"
#include "CNROM.h"
2015-12-28 15:16:50 -05:00
#include "CpRom.h"
#include "ColorDreams.h"
2016-06-18 12:49:53 -04:00
#include "DaouInfosys.h"
2016-01-28 20:47:16 -05:00
#include "FDS.h"
2016-06-14 18:42:53 -04:00
#include "FrontFareast.h"
#include "GxRom.h"
2015-12-28 21:07:32 -05:00
#include "IremG101.h"
2016-01-23 16:58:12 -05:00
#include "IremH3001.h"
2016-01-19 23:45:54 -05:00
#include "IremLrog017.h"
2016-01-18 18:24:22 -05:00
#include "IremTamS1.h"
2016-01-23 16:02:11 -05:00
#include "JalecoJf11_14.h"
2016-06-18 10:55:32 -04:00
#include "JalecoJf13.h"
2016-01-19 23:32:02 -05:00
#include "JalecoJf16.h"
2016-01-19 23:12:47 -05:00
#include "JalecoJf17_19.h"
#include "JalecoJfxx.h"
2015-12-28 20:07:27 -05:00
#include "JalecoSs88006.h"
2016-05-19 18:54:49 -04:00
#include "Mapper15.h"
2016-01-23 11:33:11 -05:00
#include "Mapper57.h"
2016-01-19 20:48:09 -05:00
#include "Mapper58.h"
2016-05-19 19:18:01 -04:00
#include "Mapper60.h"
2016-01-23 11:44:40 -05:00
#include "Mapper61.h"
2016-01-23 11:57:24 -05:00
#include "Mapper62.h"
2016-01-23 16:20:28 -05:00
#include "Mapper91.h"
2016-01-19 22:33:29 -05:00
#include "Mapper107.h"
2016-01-23 14:38:54 -05:00
#include "Mapper112.h"
2016-01-18 22:48:09 -05:00
#include "Mapper200.h"
2016-01-20 19:08:36 -05:00
#include "Mapper201.h"
2016-01-20 19:01:10 -05:00
#include "Mapper202.h"
2016-01-20 18:42:03 -05:00
#include "Mapper203.h"
2016-06-18 18:16:25 -04:00
#include "Mapper218.h"
2016-01-23 14:58:19 -05:00
#include "Mapper225.h"
2016-01-23 21:54:15 -05:00
#include "Mapper226.h"
2016-01-23 15:15:42 -05:00
#include "Mapper230.h"
2016-01-18 22:26:54 -05:00
#include "Mapper231.h"
2016-01-18 21:54:04 -05:00
#include "Mapper240.h"
2016-02-22 20:14:40 -05:00
#include "Mapper241.h"
2016-01-18 21:46:53 -05:00
#include "Mapper242.h"
2016-01-18 22:08:00 -05:00
#include "Mapper246.h"
#include "MMC1.h"
2016-06-18 15:49:00 -04:00
#include "MMC1_155.h"
#include "MMC2.h"
#include "MMC3.h"
2016-01-20 20:32:49 -05:00
#include "MMC3_12.h"
2016-01-20 19:44:52 -05:00
#include "MMC3_37.h"
2016-01-21 01:01:25 -05:00
#include "MMC3_44.h"
2016-01-24 00:40:56 -05:00
#include "MMC3_45.h"
2016-01-20 21:06:56 -05:00
#include "MMC3_47.h"
2016-01-23 09:38:20 -05:00
#include "MMC3_49.h"
2016-01-23 10:33:23 -05:00
#include "MMC3_52.h"
2016-01-18 19:33:50 -05:00
#include "MMC3_115.h"
2014-08-04 15:55:20 -04:00
#include "MMC3_189.h"
2016-01-20 19:32:28 -05:00
#include "MMC3_205.h"
#include "MMC3_ChrRam.h"
2015-12-28 13:57:26 -05:00
#include "MMC4.h"
#include "MMC5.h"
#include "Namco108.h"
#include "Namco108_76.h"
#include "Namco108_88.h"
#include "Namco108_95.h"
#include "Namco108_154.h"
#include "Namco163.h"
#include "Nanjing.h"
2015-12-31 09:51:01 -05:00
#include "Nina01.h"
2015-12-30 11:47:36 -05:00
#include "Nina03_06.h"
#include "NROM.h"
2016-01-19 16:59:01 -05:00
#include "NtdecTc112.h"
2016-01-23 20:02:20 -05:00
#include "Rambo1.h"
2016-06-19 01:02:09 -04:00
#include "Sachen_143.h"
2015-12-31 10:51:00 -05:00
#include "Sachen_145.h"
#include "Sachen_147.h"
2015-12-31 11:04:26 -05:00
#include "Sachen_148.h"
#include "Sachen_149.h"
#include "Sachen74LS374N.h"
#include "Sachen74LS374NB.h"
#include "Sachen8259.h"
2016-01-23 12:51:10 -05:00
#include "Sunsoft3.h"
#include "Sunsoft4.h"
2015-12-30 20:31:54 -05:00
#include "Sunsoft89.h"
#include "Sunsoft93.h"
#include "Sunsoft184.h"
#include "SunsoftFme7.h"
2015-12-28 23:21:10 -05:00
#include "TaitoTc0190.h"
2015-12-30 18:26:40 -05:00
#include "TaitoX1005.h"
2016-02-22 19:52:58 -05:00
#include "TaitoX1017.h"
2016-01-23 21:09:01 -05:00
#include "TxSRom.h"
#include "UnlPci556.h"
#include "UNROM.h"
2016-01-18 18:43:06 -05:00
#include "UnRom_94.h"
2016-01-18 18:03:42 -05:00
#include "UnRom_180.h"
2015-12-30 20:59:02 -05:00
#include "VRC1.h"
#include "VRC2_4.h"
2016-01-23 13:07:56 -05:00
#include "VRC3.h"
#include "VRC6.h"
2016-01-24 17:05:53 -05:00
#include "VRC7.h"
#include "VsSystem.h"
2016-01-28 20:47:16 -05:00
BaseMapper* MapperFactory::GetMapperFromID(RomData &romData)
{
#ifdef _DEBUG
MessageManager::DisplayMessage("GameInfo", "Mapper", std::to_string(romData.MapperID), std::to_string(romData.SubMapperID));
#endif
2016-01-28 20:47:16 -05:00
switch(romData.MapperID) {
case 0: return new NROM();
case 1: return new MMC1();
case 2: return new UNROM();
case 3: return new CNROM(false);
case 4: return new MMC3();
case 5: return new MMC5();
2016-06-14 18:42:53 -04:00
case 6: return new FrontFareast();
case 7: return new AXROM();
2016-06-14 18:42:53 -04:00
case 8: return new FrontFareast();
case 9: return new MMC2();
2015-12-28 13:57:26 -05:00
case 10: return new MMC4();
case 11: return new ColorDreams();
2016-01-20 20:32:49 -05:00
case 12: return new MMC3_12();
2015-12-28 15:16:50 -05:00
case 13: return new CpRom();
2016-05-19 18:54:49 -04:00
case 15: return new Mapper15();
case 16: return new BandaiFcg();
2016-06-14 18:42:53 -04:00
case 17: return new FrontFareast();
2015-12-28 20:07:27 -05:00
case 18: return new JalecoSs88006();
case 19: return new Namco163();
case 21: return new VRC2_4();
case 22: return new VRC2_4();
case 23: return new VRC2_4();
case 24: return new VRC6(VRCVariant::VRC6a);
case 25: return new VRC2_4();
case 26: return new VRC6(VRCVariant::VRC6b);
case 27: return new VRC2_4();
2015-12-28 21:07:32 -05:00
case 32: return new IremG101();
2015-12-28 23:21:10 -05:00
case 33: return new TaitoTc0190();
case 34:
switch(romData.SubMapperID) {
case 0: return (romData.ChrRom.size() > 0) ? (BaseMapper*)new Nina01() : (BaseMapper*)new BnRom(); //BnROM uses CHR RAM (so no CHR rom in the .NES file)
case 1: return new Nina01();
case 2: return new BnRom();
}
2016-01-20 19:44:52 -05:00
case 37: return new MMC3_37();
case 38: return new UnlPci556();
2016-01-21 01:01:25 -05:00
case 44: return new MMC3_44();
2016-01-24 00:40:56 -05:00
case 45: return new MMC3_45();
2016-01-20 21:06:56 -05:00
case 47: return new MMC3_47();
2016-01-23 09:38:20 -05:00
case 49: return new MMC3_49();
2016-01-23 10:33:23 -05:00
case 52: return new MMC3_52();
2016-01-23 11:33:11 -05:00
case 57: return new Mapper57();
2016-01-19 20:48:09 -05:00
case 58: return new Mapper58();
2016-05-19 19:18:01 -04:00
case 60: return new Mapper60(); //Partial support?
2016-01-23 11:44:40 -05:00
case 61: return new Mapper61();
2016-01-23 11:57:24 -05:00
case 62: return new Mapper62();
2016-01-23 20:02:20 -05:00
case 64: return new Rambo1();
2016-01-23 16:58:12 -05:00
case 65: return new IremH3001();
case 66: return new GxRom();
case 67: return new Sunsoft3();
case 68: return new Sunsoft4(); //incomplete support
case 69: return new SunsoftFme7();
case 70: return new Bandai74161_7432(false);
case 71: return new BF909x();
2016-01-19 23:12:47 -05:00
case 72: return new JalecoJf17_19(false);
2016-01-23 13:07:56 -05:00
case 73: return new VRC3();
case 74: return new MMC3_ChrRam(0x08, 0x09, 2);
2015-12-30 20:59:02 -05:00
case 75: return new VRC1();
case 76: return new Namco108_76();
2016-01-19 23:45:54 -05:00
case 77: return new IremLrog017();
case 78: return new JalecoJf16();
2015-12-31 08:47:33 -05:00
case 79: return new Nina03_06(false);
case 80: return new TaitoX1005(false);
2016-02-22 19:52:58 -05:00
case 82: return new TaitoX1017();
2016-01-24 17:05:53 -05:00
case 85: return new VRC7();
2016-06-18 10:55:32 -04:00
case 86: return new JalecoJf13();
case 87: return new JalecoJfxx(false);
case 88: return new Namco108_88();
2015-12-30 20:31:54 -05:00
case 89: return new Sunsoft89();
2016-01-23 16:20:28 -05:00
case 91: return new Mapper91();
2016-01-19 23:12:47 -05:00
case 92: return new JalecoJf17_19(true);
2015-12-30 20:31:54 -05:00
case 93: return new Sunsoft93();
2016-01-18 18:43:06 -05:00
case 94: return new UnRom_94();
case 95: return new Namco108_95();
2016-06-18 11:24:30 -04:00
case 96: break; //Bandai - Oeka Tablet
2016-01-18 18:24:22 -05:00
case 97: return new IremTamS1();
case 99: return new VsSystem();
case 101: return new JalecoJfxx(true);
2016-06-18 11:24:30 -04:00
case 105: break; //NES World Champ - has dip switches
2016-01-19 22:33:29 -05:00
case 107: return new Mapper107();
2016-01-23 14:38:54 -05:00
case 112: return new Mapper112();
2015-12-31 08:47:33 -05:00
case 113: return new Nina03_06(true);
2016-01-18 19:33:50 -05:00
case 115: return new MMC3_115();
2016-01-23 21:09:01 -05:00
case 118: return new TxSRom();
case 119: return new MMC3_ChrRam(0x40, 0x7F, 8);
case 137: return new Sachen8259(Sachen8259Variant::Sachen8259D);
case 138: return new Sachen8259(Sachen8259Variant::Sachen8259B);
case 139: return new Sachen8259(Sachen8259Variant::Sachen8259C);
2016-01-23 16:02:11 -05:00
case 140: return new JalecoJf11_14();
case 141: return new Sachen8259(Sachen8259Variant::Sachen8259A);
2016-06-19 01:02:09 -04:00
case 143: return new Sachen_143();
2016-06-18 11:24:30 -04:00
case 144: return new ColorDreams();
2015-12-31 10:51:00 -05:00
case 145: return new Sachen_145();
case 146: return new Nina03_06(false);
case 147: return new Sachen_147();
2015-12-31 11:04:26 -05:00
case 148: return new Sachen_148();
case 149: return new Sachen_149();
case 150: return new Sachen74LS374NB();
2016-06-18 10:31:41 -04:00
case 151: return new VRC1();
case 152: return new Bandai74161_7432(true);
case 153: return new BandaiFcg();
case 154: return new Namco108_154();
2016-06-18 15:49:00 -04:00
case 155: return new MMC1_155();
2016-06-18 12:49:53 -04:00
case 156: return new DaouInfosys();
case 157: return new BandaiFcg();
case 159: return new BandaiFcg();
case 163: return new Nanjing();
2016-01-18 18:03:42 -05:00
case 180: return new UnRom_180();
2015-12-30 20:31:54 -05:00
case 184: return new Sunsoft184();
case 185: return new CNROM(true);
2014-08-04 15:55:20 -04:00
case 189: return new MMC3_189();
case 191: return new MMC3_ChrRam(0x80, 0xFF, 2);
case 192: return new MMC3_ChrRam(0x08, 0x0B, 4);
2016-01-19 16:59:01 -05:00
case 193: return new NtdecTc112();
case 194: return new MMC3_ChrRam(0x00, 0x01, 2);
case 195: return new MMC3_ChrRam(0x00, 0x03, 4);
2016-01-18 22:48:09 -05:00
case 200: return new Mapper200();
2016-01-20 19:08:36 -05:00
case 201: return new Mapper201();
2016-01-20 19:01:10 -05:00
case 202: return new Mapper202();
2016-01-20 18:42:03 -05:00
case 203: return new Mapper203();
2016-01-20 19:32:28 -05:00
case 205: return new MMC3_205();
case 206: return new Namco108();
case 207: return new TaitoX1005(true);
case 210: return new Namco163();
2016-06-18 18:16:25 -04:00
case 218: return new Mapper218();
2016-01-23 14:58:19 -05:00
case 225: return new Mapper225();
2016-01-23 21:54:15 -05:00
case 226: return new Mapper226();
case 228: return new ActionEnterprises();
2016-01-23 15:15:42 -05:00
case 230: return new Mapper230();
2016-01-18 22:26:54 -05:00
case 231: return new Mapper231();
2016-01-18 20:47:29 -05:00
case 232: return new BF9096();
2016-01-18 21:54:04 -05:00
case 240: return new Mapper240();
2016-02-22 20:14:40 -05:00
case 241: return new Mapper241();
2016-01-18 21:46:53 -05:00
case 242: return new Mapper242();
case 243: return new Sachen74LS374N();
2016-01-18 22:08:00 -05:00
case 246: return new Mapper246();
2016-01-28 20:47:16 -05:00
case MapperFactory::FdsMapperID: return new FDS();
}
MessageManager::DisplayMessage("Error", "UnsupportedMapper");
return nullptr;
}
shared_ptr<BaseMapper> MapperFactory::InitializeFromFile(string romFilename, stringstream *filestream, string ipsFilename, int32_t archiveFileIndex)
{
2016-01-28 20:47:16 -05:00
RomLoader loader;
if(loader.LoadFile(romFilename, filestream, ipsFilename, archiveFileIndex)) {
2016-01-28 20:47:16 -05:00
RomData romData = loader.GetRomData();
shared_ptr<BaseMapper> mapper(GetMapperFromID(romData));
if(mapper) {
2016-01-28 20:47:16 -05:00
mapper->Initialize(romData);
return mapper;
}
}
return nullptr;
}
2015-12-26 17:11:00 -05:00