@@ -26,6 +26,7 @@
|
|||||||
static uint16 latche;
|
static uint16 latche;
|
||||||
static uint8 dipswitch;
|
static uint8 dipswitch;
|
||||||
static uint8 isKN35A;
|
static uint8 isKN35A;
|
||||||
|
static uint8 is4K1;
|
||||||
|
|
||||||
static SFORMAT StateRegs[] = {
|
static SFORMAT StateRegs[] = {
|
||||||
{ &latche, 2 | FCEUSTATE_RLSB, "LATC" },
|
{ &latche, 2 | FCEUSTATE_RLSB, "LATC" },
|
||||||
@@ -50,13 +51,13 @@ static void Sync(void)
|
|||||||
setprg16(0x8000, latche >> 2);
|
setprg16(0x8000, latche >> 2);
|
||||||
setprg16(0xC000, (latche >> 2) | 7 | (isKN35A && latche &0x100? 8: 0));
|
setprg16(0xC000, (latche >> 2) | 7 | (isKN35A && latche &0x100? 8: 0));
|
||||||
}
|
}
|
||||||
setmirror(((latche >> 1) & 1) ^ 1);
|
setmirror(latche &(is4K1? 0x040: 0x002)? MI_H: MI_V);
|
||||||
}
|
}
|
||||||
|
|
||||||
static DECLFR(M380Read)
|
static DECLFR(M380Read)
|
||||||
{
|
{
|
||||||
if (latche & 0x100 && !isKN35A)
|
if (latche & 0x100 && !isKN35A)
|
||||||
return dipswitch;
|
return CartBR(A | dipswitch);
|
||||||
return CartBR(A);
|
return CartBR(A);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,6 +92,7 @@ static void StateRestore(int version)
|
|||||||
void Mapper380_Init(CartInfo *info)
|
void Mapper380_Init(CartInfo *info)
|
||||||
{
|
{
|
||||||
isKN35A = info->iNES2 && info->submapper == 1;
|
isKN35A = info->iNES2 && info->submapper == 1;
|
||||||
|
is4K1 = info->iNES2 && info->submapper == 2;
|
||||||
info->Power = M380Power;
|
info->Power = M380Power;
|
||||||
info->Reset = M380Reset;
|
info->Reset = M380Reset;
|
||||||
GameStateRestore = StateRestore;
|
GameStateRestore = StateRestore;
|
||||||
|
|||||||
@@ -23,12 +23,14 @@
|
|||||||
static uint16 latchAddr;
|
static uint16 latchAddr;
|
||||||
static uint8 latchData;
|
static uint8 latchData;
|
||||||
static uint8 dipswitch;
|
static uint8 dipswitch;
|
||||||
|
static uint8 dipselect;
|
||||||
|
|
||||||
static SFORMAT StateRegs[] =
|
static SFORMAT StateRegs[] =
|
||||||
{
|
{
|
||||||
{ &latchAddr, 2, "ADDR" },
|
{ &latchAddr, 2, "ADDR" },
|
||||||
{ &latchData, 1, "DATA" },
|
{ &latchData, 1, "DATA" },
|
||||||
{ &latchData, 1, "DIPS" },
|
{ &latchData, 1, "DIPS" },
|
||||||
|
{ &dipselect, 1, "DSEL" },
|
||||||
{ 0 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -58,12 +60,20 @@ static void Mapper449_Sync(void)
|
|||||||
|
|
||||||
static DECLFR(Mapper449_Read)
|
static DECLFR(Mapper449_Read)
|
||||||
{
|
{
|
||||||
|
if (dipselect)
|
||||||
|
return dipswitch &0x3;
|
||||||
|
else
|
||||||
if (latchAddr &0x200)
|
if (latchAddr &0x200)
|
||||||
return CartBR(A | dipswitch);
|
return CartBR(A | dipswitch &0xF);
|
||||||
else
|
else
|
||||||
return CartBR(A);
|
return CartBR(A);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static DECLFW(Mapper449_WriteDIPSelect)
|
||||||
|
{
|
||||||
|
dipselect =V &1;
|
||||||
|
}
|
||||||
|
|
||||||
static DECLFW(Mapper449_WriteLatch)
|
static DECLFW(Mapper449_WriteLatch)
|
||||||
{
|
{
|
||||||
latchData =V;
|
latchData =V;
|
||||||
@@ -73,15 +83,16 @@ static DECLFW(Mapper449_WriteLatch)
|
|||||||
|
|
||||||
static void Mapper449_Reset(void)
|
static void Mapper449_Reset(void)
|
||||||
{
|
{
|
||||||
dipswitch =(dipswitch +1) &0xF;
|
dipswitch++;
|
||||||
latchAddr =latchData =0;
|
latchAddr =latchData =0;
|
||||||
Mapper449_Sync();
|
Mapper449_Sync();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Mapper449_Power(void)
|
static void Mapper449_Power(void)
|
||||||
{
|
{
|
||||||
dipswitch =latchAddr =latchData =0;
|
dipselect =dipswitch =latchAddr =latchData =0;
|
||||||
Mapper449_Sync();
|
Mapper449_Sync();
|
||||||
|
SetWriteHandler(0x6000, 0x7FFF, Mapper449_WriteDIPSelect);
|
||||||
SetWriteHandler(0x8000, 0xFFFF, Mapper449_WriteLatch);
|
SetWriteHandler(0x8000, 0xFFFF, Mapper449_WriteLatch);
|
||||||
SetReadHandler(0x6000, 0x7FFF, CartBR);
|
SetReadHandler(0x6000, 0x7FFF, CartBR);
|
||||||
SetReadHandler(0x8000, 0xFFFF, Mapper449_Read);
|
SetReadHandler(0x8000, 0xFFFF, Mapper449_Read);
|
||||||
|
|||||||
@@ -194,33 +194,34 @@ void Mapper61_Init(CartInfo *info) {
|
|||||||
* Mapper 63 NTDEC-Multicart
|
* Mapper 63 NTDEC-Multicart
|
||||||
* http://wiki.nesdev.com/w/index.php/INES_Mapper_063
|
* http://wiki.nesdev.com/w/index.php/INES_Mapper_063
|
||||||
* - Powerful 250-in-1
|
* - Powerful 250-in-1
|
||||||
* - Hello Kitty 255-in-1 */
|
* - Hello Kitty 255-in-1
|
||||||
|
* Submapper 1:
|
||||||
|
* - NTDEC 82-in-1 */
|
||||||
|
|
||||||
static uint16 openBus;
|
static uint16 openBus;
|
||||||
|
|
||||||
static DECLFR(M63Read) {
|
static DECLFR(M63Read) {
|
||||||
if (A < 0xC000)
|
|
||||||
if (openBus)
|
if (openBus)
|
||||||
return X.DB;
|
return X.DB;
|
||||||
return CartBR(A);
|
return CartBR(A);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void M63Sync(void) {
|
static void M63Sync(void) {
|
||||||
uint16 mode = latche & 2;
|
uint16 prg =latche >>2 &(submapper ==1? 0x7F: 0xFF);
|
||||||
uint16 prg_bank = (latche & 0x3F8) >> 1;
|
if (latche &2)
|
||||||
uint16 prg16 = (latche & 4) >> 1;
|
setprg32(0x8000, prg >>1);
|
||||||
|
else {
|
||||||
openBus = ((latche & 0x300) == 0x300);
|
setprg16(0x8000, prg);
|
||||||
setprg8(0x8000, (prg_bank | (mode ? 0 : prg16 | 0)));
|
setprg16(0xC000, prg);
|
||||||
setprg8(0xA000, (prg_bank | (mode ? 1 : prg16 | 1)));
|
}
|
||||||
setprg8(0xC000, (prg_bank | (mode ? 2 : prg16 | 0)));
|
openBus =prg >=ROM_size;
|
||||||
setprg8(0xE000, ((latche & 0x800) ? ((latche & 0x7C) | ((latche & 6) ? 3 : 1)) :
|
SetupCartCHRMapping(0, CHRptr[0], 0x2000, latche &(submapper ==1? 0x200: 0x400)? 0: 1);
|
||||||
(prg_bank | (mode ? 3 : (prg16 | 1)))));
|
|
||||||
setchr8(0);
|
setchr8(0);
|
||||||
setmirror((latche & 1) ^ 1);
|
setmirror(latche &1? MI_H: MI_V);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mapper63_Init(CartInfo *info) {
|
void Mapper63_Init(CartInfo *info) {
|
||||||
|
submapper = info->submapper;
|
||||||
Latch_Init(info, M63Sync, M63Read, 0x0000, 0x8000, 0xFFFF, 0);
|
Latch_Init(info, M63Sync, M63Read, 0x0000, 0x8000, 0xFFFF, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -254,13 +255,14 @@ void Mapper92_Init(CartInfo *info) {
|
|||||||
/*------------------ Map 200 ---------------------------*/
|
/*------------------ Map 200 ---------------------------*/
|
||||||
|
|
||||||
static void M200Sync(void) {
|
static void M200Sync(void) {
|
||||||
setprg16(0x8000, latche & 7);
|
setprg16(0x8000, latche);
|
||||||
setprg16(0xC000, latche & 7);
|
setprg16(0xC000, latche);
|
||||||
setchr8(latche & 7);
|
setchr8(latche);
|
||||||
setmirror(((latche >> 3) & 1) ^ 1);
|
setmirror(latche &(submapper ==1? 4: 8)? MI_H: MI_V);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mapper200_Init(CartInfo *info) {
|
void Mapper200_Init(CartInfo *info) {
|
||||||
|
submapper = info->submapper;
|
||||||
Latch_Init(info, M200Sync, NULL, 0xFFFF, 0x8000, 0xFFFF, 0);
|
Latch_Init(info, M200Sync, NULL, 0xFFFF, 0x8000, 0xFFFF, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -413,9 +415,25 @@ static void M227Sync(void) {
|
|||||||
setprg8r(0x10, 0x6000, 0);
|
setprg8r(0x10, 0x6000, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static DECLFR(M227Read) {
|
||||||
|
if (latche &0x0400)
|
||||||
|
return CartBR(A | dipswitch);
|
||||||
|
else
|
||||||
|
return CartBR(A);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Mapper227_Reset(void) {
|
||||||
|
dipswitch++;
|
||||||
|
dipswitch &= 15;
|
||||||
|
latche = 0;
|
||||||
|
M227Sync();
|
||||||
|
}
|
||||||
|
|
||||||
void Mapper227_Init(CartInfo *info) {
|
void Mapper227_Init(CartInfo *info) {
|
||||||
submapper =info->submapper;
|
submapper =info->submapper;
|
||||||
Latch_Init(info, M227Sync, NULL, 0x0000, 0x8000, 0xFFFF, 1);
|
Latch_Init(info, M227Sync, M227Read, 0x0000, 0x8000, 0xFFFF, info->iNES2 && (info->PRGRamSize || info->PRGRamSaveSize) || info->battery);
|
||||||
|
info->Reset = Mapper227_Reset;
|
||||||
|
AddExState(&dipswitch, 1, 0, "DIPSW");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*------------------ Map 229 ---------------------------*/
|
/*------------------ Map 229 ---------------------------*/
|
||||||
@@ -509,9 +527,25 @@ static void M242Sync(void) {
|
|||||||
setprg8r(0x10, 0x6000, 0);
|
setprg8r(0x10, 0x6000, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static DECLFR(M242Read) {
|
||||||
|
if (latche &0x0100)
|
||||||
|
return CartBR(A | dipswitch);
|
||||||
|
else
|
||||||
|
return CartBR(A);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Mapper242_Reset(void) {
|
||||||
|
dipswitch++;
|
||||||
|
dipswitch &= 31;
|
||||||
|
latche = 0;
|
||||||
|
M242Sync();
|
||||||
|
}
|
||||||
|
|
||||||
void Mapper242_Init(CartInfo *info) {
|
void Mapper242_Init(CartInfo *info) {
|
||||||
M242TwoChips = info->PRGRomSize &0x20000 && info->PRGRomSize >0x20000;
|
M242TwoChips = info->PRGRomSize &0x20000 && info->PRGRomSize >0x20000;
|
||||||
Latch_Init(info, M242Sync, NULL, 0x0000, 0x8000, 0xFFFF, 1);
|
Latch_Init(info, M242Sync, M242Read, 0x0000, 0x8000, 0xFFFF, info->iNES2 && (info->PRGRamSize || info->PRGRamSaveSize) || info->battery);
|
||||||
|
info->Reset = Mapper242_Reset;
|
||||||
|
AddExState(&dipswitch, 1, 0, "DIPSW");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*------------------ Map 288 ---------------------------*/
|
/*------------------ Map 288 ---------------------------*/
|
||||||
@@ -745,7 +779,7 @@ static void M435Sync(void) {
|
|||||||
setprg16(0xC000, p | 7);
|
setprg16(0xC000, p | 7);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (latche &0x800)
|
if (latche &0x200)
|
||||||
SetupCartCHRMapping(0, CHRptr[0], 0x2000, 0);
|
SetupCartCHRMapping(0, CHRptr[0], 0x2000, 0);
|
||||||
else
|
else
|
||||||
SetupCartCHRMapping(0, CHRptr[0], 0x2000, 1);
|
SetupCartCHRMapping(0, CHRptr[0], 0x2000, 1);
|
||||||
|
|||||||
@@ -657,7 +657,6 @@ static void M52PW(uint32 A, uint8 V) {
|
|||||||
|
|
||||||
static void M52CW(uint32 A, uint8 V) {
|
static void M52CW(uint32 A, uint8 V) {
|
||||||
uint32 mask = 0xFF ^ ((EXPREGS[0] & 0x40) << 1);
|
uint32 mask = 0xFF ^ ((EXPREGS[0] & 0x40) << 1);
|
||||||
/* uint32 bank = (((EXPREGS[0]>>3)&4)|((EXPREGS[0]>>1)&2)|((EXPREGS[0]>>6)&(EXPREGS[0]>>4)&1))<<7; */
|
|
||||||
uint32 bank = (((EXPREGS[0] >> 4) & 2) | (EXPREGS[0] & 4) | ((EXPREGS[0] >> 6) & (EXPREGS[0] >> 4) & 1)) << 7; /* actually 256K CHR banks index bits is inverted! */
|
uint32 bank = (((EXPREGS[0] >> 4) & 2) | (EXPREGS[0] & 4) | ((EXPREGS[0] >> 6) & (EXPREGS[0] >> 4) & 1)) << 7; /* actually 256K CHR banks index bits is inverted! */
|
||||||
if (CHRRAM && (EXPREGS[0] &3) ==3)
|
if (CHRRAM && (EXPREGS[0] &3) ==3)
|
||||||
setchr1r(0x10, A, bank | (V & mask));
|
setchr1r(0x10, A, bank | (V & mask));
|
||||||
@@ -665,6 +664,15 @@ static void M52CW(uint32 A, uint8 V) {
|
|||||||
setchr1(A, bank | (V & mask));
|
setchr1(A, bank | (V & mask));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void M52S14CW(uint32 A, uint8 V) {
|
||||||
|
uint32 mask = 0xFF ^ ((EXPREGS[0] & 0x40) << 1);
|
||||||
|
uint32 bank = EXPREGS[0] <<3 &0x80 | EXPREGS[0] <<7 &0x300;
|
||||||
|
if (EXPREGS[0] &0x20)
|
||||||
|
setchr1r(0x10, A, bank | (V & mask));
|
||||||
|
else
|
||||||
|
setchr1(A, bank | (V & mask));
|
||||||
|
}
|
||||||
|
|
||||||
static DECLFW(M52Write) {
|
static DECLFW(M52Write) {
|
||||||
if (EXPREGS[1]) {
|
if (EXPREGS[1]) {
|
||||||
WRAM[A - 0x6000] = V;
|
WRAM[A - 0x6000] = V;
|
||||||
@@ -689,12 +697,13 @@ static void M52Power(void) {
|
|||||||
|
|
||||||
void Mapper52_Init(CartInfo *info) {
|
void Mapper52_Init(CartInfo *info) {
|
||||||
GenMMC3_Init(info, 256, 256, 8, info->battery);
|
GenMMC3_Init(info, 256, 256, 8, info->battery);
|
||||||
cwrap = M52CW;
|
isRevB = 0; /* For Aladdin in NT-8062 */
|
||||||
|
cwrap = info->submapper ==14? M52S14CW: M52CW;
|
||||||
pwrap = M52PW;
|
pwrap = M52PW;
|
||||||
info->Reset = M52Reset;
|
info->Reset = M52Reset;
|
||||||
info->Power = M52Power;
|
info->Power = M52Power;
|
||||||
AddExState(EXPREGS, 2, 0, "EXPR");
|
AddExState(EXPREGS, 2, 0, "EXPR");
|
||||||
if (info->iNES2 && info->submapper ==13) {
|
if (info->iNES2 && (info->submapper ==13 || info->submapper ==14)) {
|
||||||
CHRRAMSIZE = 8192;
|
CHRRAMSIZE = 8192;
|
||||||
CHRRAM = (uint8*)FCEU_gmalloc(CHRRAMSIZE);
|
CHRRAM = (uint8*)FCEU_gmalloc(CHRRAMSIZE);
|
||||||
SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSIZE, 1);
|
SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSIZE, 1);
|
||||||
@@ -1086,18 +1095,79 @@ void UNLMaliSB_Init(CartInfo *info) {
|
|||||||
|
|
||||||
/* ---------------------------- Mapper 197 ------------------------------- */
|
/* ---------------------------- Mapper 197 ------------------------------- */
|
||||||
|
|
||||||
static void M197CW(uint32 A, uint8 V) {
|
static void M197S0CW(uint32 A, uint8 V) {
|
||||||
if (A == 0x0000)
|
switch(A) {
|
||||||
setchr4(0x0000, V >> 1);
|
case 0x0000: setchr2(0x0000, V); break;
|
||||||
else if (A == 0x1000)
|
case 0x0400: setchr2(0x0800, V); break;
|
||||||
setchr2(0x1000, V);
|
case 0x1000: setchr2(0x1000, V); break;
|
||||||
else if (A == 0x1400)
|
case 0x1400: setchr2(0x1800, V); break;
|
||||||
setchr2(0x1800, V);
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void M197S1CW(uint32 A, uint8 V) {
|
||||||
|
switch(A) {
|
||||||
|
case 0x0800: setchr2(0x0000, V); break;
|
||||||
|
case 0x0C00: setchr2(0x0800, V); break;
|
||||||
|
case 0x1800: setchr2(0x1000, V); break;
|
||||||
|
case 0x1C00: setchr2(0x1800, V); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void M197S2CW(uint32 A, uint8 V) {
|
||||||
|
switch(A) {
|
||||||
|
case 0x0000: setchr2(0x0000, V); break;
|
||||||
|
case 0x0C00: setchr2(0x0800, V); break;
|
||||||
|
case 0x1000: setchr2(0x1000, V); break;
|
||||||
|
case 0x1C00: setchr2(0x1800, V); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void M197S3CW(uint32 A, uint8 V) {
|
||||||
|
switch(A) {
|
||||||
|
case 0x0000: setchr2(0x0000, V | EXPREGS[0] <<7 &0x100); break;
|
||||||
|
case 0x0400: setchr2(0x0800, V | EXPREGS[0] <<7 &0x100); break;
|
||||||
|
case 0x1000: setchr2(0x1000, V | EXPREGS[0] <<7 &0x100); break;
|
||||||
|
case 0x1400: setchr2(0x1800, V | EXPREGS[0] <<7 &0x100); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void M197S3PW(uint32 A, uint8 V) {
|
||||||
|
setprg8(A, V &(EXPREGS[0] &8? 0x0F: 0x1F) | EXPREGS[0] <<4);
|
||||||
|
}
|
||||||
|
|
||||||
|
static DECLFW(Mapper197S3Write) {
|
||||||
|
if (A001B &0x80) {
|
||||||
|
EXPREGS[0] =V;
|
||||||
|
FixMMC3PRG(MMC3_cmd);
|
||||||
|
FixMMC3CHR(MMC3_cmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Mapper197S3_Reset(void) {
|
||||||
|
EXPREGS[0] =0;
|
||||||
|
FixMMC3PRG(MMC3_cmd);
|
||||||
|
FixMMC3CHR(MMC3_cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Mapper197S3_Power(void) {
|
||||||
|
EXPREGS[0] =0;
|
||||||
|
GenMMC3Power();
|
||||||
|
SetWriteHandler(0x6000, 0x7fff, Mapper197S3Write);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mapper197_Init(CartInfo *info) {
|
void Mapper197_Init(CartInfo *info) {
|
||||||
GenMMC3_Init(info, 128, 512, 8, 0);
|
GenMMC3_Init(info, 128, 512, 8, 0);
|
||||||
cwrap = M197CW;
|
switch(info->submapper) {
|
||||||
|
case 0: cwrap =M197S0CW; break;
|
||||||
|
case 1: cwrap =M197S1CW; break;
|
||||||
|
case 2: cwrap =M197S2CW; break;
|
||||||
|
case 3: cwrap =M197S3CW;
|
||||||
|
pwrap =M197S3PW;
|
||||||
|
info->Power = Mapper197S3_Power;
|
||||||
|
info->Reset = Mapper197S3_Reset;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
AddExState(EXPREGS, 1, 0, "EXPR");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------- Mapper 198 ------------------------------- */
|
/* ---------------------------- Mapper 198 ------------------------------- */
|
||||||
|
|||||||
Reference in New Issue
Block a user