Add m114.1(boogerman), m281, bmc-80013b. Update m205. Disable kt-008 hack on mmc3. Add a few games to ines-correct.h

- Support for Boogerman (SuperGame) Mapper 114, submapper 1
- Update Mapper 205 based on nesdev, move previous mapper 205 to separate GN-45 mapper with retained support to emulate OK-411
- Use nes-to-unif wrapper for some games which does not have nes 2.0 header.
- add unif board BMC-80013-B
- add mapper 281 (JY-052)
- disable KT-008 hack on mmc3. KT-008 boards should be assigned as Mapper 224. Fixes Final Fantasy X1/X2
- force-assign a few roms using ines-correct.h
This commit is contained in:
retro-wertz
2019-06-11 22:10:39 +08:00
parent e083f098e0
commit 67ae7663b8
8 changed files with 288 additions and 71 deletions

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) {