Merge pull request #274 from retro-wertz/mappers

Add m114.1(boogerman), m281, bmc-80013b. Update m205. Disable kt-008 …
This commit is contained in:
hizzlekizzle
2019-06-12 22:44:24 -05:00
committed by GitHub
8 changed files with 288 additions and 71 deletions

View File

@@ -3,6 +3,7 @@
* Copyright notice for this file:
* Copyright (C) 2002 Xodnizel
* Copyright (C) 2005 CaH4e3
* Copyright (C) 2019 Libretro Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -25,10 +26,12 @@
/* Mapper 090 is simpliest mapper hardware and have not extended nametable control and latched chr banks in 4k mode
* Mapper 209 much compicated hardware with decribed above features disabled by default and switchable by command
* Mapper 211 the same mapper 209 but with forced nametable control
* Mapper 281 PRG ($8000-$8FFF) and CHR ($9000-$AFFF) bank select register bits that select 256 KiB banks are masked off.
*/
static int is209;
static int is211;
static int is281;
static uint8 IRQMode; /* from $c001 */
static uint8 IRQPre; /* from $c004 */
@@ -73,7 +76,7 @@ static SFORMAT Tek_StateRegs[] = {
};
static void mira(void) {
if ((tkcom[0] & 0x20 && is209) || is211) {
if (((tkcom[0] & 0x20) && is209) || is211 || ((tkcom[1] & 0x08) && is281)) {
int x;
if (tkcom[0] & 0x40) { /* Name tables are ROM-only */
for (x = 0; x < 4; x++)
@@ -96,56 +99,64 @@ static void mira(void) {
}
}
static uint8 invertprg(uint8 bank, uint8 reverse) {
if (reverse)
return ((bank & 0x01) << 6 | (bank & 0x02) << 4 | (bank & 0x04) << 2 |
(bank & 0x10) >> 2 | (bank & 0x20) >> 4 | (bank & 0x40) >> 6);
else
return bank;
}
static void tekprom(void) {
uint32 bankmode = ((tkcom[3] & 6) << 5);
switch (tkcom[0] & 7) {
case 00:
uint8 prgshift = 0, prgmask = 0x3F, outb_sel = 0x06, last_bank = 0x3F;
uint8 prgmode = tkcom[0] & 0x03;
uint8 invert = (tkcom[0] & 0x03) == 0x03 ? 1 : 0;
uint32 bankmode = 0;
switch (tkcom[0] & 0x03) {
case 0x00: prgshift = 3; prgmask = 0x0F; break;
case 0x01: prgshift = 4; prgmask = 0x1F; break;
default: prgshift = 5; prgmask = 0x3F; break;
}
if (is281) {
prgmask >>= 1;
outb_sel = 0x01;
}
bankmode = ((tkcom[3] & outb_sel) << prgshift);
last_bank = (tkcom[0] & 0x04) ? prgb[3] : prgmask;
switch (prgmode) {
case 0x00:
if (tkcom[0] & 0x80)
setprg8(0x6000, (((prgb[3] << 2) + 3) & 0x3F) | bankmode);
setprg32(0x8000, 0x0F | ((tkcom[3] & 6) << 3));
setprg32(0x8000, last_bank & prgmask | bankmode);
break;
case 01:
case 0x01:
if (tkcom[0] & 0x80)
setprg8(0x6000, (((prgb[3] << 1) + 1) & 0x3F) | bankmode);
setprg16(0x8000, (prgb[1] & 0x1F) | ((tkcom[3] & 6) << 4));
setprg16(0xC000, 0x1F | ((tkcom[3] & 6) << 4));
setprg16(0x8000, (prgb[1] & prgmask) | bankmode);
setprg16(0xC000, last_bank & prgmask | bankmode);
break;
case 03: /* bit reversion */
case 02:
case 0x02:
case 0x03:
if (tkcom[0] & 0x80)
setprg8(0x6000, (prgb[3] & 0x3F) | bankmode);
setprg8(0x8000, (prgb[0] & 0x3F) | bankmode);
setprg8(0xa000, (prgb[1] & 0x3F) | bankmode);
setprg8(0xc000, (prgb[2] & 0x3F) | bankmode);
setprg8(0xe000, 0x3F | bankmode);
break;
case 04:
if (tkcom[0] & 0x80)
setprg8(0x6000, (((prgb[3] << 2) + 3) & 0x3F) | bankmode);
setprg32(0x8000, (prgb[3] & 0x0F) | ((tkcom[3] & 6) << 3));
break;
case 05:
if (tkcom[0] & 0x80)
setprg8(0x6000, (((prgb[3] << 1) + 1) & 0x3F) | bankmode);
setprg16(0x8000, (prgb[1] & 0x1F) | ((tkcom[3] & 6) << 4));
setprg16(0xC000, (prgb[3] & 0x1F) | ((tkcom[3] & 6) << 4));
break;
case 07: /* bit reversion */
case 06:
if (tkcom[0] & 0x80)
setprg8(0x6000, (prgb[3] & 0x3F) | bankmode);
setprg8(0x8000, (prgb[0] & 0x3F) | bankmode);
setprg8(0xa000, (prgb[1] & 0x3F) | bankmode);
setprg8(0xc000, (prgb[2] & 0x3F) | bankmode);
setprg8(0xe000, (prgb[3] & 0x3F) | bankmode);
setprg8(0x6000, (invertprg(prgb[3], invert) & 0x3F) | bankmode);
setprg8(0x8000, (invertprg(prgb[0], invert) & prgmask) | bankmode);
setprg8(0xa000, (invertprg(prgb[1], invert) & prgmask) | bankmode);
setprg8(0xc000, (invertprg(prgb[2], invert) & prgmask) | bankmode);
setprg8(0xe000, (invertprg(last_bank, invert) & prgmask) | bankmode);
break;
}
}
static void tekvrom(void) {
int x, bank = 0, mask = 0xFFFF;
if (!(tkcom[3] & 0x20)) {
bank = (tkcom[3] & 1) | ((tkcom[3] & 0x18) >> 2);
if (!(tkcom[3] & 0x20) || is281) {
if (is281)
bank = tkcom[3] & 1;
else
bank = (tkcom[3] & 1) | ((tkcom[3] & 0x18) >> 2);
switch (tkcom[0] & 0x18) {
case 0x00: bank <<= 5; mask = 0x1F; break;
case 0x08: bank <<= 6; mask = 0x3F; break;
@@ -445,6 +456,7 @@ static void M90Power(void) {
void Mapper90_Init(CartInfo *info) {
is211 = 0;
is209 = 0;
is281 = 0;
info->Reset = togglie;
info->Power = M90Power;
PPU_hook = M90PPU;
@@ -457,6 +469,7 @@ void Mapper90_Init(CartInfo *info) {
void Mapper209_Init(CartInfo *info) {
is211 = 0;
is209 = 1;
is281 = 0;
info->Reset = togglie;
info->Power = M90Power;
PPU_hook = M90PPU;
@@ -468,6 +481,20 @@ void Mapper209_Init(CartInfo *info) {
void Mapper211_Init(CartInfo *info) {
is211 = 1;
is281 = 0;
info->Reset = togglie;
info->Power = M90Power;
PPU_hook = M90PPU;
MapIRQHook = CPUWrap;
GameHBIRQHook2 = SLWrap;
GameStateRestore = M90Restore;
AddExState(Tek_StateRegs, ~0, 0, 0);
}
void Mapper281_Init(CartInfo *info) {
is211 = 0;
is209 = 0;
is281 = 1;
info->Reset = togglie;
info->Power = M90Power;
PPU_hook = M90PPU;

77
src/boards/bmc80013b.c Normal file
View File

@@ -0,0 +1,77 @@
/* FCEUmm - NES/Famicom Emulator
*
* Copyright (C) 2019 Libretro Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/* NES 2.0 Mapper 274 is used for the 90-in-1 Hwang Shinwei multicart.
* Its UNIF board name is BMC-80013-B.
* https://wiki.nesdev.com/w/index.php/NES_2.0_Mapper_274 */
#include "mapinc.h"
static uint8 regs[2], mode;
static SFORMAT StateRegs[] =
{
{ &regs[0], 1, "REG0" },
{ &regs[1], 1, "REG1" },
{ &mode, 1, "MODE" },
{ 0 }
};
static void Sync(void) {
if (mode & 0x02)
setprg16(0x8000, regs[0] & 0x0F | regs[1] & 0x70);
else
setprg16r(1, 0x8000, regs[0] & 0x03);
setprg16(0xC000, regs[1]);
SetupCartMirroring(((regs[0] >> 4) & 1) ^ 1, 1, NULL);
}
static DECLFW(BMC80013BWrite) {
uint8 reg = (A >> 13) & 0x03;
if (!reg)
regs[0] = V & 0x1F;
else {
regs[1] = V & 0x7F;
mode = reg;
}
Sync();
}
static void BMC80013BPower(void) {
Sync();
setchr8(0);
SetReadHandler(0x8000, 0xFFFF, CartBR);
SetWriteHandler(0x8000, 0xFFFF, BMC80013BWrite);
}
static void BMC80013BReset(void) {
regs[0] = regs[1] = mode = 0;
Sync();
}
static void BMC80013BRestore(int version) {
Sync();
}
void BMC80013B_Init(CartInfo *info) {
info->Power = BMC80013BPower;
info->Reset = BMC80013BReset;
GameStateRestore = BMC80013BRestore;
AddExState(&StateRegs, ~0, 0, 0);
}

View File

@@ -236,8 +236,9 @@ static void GENPWRAP(uint32 A, uint8 V) {
/* [NJ102] Mo Dao Jie (C) has 1024Mb MMC3 BOARD, maybe something other will be broken
* also HengGe BBC-2x boards enables this mode as default board mode at boot up
*/
setprg8(A, (V & 0x7F) | ((kt_extra & 4) << 4));
setprg8(A, (V & 0x7F)/* | ((kt_extra & 4) << 4)*/);
/* KT-008 boards hack 2-in-1, TODO assign to new ines mapper, most dump of KT-boards on the net are mapper 4, so need database or goodnes fix support */
/* KT-008 boards should be assigned to mapper 224 */
}
static void GENMWRAP(uint8 V) {
@@ -265,7 +266,7 @@ void GenMMC3Power(void) {
SetReadHandler(0x8000, 0xFFFF, CartBR);
/* KT-008 boards hack 2-in-1, TODO assign to new ines mapper, most dump of KT-boards on the net are mapper 4, so need database or goodnes fix support */
SetWriteHandler(0x5000,0x5FFF, KT008HackWrite);
/* SetWriteHandler(0x5000,0x5FFF, KT008HackWrite); */ /* KT-008 boards should be assigned to mapper 224 */
A001B = A000B = 0;
setmirror(1);
@@ -321,6 +322,7 @@ void GenMMC3_Init(CartInfo *info, int prg, int chr, int wram, int battery) {
}
/* KT-008 boards hack 2-in-1, TODO assign to new ines mapper, most dump of KT-boards on the net are mapper 4, so need database or goodnes fix support */
/* KT-008 boards should be assigned to mapper 224 */
AddExState(&kt_extra, 1, 0, "KTEX");
AddExState(MMC3_StateRegs, ~0, 0, 0);
@@ -720,18 +722,24 @@ void Mapper74_Init(CartInfo *info) {
/* ---------------------------- Mapper 114 ------------------------------ */
static uint8 cmdin;
static uint8 cmdin, type_Boogerman = 0;
uint8 boogerman_perm[8] = { 0, 2, 5, 3, 6, 1, 7, 4 };
uint8 m114_perm[8] = { 0, 3, 1, 5, 6, 7, 2, 4 };
static void M114PWRAP(uint32 A, uint8 V) {
if (EXPREGS[0] & 0x80) {
/* FCEU_printf("8000-C000:%02X\n",EXPREGS[0]&0xF); */
setprg16(0x8000, EXPREGS[0] & 0xF);
setprg16(0xC000, EXPREGS[0] & 0xF);
} else {
/* FCEU_printf("%04X:%02X\n",A,V&0x3F); */
setprg8(A, V & 0x3F);
}
if (EXPREGS[0] & 0x20)
setprg32(0x8000, (EXPREGS[0] & 0x0F) >> 1);
else {
setprg16(0x8000, (EXPREGS[0] & 0x0F));
setprg16(0xC000, (EXPREGS[0] & 0x0F));
}
} else
setprg8(A, V);
}
static void M114CWRAP(uint32 A, uint8 V) {
setchr1(A, (uint32)V | ((EXPREGS[1] & 1) << 8));
}
static DECLFW(M114Write) {
@@ -746,28 +754,52 @@ static DECLFW(M114Write) {
}
}
static DECLFW(BoogermanWrite) {
switch (A & 0xE001) {
case 0x8001: if (!cmdin) break; MMC3_CMDWrite(0x8001, V); cmdin = 0; break;
case 0xA000: MMC3_CMDWrite(0x8000, (V & 0xC0) | (boogerman_perm[V & 7])); cmdin = 1; break;
case 0xA001: IRQReload = 1; break;
case 0xC000: MMC3_CMDWrite(0xA000, V); break;
case 0xC001: IRQLatch = V; break;
case 0xE000: X6502_IRQEnd(FCEU_IQEXT); IRQa = 0; break;
case 0xE001: IRQa = 1; break;
}
}
static DECLFW(M114ExWrite) {
if (A <= 0x7FFF) {
EXPREGS[0] = V;
if (A & 1)
EXPREGS[1] = V;
else
EXPREGS[0] = V;
FixMMC3PRG(MMC3_cmd);
}
}
static void M114Power(void) {
EXPREGS[0] = EXPREGS[1] = 0;
GenMMC3Power();
SetWriteHandler(0x6000, 0x7FFF, M114ExWrite);
SetWriteHandler(0x8000, 0xFFFF, M114Write);
SetWriteHandler(0x5000, 0x7FFF, M114ExWrite);
if (type_Boogerman)
SetWriteHandler(0x8000, 0xFFFF, BoogermanWrite);
}
static void M114Reset(void) {
EXPREGS[0] = 0;
EXPREGS[0] = EXPREGS[1] = 0;
MMC3RegReset();
}
void Mapper114_Init(CartInfo *info) {
isRevB = 0;
type_Boogerman = 0;
if (info->CRC32 == 0x80eb1839 || /* Boogerman (Sugar Softec) (Unl) [!] - submapper 1 */
info->CRC32 == 0x071e4ee8) /* 114 test-rom https://forums.nesdev.com/viewtopic.php?f=3&t=17391 */
type_Boogerman = 1;
GenMMC3_Init(info, 256, 256, 0, 0);
pwrap = M114PWRAP;
cwrap = M114CWRAP;
info->Power = M114Power;
info->Reset = M114Reset;
AddExState(EXPREGS, 1, 0, "EXPR");
@@ -1137,22 +1169,21 @@ void Mapper198_Init(CartInfo *info) {
}
/* ---------------------------- Mapper 205 ------------------------------ */
/* GN-45 BOARD */
/* https://wiki.nesdev.com/w/index.php/INES_Mapper_205 */
static void M205PW(uint32 A, uint8 V) {
/* GN-30A - \ED\E0\F7\E0\EB\FC\ED\E0\FF \EC\E0\F1\EA\E0 \E4\EE\EB\E6\ED\E0 \E1\FB\F2\FC 1F + \E0\EF\EF\E0\F0\E0\F2\ED\FB\E9 \EF\E5\F0\E5\EA\EB\FE\F7\E0\F2\E5\EB\FC \ED\E0 \F8\E8\ED\E5 \E0\E4\F0\E5\F1\E0 */
setprg8(A, (V & 0x0f) | EXPREGS[0]);
setprg8(A, EXPREGS[0] & 0x30 | (V & (!(EXPREGS[0] & 0xC0) ? 0x1F : 0x0F)));
}
static void M205CW(uint32 A, uint8 V) {
/* GN-30A - \ED\E0\F7\E0\EB\FC\ED\E0\FF \EC\E0\F1\EA\E0 \E4\EE\EB\E6\ED\E0 \E1\FB\F2\FC FF */
setchr1(A, (V & 0x7F) | (EXPREGS[0] << 3));
uint16 reg = (uint16)EXPREGS[0] & 0x30;
setchr1(A, (reg << 3) | V);
}
static DECLFW(M205Write0) {
if (EXPREGS[2] == 0) {
EXPREGS[0] = A & 0x30;
EXPREGS[2] = A & 0x80;
if (EXPREGS[1] == 0) {
EXPREGS[0] = (V << 4) & 0x30;
EXPREGS[1] = A & 0x80;
FixMMC3PRG(MMC3_cmd);
FixMMC3CHR(MMC3_cmd);
} else
@@ -1160,8 +1191,8 @@ static DECLFW(M205Write0) {
}
static DECLFW(M205Write1) {
if (EXPREGS[2] == 0) {
EXPREGS[0] = V & 0x30;
if (EXPREGS[1] == 0) {
EXPREGS[0] = V & 0xF0;
FixMMC3PRG(MMC3_cmd);
FixMMC3CHR(MMC3_cmd);
} else
@@ -1169,11 +1200,12 @@ static DECLFW(M205Write1) {
}
static void M205Reset(void) {
EXPREGS[0] = EXPREGS[2] = 0;
EXPREGS[0] = EXPREGS[1] = 0;
MMC3RegReset();
}
static void M205Power(void) {
EXPREGS[0] = EXPREGS[1] = 0;
GenMMC3Power();
SetWriteHandler(0x6000, 0x6fff, M205Write0);
SetWriteHandler(0x7000, 0x7fff, M205Write1); /* OK-411 boards, the same logic, but data latched, 2-in-1 frankenstein */
@@ -1188,6 +1220,58 @@ void Mapper205_Init(CartInfo *info) {
AddExState(EXPREGS, 1, 0, "EXPR");
}
/* --------------------------- GN-45 BOARD ------------------------------ */
/* Mapper 361 and 366, previously assigned as Mapper 205 */
static void GN45PW(uint32 A, uint8 V) {
/* GN-30A - \ED\E0\F7\E0\EB\FC\ED\E0\FF \EC\E0\F1\EA\E0 \E4\EE\EB\E6\ED\E0 \E1\FB\F2\FC 1F + \E0\EF\EF\E0\F0\E0\F2\ED\FB\E9 \EF\E5\F0\E5\EA\EB\FE\F7\E0\F2\E5\EB\FC \ED\E0 \F8\E8\ED\E5 \E0\E4\F0\E5\F1\E0 */
setprg8(A, (V & 0x0f) | EXPREGS[0]);
}
static void GN45CW(uint32 A, uint8 V) {
/* GN-30A - \ED\E0\F7\E0\EB\FC\ED\E0\FF \EC\E0\F1\EA\E0 \E4\EE\EB\E6\ED\E0 \E1\FB\F2\FC FF */
setchr1(A, (V & 0x7F) | (EXPREGS[0] << 3));
}
static DECLFW(GN45Write0) {
if (EXPREGS[2] == 0) {
EXPREGS[0] = A & 0x30;
EXPREGS[2] = A & 0x80;
FixMMC3PRG(MMC3_cmd);
FixMMC3CHR(MMC3_cmd);
} else
CartBW(A, V);
}
static DECLFW(GN45Write1) {
if (EXPREGS[2] == 0) {
EXPREGS[0] = V & 0x30;
FixMMC3PRG(MMC3_cmd);
FixMMC3CHR(MMC3_cmd);
} else
CartBW(A, V);
}
static void GN45Reset(void) {
EXPREGS[0] = EXPREGS[2] = 0;
MMC3RegReset();
}
static void GN45Power(void) {
GenMMC3Power();
SetWriteHandler(0x6000, 0x6fff, GN45Write0);
SetWriteHandler(0x7000, 0x7fff, GN45Write1); /* OK-411 boards, the same logic, but data latched, 2-in-1 frankenstein */
}
void GN45_Init(CartInfo *info) {
GenMMC3_Init(info, 128, 128, 8, 0);
pwrap = GN45PW;
cwrap = GN45CW;
info->Power = GN45Power;
info->Reset = GN45Reset;
AddExState(EXPREGS, 1, 0, "EXPR");
}
/* ---------------------------- Mapper 245 ------------------------------ */
static void M245CW(uint32 A, uint8 V) {

View File

@@ -167,7 +167,7 @@
{0x0d98db53, 114, -1}, /* Pocahontas */
{0x4e7729ff, 114, -1}, /* Super Donkey Kong */
{0xc5e5c5b2, 115, -1}, /* Bao Qing Tian (As).nes */
{0xa1dc16c0, 116, -1}, /* Street Heroes (Sachen) [b1] */
/* {0xa1dc16c0, 116, -1}, Street Heroes (Sachen) [b1] */
{0xe40dfb7e, 116, -1}, /* Somari (P conf.) */
{0xc9371ebb, 116, -1}, /* Somari (W conf.) */
{0x78b657ac, 118, -1}, /* Armadillo */
@@ -322,7 +322,6 @@
{0x4d735cb1, 224, 0}, /* Pokemon Platinum (KT-008 PCB)(Ch)[!] */
{0x4f427110, 224, 0}, /* Pokemon Platinum Alt title 1 (KT-008 PCB)(Ch)[!] */
{0xe001de16, 224, 0}, /* Pokemon Platinum Alt title 2 (KT-008 PCB)(Ch)[!] */
{0xbdbe3c96, 238, 1}, /* Contra Fighter (Unl) */
{0xcfe02ada, 1, -1}, /* Darkman (E) [!] */
{0xcb53c523, 1, -1}, /* King Neptune's Adventure (Color Dreams) [!] */
@@ -338,6 +337,25 @@
{0x99748230, 215, 0}, /* EarthWorm Jim 2 (SuperGame) */
{0x37876ac7, 215, 0}, /* Golden Card 6-in-1 (Unl) [!] */
{0x1a3320a3, 215, 0}, /* Mortal Kombat 3 (SuperGame) */
{0x80eb1839, 114, 0}, /* Boogerman (Sugar Softec) (Unl) [!] */
{0x071e4ee8, 114, 0}, /* m114,submapper 1 test rom */
{0xfe3e03a1, 197, -1}, /* Mortal Kombat III Special (YY-030) (Ch) [!] */
{0x9151d311, 197, -1}, /* Mortal Kombat III 28 Peoples (NT-328) (Ch) [!] */
{0xf6bd8e31, 281, 0}, /* 1997 Super HIK 4-in-1 (JY-052) [p1][!] */
/* ines mappers that uses iNes 2.0 numbers */
{0x5aa23a15, 361, 0}, /* 4-in-1 (OK-411)[p1][!] */
{0xf6b9d088, 366, 0}, /* 4-in-1 (K-3131GS, GN-45) [p1][!] */
{0x503566b2, 366, 0}, /* 4-in-1 (K-3131SS, GN-45) [p1][!] */
/* ines mappers that uses unif boards */
{0x0073dbd8, 260, -1}, /* 2-in-1 - Mortal Kombat V Turbo 30 + Super Aladdin (Unl) [p1][!] */
{0x4dc6107d, 260, -1}, /* 2-in-1 - Boogerman + Flintstones, The (Unl) [p1][!] */
{0xb72b2cf4, 260, -1}, /* 2-in-1 - Aladdin + Lion King, The (Unl) [p1][!] */
{0xa1dc16c0, 262, -1}, /* Street Heroes (Asia) (Ja) (Unl */
{0xf956fcea, 521, -1}, /* Korean Igo (Korea) (Unl) */
{0x00000000, -1, -1}

View File

@@ -295,8 +295,8 @@ static void CheckHInfo(void) {
};
int32 tofix = 0, x;
uint64 partialmd5 = 0;
int current_mapper = 0;
int cur_mirr = 0;
int32 current_mapper = 0;
int32 cur_mirr = 0;
for (x = 0; x < 8; x++)
partialmd5 |= (uint64)iNESCart.MD5[15 - x] << (x * 8);
@@ -312,10 +312,10 @@ static void CheckHInfo(void) {
VROM = NULL;
tofix |= 8;
}
if (MapperNo != (moo[x].mapper & 0xFF)) {
if (MapperNo != (moo[x].mapper & 0xFFF)) {
tofix |= 1;
current_mapper = MapperNo;
MapperNo = moo[x].mapper & 0xFF;
MapperNo = moo[x].mapper & 0xFFF;
}
}
if (moo[x].mirror >= 0) {
@@ -598,7 +598,7 @@ static BMAPPINGLocal bmap[] = {
{(uint8_t*)"", 202, Mapper202_Init},
{(uint8_t*)"", 203, Mapper203_Init},
{(uint8_t*)"", 204, Mapper204_Init},
{(uint8_t*)"", 205, Mapper205_Init},
{(uint8_t*)"BMC 15-in-1/3-in-1", 205, Mapper205_Init},
{(uint8_t*)"NAMCOT 108 Rev. C", 206, Mapper206_Init}, /* Deprecated, Used to be "DEIROM" whatever it means, but actually simple version of MMC3 */
{(uint8_t*)"TAITO X1-005 Rev. B", 207, Mapper207_Init},
{(uint8_t*)"", 208, Mapper208_Init},
@@ -650,6 +650,13 @@ static BMAPPINGLocal bmap[] = {
{(uint8_t*)"", 254, Mapper254_Init},
{(uint8_t*)"", 255, Mapper255_Init}, /* Duplicate of M225? */
{(uint8_t*)"BMC-HPxx", 260, BMCHPxx_Init},
{(uint8_t*)"UNL-SHERO", 262, UNLSHeroes_Init},
{(uint8_t*)"OK-411", 361, GN45_Init}, /* OK-411 is emulated together with GN-45 */
{(uint8_t*)"HUMMER/JY-052", 281, Mapper281_Init},
{(uint8_t*)"GN-45", 366, GN45_Init},
{(uint8_t*)"DREAMTECH01", 521, DreamTech01_Init},
{(uint8_t*)"", 0, NULL}
};

View File

@@ -229,4 +229,7 @@ void Mapper253_Init(CartInfo *);
void Mapper254_Init(CartInfo *);
void Mapper255_Init(CartInfo *);
void GN45_Init(CartInfo *info); /* m361, m366 */
void Mapper281_Init(CartInfo *);
#endif

View File

@@ -467,10 +467,11 @@ static BMAPPING bmap[] = {
{ "60311C", BMC60311C_Init, 0 },
{ "WS", BMCWS_Init, 0 },
{ "HPxx", BMCHPxx_Init, 0 },
{ "HP2018-A", BMCHPxx_Init, 0 },
{ "CHINA_ER_SAN2", Mapper19_Init, 0 }, /* http://forums.nesdev.com/viewtopic.php?t=16465&p=216531 */
{ "WAIXING-FW01", Mapper227_Init, 0 }, /* https://wiki.nesdev.com/w/index.php/Talk:INES_Mapper_242 */
{ "WAIXING-FS005", BMCFK23C_Init, 0 }, /* https://wiki.nesdev.com/w/index.php/INES_Mapper_176 */
{ "80013-B", BMC80013B_Init, 0 },
#ifdef COPYFAMI
{ "COPYFAMI_MMC3", MapperCopyFamiMMC3_Init, 0 },
@@ -555,7 +556,7 @@ static int InitializeBoard(void) {
}
x++;
}
FCEU_PrintError("Board type not supported.");
FCEU_PrintError("Board type not supported.", boardname);
return(0);
}
@@ -617,7 +618,6 @@ int UNIFLoad(const char *name, FCEUFILE *fp) {
aborto:
FCEU_printf(" Failed to initialize board %s\n", boardname);
FreeUNIF();
ResetUNIF();
return 0;

View File

@@ -157,6 +157,7 @@ void BMCF15_Init(CartInfo *info);
void UNLRT01_Init(CartInfo *info);
void BMC810131C_Init(CartInfo *info);
void BMC8IN1_Init(CartInfo *info);
void BMC80013B_Init(CartInfo *info);
/* additional boards */
void BMC60311C_Init(CartInfo *info); /* m289 */