summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/nes/nes_pcb.inc
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/nes/nes_pcb.inc')
-rw-r--r--src/devices/bus/nes/nes_pcb.inc609
1 files changed, 609 insertions, 0 deletions
diff --git a/src/devices/bus/nes/nes_pcb.inc b/src/devices/bus/nes/nes_pcb.inc
new file mode 100644
index 00000000000..57cdf3d498c
--- /dev/null
+++ b/src/devices/bus/nes/nes_pcb.inc
@@ -0,0 +1,609 @@
+// license:BSD-3-Clause
+// copyright-holders:Fabio Priuli
+/*****************************************************************************************
+
+ NES Cart PCBs Emulation
+
+****************************************************************************************/
+
+struct nes_pcb
+{
+ const char *slot_opt;
+ int pcb_id;
+};
+
+// Here, we take the feature attribute from .xml (i.e. the PCB name) and we assign a unique ID to it
+static const nes_pcb pcb_list[] =
+{
+ { "nrom", STD_NROM },
+ { "hvc_basic", HVC_FAMBASIC },
+ { "nrom368", STD_NROM368 },
+ { "nrom_gg", GG_NROM },
+ { "uxrom", STD_UXROM },
+ { "unrom_cc", UXROM_CC },
+ { "cnrom", STD_CNROM },
+ { "bandai_pt554", BANDAI_PT554 },
+ { "cprom", STD_CPROM },
+ { "axrom", STD_AXROM },
+ { "pxrom", STD_PXROM },
+ { "fxrom", STD_FXROM },
+ { "bnrom", STD_BXROM },
+ { "gxrom", STD_GXROM },
+ { "un1rom", STD_UN1ROM },
+ { "sxrom", STD_SXROM },
+ { "sorom", STD_SOROM },
+ { "sxrom_a", STD_SXROM_A },
+ { "sorom_a", STD_SOROM_A },
+ { "txrom", STD_TXROM },
+ { "hkrom", STD_HKROM },
+ { "tqrom", STD_TQROM },
+ { "txsrom", STD_TXSROM },
+ { "exrom", STD_EXROM },
+ { "disksys", STD_DISKSYS },
+ { "pal_zz", PAL_ZZ },
+ { "nes_qj", NES_QJ },
+ { "nes_event", STD_EVENT },
+ { "discrete_74x139", DIS_74X139X74 },
+ { "discrete_74x377", DIS_74X377 },
+ { "discrete_74x161", DIS_74X161X161X32 },
+ { "bitcorp_dis", DIS_74X161X138 },
+ { "lz93d50", BANDAI_LZ93 },
+ { "lz93d50_ep1", BANDAI_LZ93EX1 },
+ { "lz93d50_ep2", BANDAI_LZ93EX2 },
+ { "fcg", BANDAI_FCG },
+ { "fjump2", BANDAI_FJUMP2 },
+ { "datach", BANDAI_DATACH },
+ { "karastudio", BANDAI_KARAOKE },
+ { "oekakids", BANDAI_OEKAKIDS },
+ { "g101", IREM_G101 },
+ { "lrog017", IREM_LROG017 },
+ { "h3001", IREM_H3001 },
+ { "holydivr", IREM_HOLYDIVR },
+ { "tam_s1", IREM_TAM_S1 },
+ { "jf11", JALECO_JF11 },
+ { "jf13", JALECO_JF13 },
+ { "jf16", JALECO_JF16 },
+ { "jf17", JALECO_JF17 },
+ { "jf17pcm", JALECO_JF17_ADPCM },
+ { "jf19", JALECO_JF19 },
+ { "jf19pcm", JALECO_JF19_ADPCM },
+ { "ss88006", JALECO_SS88006 },
+ { "jf23", JALECO_JF23 },
+ { "jf24", JALECO_JF24 },
+ { "jf29", JALECO_JF29 },
+ { "jf33", JALECO_JF33 },
+ { "vrc1", KONAMI_VRC1 },
+ { "vrc2", KONAMI_VRC2 },
+ { "vrc3", KONAMI_VRC3 },
+ { "vrc4", KONAMI_VRC4 },
+ { "vrc6", KONAMI_VRC6 },
+ { "vrc7", KONAMI_VRC7 },
+ { "namcot_163", NAMCOT_163 },
+ { "namcot_175", NAMCOT_175 },
+ { "namcot_340", NAMCOT_340 },
+ { "namcot_3433", NAMCOT_34X3 }, // DxROM is a Nintendo board for US versions of the 3433/3443 games
+ { "namcot_3425", NAMCOT_3425 },
+ { "namcot_3446", NAMCOT_3446 },
+ { "sunsoft1", SUNSOFT_1 },
+ { "sunsoft2", SUNSOFT_2 },
+ { "sunsoft3", SUNSOFT_3 },
+ { "sunsoft4", SUNSOFT_4 },
+ { "sunsoft_dcs", SUNSOFT_DCS },
+ { "sunsoft_fme7", SUNSOFT_FME7 }, // JxROM is a Nintendo board for US versions of the Sunsoft FME7 games
+ { "sunsoft5a", SUNSOFT_FME7 },
+ { "sunsoft5b", SUNSOFT_5 },
+ { "tc0190fmc", TAITO_TC0190FMC },
+ { "tc0190fmcp", TAITO_TC0190FMCP },
+ { "tc0350fmr", TAITO_TC0190FMC },
+ { "x1_005", TAITO_X1_005 }, // two variants exist, depending on pin17 & pin31 connections
+ { "x1_017", TAITO_X1_017 },
+ { "nina001", AVE_NINA01 },
+ { "nina006", AVE_NINA06 },
+ { "maxi15", AVE_MAXI15 },
+ { "bf9093", CAMERICA_BF9093 },
+ { "bf9096", CAMERICA_BF9096 },
+ { "goldenfive", CAMERICA_GOLDENFIVE },
+ { "ade" , CAMERICA_ALADDIN },
+ { "cne_decathl", CNE_DECATHLON },
+ { "cne_fsb", CNE_FSB },
+ { "cne_shlz", CNE_SHLZ },
+ { "nanjing", NANJING_BOARD }, // mapper 163
+ { "ntdec_asder", NTDEC_ASDER }, // mapper 112
+ { "ntdec_fh", NTDEC_FIGHTINGHERO }, // mapper 193
+ { "sa009", SACHEN_SA009 },
+ { "sa0036", SACHEN_SA0036 },
+ { "sa0037", SACHEN_SA0037 },
+ { "sa72007", SACHEN_SA72007 },
+ { "sa72008", SACHEN_SA72008 },
+ { "tca01", SACHEN_TCA01 },
+ { "s8259a", SACHEN_8259A },
+ { "s8259b", SACHEN_8259B },
+ { "s8259c", SACHEN_8259C },
+ { "s8259d", SACHEN_8259D },
+ { "s74x374", SACHEN_74LS374 },
+ { "s74x374a", SACHEN_74LS374_ALT }, /* FIXME: Made up boards some different handling */
+ { "tcu01", SACHEN_TCU01 },
+ { "tcu02", SACHEN_TCU02 },
+ { "sa9602b", SACHEN_SA9602B },
+ { "tengen_800008", TENGEN_800008 }, /* FIXME: Is this the same as mapper 3? */
+ { "tengen_800032", TENGEN_800032 },
+ { "tengen_800037", TENGEN_800037 },
+ { "txc_22211", TXC_22211 },
+ { "txc_dumarc", TXC_DUMARACING },
+ { "txc_mjblock", TXC_MJBLOCK },
+ { "txc_strikew", TXC_STRIKEW },
+ { "txc_commandos", TXC_COMMANDOS },
+ { "waixing_a", WAIXING_TYPE_A },
+ { "waixing_a1", WAIXING_TYPE_A1 }, /* FIXME: Made up boards the different CHRRAM banks (see Ji Jia Zhan Shi }, */
+ { "waixing_b", WAIXING_TYPE_B },
+ { "waixing_c", WAIXING_TYPE_C },
+ { "waixing_d", WAIXING_TYPE_D },
+ { "waixing_e", WAIXING_TYPE_E },
+ { "waixing_f", WAIXING_TYPE_F },
+ { "waixing_g", WAIXING_TYPE_G },
+ { "waixing_h", WAIXING_TYPE_H },
+ { "waixing_h1", WAIXING_TYPE_H1 },
+ { "waixing_i", WAIXING_TYPE_I },
+ { "waixing_j", WAIXING_TYPE_J },
+ { "waixing_sgz", WAIXING_SGZ },
+ { "waixing_sgzlz", WAIXING_SGZLZ },
+ { "waixing_sec", WAIXING_SECURITY },
+ { "waixing_ffv", WAIXING_FFV },
+ { "waixing_wxzs", WAIXING_WXZS },
+ { "waixing_wxzs2", WAIXING_WXZS2 },
+ { "waixing_dq8", WAIXING_DQ8 },
+ { "waixing_sh2", WAIXING_SH2 },
+ { "fs304", WAIXING_FS304 }, // used in Zelda 3 by Waixing
+ { "cony", CONY_BOARD },
+ { "yoko", YOKO_BOARD },
+ { "hengg_srich", HENGG_SRICH },
+ { "hengg_xhzs", HENGG_XHZS },
+ { "hengg_shjy3", HENGG_SHJY3 }, // mapper 253
+ { "hes", HES_BOARD },
+ { "hosenkan", HOSENKAN_BOARD },
+ { "ks7058", KAISER_KS7058 },
+ { "ks202", KAISER_KS202 }, // mapper 56
+ { "ks7022", KAISER_KS7022 }, // mapper 175
+ { "ks7017", KAISER_KS7017 },
+ { "ks7032", KAISER_KS7032 }, // mapper 142
+ { "ks7031", KAISER_KS7031 }, // used in Dracula II (FDS Conversion)
+ { "ks7012", KAISER_KS7012 }, // used in Zanac (FDS Conversion)
+ { "ks7013b", KAISER_KS7013B }, // used in Highway Star (FDS Conversion)
+ { "gs2015", RCM_GS2015 },
+ { "gs2004", RCM_GS2004 },
+ { "gs2013", RCM_GS2013 },
+ { "tf9in1", RCM_TF9IN1 },
+ { "3dblock", RCM_3DBLOCK }, // NROM + IRQ?
+ { "racermate", UNL_RACERMATE }, // mapper 168
+ { "agci_50282", AGCI_50282 },
+ { "dreamtech01", DREAMTECH_BOARD },
+ { "fukutake", FUKUTAKE_BOARD },
+ { "futuremedia", FUTUREMEDIA_BOARD },
+ { "magicseries", MAGICSERIES_MD },
+ { "daou_306", OPENCORP_DAOU306 },
+ { "subor0", SUBOR_TYPE0 },
+ { "subor1", SUBOR_TYPE1 },
+ { "cc21", UNL_CC21 },
+ { "xiaozy", UNL_XIAOZY },
+ { "edu2k", UNL_EDU2K },
+ { "t230", UNL_T230 },
+ { "mk2", UNL_MK2 },
+ // misc bootleg boards
+ { "ax5705", UNL_AX5705 },
+ { "sc127", UNL_SC127 },
+ { "mariobaby", BTL_MARIOBABY },
+ { "asnicol", BTL_AISENSHINICOL },
+ { "smb3pirate", BTL_SMB3 },
+ { "btl_dninja", BTL_DRAGONNINJA },
+ { "whirl2706", WHIRLWIND_2706 },
+ { "smb2j", UNL_SMB2J },
+ { "smb2ja", BTL_SMB2JA },
+ { "smb2jb", BTL_SMB2JB },
+ { "09034a", BTL_09034A },
+ { "tobidase", BTL_TOBIDASE }, // mapper 120
+ { "dbz5", REXSOFT_DBZ5 },
+ { "sl1632", REXSOFT_SL1632 },
+ { "somari", SOMARI_SL12 }, // mapper 116
+ { "nitra", NITRA_TDA },
+ { "ks7057", UNL_KS7057 }, // mapper 196 alt (for Street Fighter VI / Fight Street VI },
+ { "sbros11", BTL_SBROS11 },
+ { "family4646", BMC_FAMILY_4646 },
+ { "pikay2k", BTL_PIKACHUY2K }, // mapper 254
+ { "8237", UNL_8237 },
+ { "sg_lionk", SUPERGAME_LIONKING },
+ { "sg_boog", SUPERGAME_BOOGERMAN },
+ { "kasing", KASING_BOARD },
+ { "kay", KAY_BOARD },
+ { "h2288", UNL_H2288 },
+ { "unl_6035052", UNL_603_5052 }, // mapper 238?
+ { "txc_tw", TXC_TW },
+ { "kof97", UNL_KOF97 },
+ { "kof96", UNL_KOF96 },
+ { "sfight3", UNL_SF3 },
+ { "gouder", GOUDER_37017 },
+ { "benshieng", BMC_BENSHIENG },
+ { "action52", ACTENT_ACT52 },
+ { "caltron6in1", CALTRON_6IN1 },
+ { "rumblestation", RUMBLESTATION_BOARD }, // mapper 46
+ { "svision16", SVISION16_BOARD },
+ { "n625092", UNL_N625092 },
+ { "a65as", BMC_A65AS },
+ { "t262", BMC_T262 },
+ { "novel1", BMC_NOVEL1 },
+ { "novel2", BMC_NOVEL2 }, // mapper 213... same as BMC-NOVELDIAMOND9999999IN1 board?
+ { "studyngame", UNL_STUDYNGAME }, // mapper 39
+ { "sgun20in1", BMC_SUPERGUN_20IN1 },
+ { "bmc_vt5201", BMC_VT5201 }, // mapper 60 otherwise
+ { "bmc_d1038", BMC_VT5201 }, // mapper 60?
+ { "810544c", BMC_810544 },
+ { "ntd03", BMC_NTD_03 },
+ { "bmc_gb63", BMC_G63IN1 },
+ { "bmc_gka", BMC_GKA },
+ { "bmc_gkb", BMC_GKB },
+ { "bmc_ws", BMC_WS },
+ { "bmc_hik300", BMC_SUPERHIK_300IN1 },
+ { "bmc_s700", BMC_SUPER_700IN1 },
+ { "bmc_ball11", BMC_BALLGAMES_11IN1 },
+ { "bmc_22games", BMC_22GAMES },
+ { "bmc_64y2k", BMC_64IN1NR },
+ { "bmc_12in1", BMC_12IN1 },
+ { "bmc_20in1", BMC_20IN1 },
+ { "bmc_21in1", BMC_21IN1 },
+ { "bmc_31in1", BMC_31IN1 },
+ { "bmc_35in1", BMC_35IN1 },
+ { "bmc_36in1", BMC_36IN1 },
+ { "bmc_64in1", BMC_64IN1 },
+ { "bmc_70in1", BMC_70IN1 },
+ { "bmc_72in1", BMC_72IN1 },
+ { "bmc_76in1", BMC_76IN1 },
+ { "bmc_s42in1", BMC_76IN1 },
+ { "bmc_110in1", BMC_110IN1 },
+ { "bmc_150in1", BMC_150IN1 },
+ { "bmc_190in1", BMC_190IN1 },
+ { "bmc_800in1", BMC_800IN1 },
+ { "bmc_1200in1", BMC_1200IN1 },
+ { "bmc_8157", BMC_8157 },
+ { "bmc_g146", BMC_G146 },
+ { "bmc_11160", BMC_11160 },
+ { "fk23c", BMC_FK23C },
+ { "fk23ca", BMC_FK23CA },
+ { "s24in1c03", BMC_S24IN1SC03 },
+ { "bmc_15in1", BMC_15IN1 },
+ { "bmc_sbig7in1", BMC_SUPERBIG_7IN1 },
+ { "bmc_hik8in1", BMC_HIK8IN1 },
+ { "bmc_hik4in1", BMC_SUPERHIK_4IN1 },
+ { "bmc_mario7in1", BMC_MARIOPARTY_7IN1 },
+ { "bmc_gold7in1", BMC_GOLD_7IN1 },
+ { "bmc_gc6in1", BMC_GOLDENCARD_6IN1 },
+ { "bmc_411120c", BMC_411120C },
+ { "bmc_830118c", BMC_830118C },
+ { "pjoy84", BMC_PJOY84 },
+ { "bmc_gold150", BMC_GOLD150 },
+ { "bmc_gold260", BMC_GOLD260 },
+ { "bmc_power255", BMC_CH001 },
+ { "bmc_s22games", BMC_SUPER22 },
+ { "bmc_reset4", BMC_4IN1RESET },
+ { "bmc_reset42", BMC_42IN1RESET },
+ { "jyc_a", JYCOMPANY_A },
+ { "jyc_b", JYCOMPANY_B },
+ { "jyc_c", JYCOMPANY_C },
+ { "tek90", JYCOMPANY_A },
+ { "sa9602b", SACHEN_SA9602B },
+ { "unl_shero", SACHEN_SHERO },
+ { "mmalee2", UNL_MMALEE },
+ { "unl_2708", UNL_2708 },
+ { "unl_lh10", UNL_LH10 },
+ { "unl_lh32", UNL_LH32 },
+ { "unl_lh53", UNL_LH53 },
+ { "unl_ac08", UNL_AC08 },
+ { "unl_bb", UNL_BB },
+ { "unl_malisb", UNL_MALISB },
+ { "sgpipe", BTL_SHUIGUAN },
+ { "unl_whero", UNL_WORLDHERO },
+ { "unl_43272", UNL_43272 },
+ { "tf1201", UNL_TF1201 },
+ { "unl_cfight", UNL_CITYFIGHT },
+ { "nocash_nochr", NOCASH_NOCHR },
+ { "nes_action53", BTL_ACTION53 },
+ { "nes_2a03pur", BTL_2A03_PURITANS },
+ { "ffe3", FFE3_BOARD },
+ { "ffe4", FFE4_BOARD },
+ { "ffe8", FFE8_BOARD },
+ { "8237a", UNSUPPORTED_BOARD },
+ { "ninjaryu", UNSUPPORTED_BOARD },
+ { "unl_dance", UNSUPPORTED_BOARD },
+ { "bmc_hik_kof", UNSUPPORTED_BOARD },
+ { "onebus", UNSUPPORTED_BOARD },
+ { "coolboy", UNSUPPORTED_BOARD },
+ { "btl_900218", UNSUPPORTED_BOARD }, // pirate The Lord of King, to be emulated soon
+ { "a9746", UNSUPPORTED_BOARD },
+ { "dance2k", UNSUPPORTED_BOARD },
+ { "pec586", UNSUPPORTED_BOARD },
+ { "test", TEST_BOARD },
+ { "unknown", UNKNOWN_BOARD } // a few pirate dumps uses the wrong mapper...
+};
+
+static const nes_pcb *nes_pcb_lookup( const char *slot )
+{
+ for (int i = 0; i < ARRAY_LENGTH(pcb_list); i++)
+ {
+ if (!core_stricmp(pcb_list[i].slot_opt, slot))
+ return &pcb_list[i];
+ }
+ return NULL;
+}
+
+static const nes_pcb *nes_id_lookup( int id )
+{
+ for (int i = 0; i < ARRAY_LENGTH(pcb_list); i++)
+ {
+ if (pcb_list[i].pcb_id == id)
+ return &pcb_list[i];
+ }
+ return NULL;
+}
+
+int nes_cart_slot_device::nes_get_pcb_id( const char *slot )
+{
+ const nes_pcb *pcb = nes_pcb_lookup(slot);
+
+ if (pcb == NULL)
+ fatalerror("Unimplemented PCB type %s\n", slot);
+
+ return pcb->pcb_id;
+}
+
+
+const char * nes_cart_slot_device::nes_get_slot( int pcb_id )
+{
+ const nes_pcb *pcb = nes_id_lookup(pcb_id);
+
+ if (pcb == NULL)
+ fatalerror("Unimplemented PCB ID %d\n", pcb_id);
+
+ return pcb->slot_opt;
+}
+
+
+/*************************************************************
+
+ nes_pcb_reset
+
+ Resets the mmc bankswitch areas to their defaults.
+ It returns a value "err" that indicates if it was
+ successful. Possible values for err are:
+
+ 0 = success
+ 1 = no pcb found
+ 2 = pcb not supported
+
+ *************************************************************/
+
+struct nes_cart_lines
+{
+ const char *tag;
+ int line;
+};
+
+static const struct nes_cart_lines nes_cart_lines_table[] =
+{
+ { "PRG A0", 0 },
+ { "PRG A1", 1 },
+ { "PRG A2", 2 },
+ { "PRG A3", 3 },
+ { "PRG A4", 4 },
+ { "PRG A5", 5 },
+ { "PRG A6", 6 },
+ { "PRG A7", 7 },
+ { "CHR A10", 10 },
+ { "CHR A11", 11 },
+ { "CHR A12", 12 },
+ { "CHR A13", 13 },
+ { "CHR A14", 14 },
+ { "CHR A15", 15 },
+ { "CHR A16", 16 },
+ { "CHR A17", 17 },
+ { "NC", 127 },
+ { 0 }
+};
+
+static int nes_cart_get_line( const char *feature )
+{
+ const struct nes_cart_lines *nes_line = &nes_cart_lines_table[0];
+
+ if (feature == NULL)
+ return 128;
+
+ while (nes_line->tag)
+ {
+ if (strcmp(nes_line->tag, feature) == 0)
+ break;
+
+ nes_line++;
+ }
+
+ return nes_line->line;
+}
+
+void nes_cart_slot_device::call_load_pcb()
+{
+ UINT32 vram_size = 0, prgram_size = 0, battery_size = 0, mapper_sram_size = 0;
+ // SETUP step 1: getting PRG, VROM, VRAM sizes
+ UINT32 prg_size = get_software_region_length("prg");
+ UINT32 vrom_size = get_software_region_length("chr");
+ vram_size = get_software_region_length("vram");
+ vram_size += get_software_region_length("vram2");
+
+ // validate the xml fields
+ if (!prg_size)
+ fatalerror("No PRG entry for this software! Please check if the xml list got corrupted\n");
+ if (prg_size < 0x8000)
+ fatalerror("PRG entry is too small! Please check if the xml list got corrupted\n");
+
+ // SETUP step 2: getting PCB and other settings
+ if (get_feature("slot"))
+ m_pcb_id = nes_get_pcb_id(get_feature("slot"));
+ else
+ m_pcb_id = NO_BOARD;
+
+ // SETUP step 3: storing the info needed for emulation
+ if (get_software_region("bwram") != NULL)
+ battery_size = get_software_region_length("bwram");
+
+ if (get_software_region("wram") != NULL)
+ prgram_size = get_software_region_length("wram");
+
+ if (get_feature("mirroring"))
+ {
+ const char *mirroring = get_feature("mirroring");
+ if (!strcmp(mirroring, "horizontal"))
+ m_cart->set_mirroring(PPU_MIRROR_HORZ);
+ if (!strcmp(mirroring, "vertical"))
+ m_cart->set_mirroring(PPU_MIRROR_VERT);
+ if (!strcmp(mirroring, "high"))
+ m_cart->set_mirroring(PPU_MIRROR_HIGH);
+ if (!strcmp(mirroring, "low"))
+ m_cart->set_mirroring(PPU_MIRROR_LOW);
+ if (!strcmp(mirroring, "4screen"))
+ {
+ // A few boards uses 4-screen mirroring: Gauntlet (DDROM or TRR1ROM or Tengen 800004),
+ // Rad Racer II (TVROM), and Napoleon Senki (IREM LROG017 with 74*161/161/21/138)
+ m_cart->set_four_screen_vram(TRUE);
+ m_cart->set_mirroring(PPU_MIRROR_4SCREEN);
+ }
+ if (!strcmp(mirroring, "pcb_controlled"))
+ {
+ // A few boards have variants with hardcoded mirroring and variants with mapper
+ // controlled mirroring. We use a variable to avoid the need of dupe devices.
+ // See e.g. HES 6-in-1 vs other HES games, Irem Major League vs other G-101 games,
+ // Sunsoft-2 Shanghai vs Mito Koumon, Camerica BF9093 games vs BF9097 games, etc.
+ // Boards where all games control mirroring do not make real use of this.
+ m_cart->set_pcb_ctrl_mirror(TRUE);
+ }
+ }
+
+ /* Check for pins in specific boards which require them */
+ if (m_pcb_id == STD_CNROM)
+ {
+ int mask = 0, state = 0;
+
+ if (get_feature("chr-pin26") != NULL)
+ {
+ mask |= 0x01;
+ state |= !strcmp(get_feature("chr-pin26"), "CE") ? 0x01 : 0;
+ }
+ if (get_feature("chr-pin27") != NULL)
+ {
+ mask |= 0x02;
+ state |= !strcmp(get_feature("chr-pin27"), "CE") ? 0x02 : 0;
+ }
+
+ m_cart->set_ce(mask, state);
+ }
+
+ if (m_pcb_id == TAITO_X1_005 && get_feature("x1-pin17") != NULL && get_feature("x1-pin31") != NULL)
+ {
+ if (!strcmp(get_feature("x1-pin17"), "CIRAM A10") && !strcmp(get_feature("x1-pin31"), "NC"))
+ m_cart->set_x1_005_alt(TRUE);
+ }
+
+ if (m_pcb_id == KONAMI_VRC2)
+ {
+ m_cart->set_vrc_lines(nes_cart_get_line(get_feature("vrc2-pin3")),
+ nes_cart_get_line(get_feature("vrc2-pin4")),
+ (nes_cart_get_line(get_feature("vrc2-pin21")) != 10) ? 1 : 0);
+// osd_printf_error("VRC-2, pin3: A%d, pin4: A%d, pin21: %d\n", nes_cart_get_line(get_feature("vrc2-pin3")), nes_cart_get_line(get_feature("vrc2-pin4")),
+// nes_cart_get_line(get_feature("vrc2-pin21")));
+ }
+
+ if (m_pcb_id == KONAMI_VRC4)
+ {
+ m_cart->set_vrc_lines(nes_cart_get_line(get_feature("vrc4-pin3")),
+ nes_cart_get_line(get_feature("vrc4-pin4")),
+ 0);
+// osd_printf_error("VRC-4, pin3: A%d, pin4: A%d\n", nes_cart_get_line(get_feature("vrc4-pin3"), nes_cart_get_line(get_feature("vrc4-pin4"));
+ }
+
+ if (m_pcb_id == KONAMI_VRC6)
+ {
+ m_cart->set_vrc_lines(nes_cart_get_line(get_feature("vrc6-pin9")),
+ nes_cart_get_line(get_feature("vrc6-pin10")),
+ 0);
+// osd_printf_error("VRC-6, pin9: A%d, pin10: A%d\n", nes_cart_get_line(get_feature("vrc6-pin9"), nes_cart_get_line(get_feature("vrc6-pin10"));
+ }
+
+ if (m_pcb_id == STD_HKROM || m_pcb_id == TAITO_X1_017)
+ mapper_sram_size = m_cart->get_mapper_sram_size();
+
+ if (m_pcb_id == TAITO_X1_005 || m_pcb_id == NAMCOT_163)
+ {
+ if (get_feature("batt"))
+ mapper_sram_size = m_cart->get_mapper_sram_size();
+ }
+
+
+ // pirate variants of boards with bus conflict are often not suffering from it
+ // and actually games glitch if bus conflict is emulated...
+ if (get_feature("bus_conflict") && !strcmp(get_feature("bus_conflict"), "no"))
+ m_cart->set_bus_conflict(FALSE);
+
+
+ // SETUP step 4: logging what we have found
+ logerror("Loaded game from softlist:\n");
+ logerror("-- PCB: %s", get_feature("pcb"));
+ if (m_pcb_id == UNSUPPORTED_BOARD)
+ logerror(" (currently not supported by MESS)");
+ logerror("\n-- PRG 0x%x (%d x 16k chunks)\n", prg_size, prg_size / 0x4000);
+ logerror("-- VROM 0x%x (%d x 8k chunks)\n", vrom_size, vrom_size / 0x2000);
+ logerror("-- VRAM 0x%x (%d x 8k chunks)\n", vram_size, vram_size / 0x2000);
+ logerror("-- PRG NVWRAM: %d\n", battery_size + mapper_sram_size);
+ logerror("-- PRG WRAM: %d\n", prgram_size);
+
+ // SETUP steps 5/6: allocate pointers for PRG/VROM and load the data!
+ m_cart->prg_alloc(prg_size, tag());
+ memcpy(m_cart->get_prg_base(), get_software_region("prg"), prg_size);
+ if (vrom_size)
+ {
+ m_cart->vrom_alloc(vrom_size, tag());
+ memcpy(m_cart->get_vrom_base(), get_software_region("chr"), vrom_size);
+ }
+
+ // SETUP steps 7: allocate the remaining pointer, when needed
+ if (vram_size)
+ m_cart->vram_alloc(vram_size);
+ if (prgram_size)
+ m_cart->prgram_alloc(prgram_size);
+
+ // also nes_smb2j_device needs WRAM initialized to 0xff? check!
+ if (m_pcb_id == UNL_SMB2J)
+ memset(m_cart->get_prgram_base(), 0xff, prgram_size);
+
+ // Attempt to load a battery file for this ROM
+ // A few boards have internal RAM with a battery (MMC6, Taito X1-005 & X1-017, etc.)
+ if (battery_size || mapper_sram_size)
+ {
+ UINT32 tot_size = battery_size + mapper_sram_size;
+ dynamic_buffer temp_nvram(tot_size);
+
+ // some games relies on specific battery patterns to work
+ // (e.g. Silva Saga does not work with SRAM fully initialized to 0x00)
+ // and we use the info from xml here to prepare a default NVRAM
+ dynamic_buffer default_nvram(tot_size);
+ if (battery_size)
+ memcpy(&default_nvram[0], get_software_region("bwram"), battery_size);
+ if (mapper_sram_size)
+ memset(&default_nvram[battery_size], 0, mapper_sram_size);
+
+ // load battery (using default if no battery exists)
+ battery_load(&temp_nvram[0], tot_size, &default_nvram[0]);
+
+ // copy battery into PCB arrays
+ if (battery_size)
+ {
+ m_cart->battery_alloc(battery_size);
+ memcpy(m_cart->get_battery_base(), &temp_nvram[0], battery_size);
+ }
+ if (mapper_sram_size)
+ memcpy(m_cart->get_mapper_sram_base(), &temp_nvram[battery_size], mapper_sram_size);
+ }
+}