mapper 99 - fixed

UNIF SMB2J - now not support SMB2j which is proven bad dump
This commit is contained in:
CaH4e3 2012-12-03 15:26:22 +00:00
parent 6652cec0ae
commit 5ca09c31d5
6 changed files with 278 additions and 343 deletions

67
src/boards/09-034a.cpp Normal file
View File

@ -0,0 +1,67 @@
/* FCE Ultra - NES/Famicom Emulator
*
* Copyright notice for this file:
* Copyright (C) 2007 CaH4e3
*
* 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
*
* FDS Conversions
*
* Super Mario Bros 2 J alt version is a BAD incomplete dump, should be mapper 43
*
* Both Voleyball and Zanac by Whirlind Manu shares the same PCB, but with
* some differences: Voleyball has 8K CHR ROM and 8K ROM at 6000K, Zanac
* have 8K CHR RAM and banked 16K ROM mapper at 6000 as two 8K banks.
*
* PCB for this mapper is "09-034A"
*/
#include "mapinc.h"
static uint8 prg;
static SFORMAT StateRegs[] =
{
{ &prg, 1, "PRG" },
{ 0 }
};
static void Sync(void) {
setprg8r(1, 0x6000, prg);
setprg32(0x8000, 0);
setchr8(0);
}
static DECLFW(UNLSMB2JWrite) {
prg = V & 1;
Sync();
}
static void UNLSMB2JPower(void) {
prg = 0;
Sync();
SetReadHandler(0x6000, 0xFFFF, CartBR);
SetWriteHandler(0x4027, 0x4027, UNLSMB2JWrite);
}
static void StateRestore(int version) {
Sync();
}
void UNLSMB2J_Init(CartInfo *info) {
info->Power = UNLSMB2JPower;
GameStateRestore = StateRestore;
AddExState(&StateRegs, ~0, 0, 0);
}

View File

@ -1,98 +0,0 @@
/* FCE Ultra - NES/Famicom Emulator
*
* Copyright notice for this file:
* Copyright (C) 2007 CaH4e3
*
* 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
* Super Mario Bros 2 J alt version
* as well as "Voleyball" FDS conversion, bank layot is similar but no bankswitching and CHR ROM present
*
* mapper seems wrongly researched by me ;( it should be mapper 43 modification
*/
#include "mapinc.h"
static uint8 prg, IRQa;
static uint16 IRQCount;
static SFORMAT StateRegs[]=
{
{&prg, 1, "PRG"},
{&IRQa, 1, "IRQA"},
{&IRQCount, 2, "IRQC"},
{0}
};
static void Sync(void)
{
setprg4r(1,0x5000,1);
setprg8r(1,0x6000,1);
setprg32(0x8000,prg);
setchr8(0);
}
static DECLFW(UNLSMB2JWrite)
{
if(A==0x4022)
{
prg=V&1;
Sync();
}
if(A==0x4122)
{
IRQa=V;
IRQCount=0;
X6502_IRQEnd(FCEU_IQEXT);
}
}
static void UNLSMB2JPower(void)
{
prg=~0;
Sync();
SetReadHandler(0x5000,0x7FFF,CartBR);
SetReadHandler(0x8000,0xFFFF,CartBR);
SetWriteHandler(0x4020,0xffff,UNLSMB2JWrite);
}
static void UNLSMB2JReset(void)
{
prg=~0;
Sync();
}
static void UNLSMB2JIRQHook(int a)
{
if(IRQa)
{
IRQCount+=a*3;
if((IRQCount>>12)==IRQa)
X6502_IRQBegin(FCEU_IQEXT);
}
}
static void StateRestore(int version)
{
Sync();
}
void UNLSMB2J_Init(CartInfo *info)
{
info->Reset=UNLSMB2JReset;
info->Power=UNLSMB2JPower;
MapIRQHook=UNLSMB2JIRQHook;
GameStateRestore=StateRestore;
AddExState(&StateRegs, ~0, 0, 0);
}

View File

@ -756,7 +756,14 @@ void FCEU_MemoryRand(uint8 *ptr, uint32 size)
int x=0; int x=0;
while(size) while(size)
{ {
*ptr=(x&4)?0xFF:0x00; *ptr = (x & 4) ? 0xFF : 0x00; // Huang Di DEBUG MODE enabled by default
// Cybernoid NO MUSIC by default
// *ptr = (x & 4) ? 0x7F : 0x00; // Huang Di DEBUG MODE enabled by default
// Minna no Taabou no Nakayoshi Daisakusen DOESN'T BOOT
// Cybernoid NO MUSIC by default
// *ptr = (x & 1) ? 0x55 : 0xAA; // F-15 Sity War HISCORE is screwed...
// 1942 SCORE/HISCORE is screwed...
// *ptr = 0xFF; // Work for all cases
x++; x++;
size--; size--;
ptr++; ptr++;

View File

@ -34,8 +34,7 @@
#define IOPTION_SWAPDIRAB 0x2 #define IOPTION_SWAPDIRAB 0x2
#define IOPTION_PREDIP 0x10 #define IOPTION_PREDIP 0x10
typedef struct typedef struct {
{
char *name; char *name;
uint64 md5partial; uint64 md5partial;
int mapper; int mapper;
@ -50,24 +49,20 @@ VSUNIENTRY *curvs;
static uint8 DIPS = 0; static uint8 DIPS = 0;
uint8 vsdip = 0; uint8 vsdip = 0;
void FCEUI_VSUniToggleDIPView(void) void FCEUI_VSUniToggleDIPView(void) {
{
DIPS = !DIPS; DIPS = !DIPS;
} }
void FCEU_VSUniToggleDIP(int w) void FCEU_VSUniToggleDIP(int w) {
{
vsdip ^= 1 << w; vsdip ^= 1 << w;
} }
void FCEUI_VSUniSetDIP(int w, int state) void FCEUI_VSUniSetDIP(int w, int state) {
{
if (((vsdip >> w) & 1) != state) if (((vsdip >> w) & 1) != state)
FCEUI_VSUniToggleDIP(w); FCEUI_VSUniToggleDIP(w);
} }
uint8 FCEUI_VSUniGetDIPs(void) uint8 FCEUI_VSUniGetDIPs(void) {
{
return(vsdip); return(vsdip);
} }
@ -91,10 +86,8 @@ static uint8 *secptr;
static uint8 VSindex; static uint8 VSindex;
static DECLFR(VSSecRead) static DECLFR(VSSecRead) {
{ switch (A) {
switch(A)
{
case 0x5e00: VSindex = 0; return X.DB; case 0x5e00: VSindex = 0; return X.DB;
case 0x5e01: return(secptr[(VSindex++) & 0x1F]); case 0x5e01: return(secptr[(VSindex++) & 0x1F]);
} }
@ -102,8 +95,7 @@ static DECLFR(VSSecRead)
} }
uint8 coinon = 0; uint8 coinon = 0;
void FCEU_VSUniCoin(void) void FCEU_VSUniCoin(void) {
{
coinon = 6; coinon = 6;
} }
@ -123,90 +115,67 @@ static int64 curmd5;
static readfunc OldReadPPU; static readfunc OldReadPPU;
static writefunc OldWritePPU[2]; static writefunc OldWritePPU[2];
static DECLFR(A2002_Gumshoe) static DECLFR(A2002_Gumshoe) {
{
return((OldReadPPU(A) & ~0x3F) | 0x1C); return((OldReadPPU(A) & ~0x3F) | 0x1C);
} }
static DECLFR(A2002_Topgun) static DECLFR(A2002_Topgun) {
{
return((OldReadPPU(A) & ~0x3F) | 0x1B); return((OldReadPPU(A) & ~0x3F) | 0x1B);
} }
static DECLFR(A2002_MBJ) // Mighty Bomb Jack static DECLFR(A2002_MBJ) { // Mighty Bomb Jack
{
return((OldReadPPU(A) & ~0x3F) | 0x3D); return((OldReadPPU(A) & ~0x3F) | 0x3D);
} }
static DECLFW(B2000_2001_2C05) static DECLFW(B2000_2001_2C05) {
{
OldWritePPU[(A & 1) ^ 1](A ^ 1, V); OldWritePPU[(A & 1) ^ 1](A ^ 1, V);
} }
static uint8 xevselect = 0; static uint8 xevselect = 0;
static DECLFR(XevRead) static DECLFR(XevRead) {
{ if (A == 0x54FF) {
//printf("%04x\n",A);
if(A == 0x54FF)
{
return(0x5); return(0x5);
} } else if (A == 0x5678) {
else if(A == 0x5678)
{
return(xevselect ? 0 : 1); return(xevselect ? 0 : 1);
} } else if (A == 0x578F) {
else if(A == 0x578F)
{
return(xevselect ? 0xd1 : 0x89); return(xevselect ? 0xd1 : 0x89);
} } else if (A == 0x5567) {
else if(A == 0x5567)
{
xevselect ^= 1; xevselect ^= 1;
return(xevselect ? 0x37 : 0x3E); return(xevselect ? 0x37 : 0x3E);
} }
return(X.DB); return(X.DB);
} }
void FCEU_VSUniSwap(uint8 *j0, uint8 *j1) void FCEU_VSUniSwap(uint8 *j0, uint8 *j1) {
{ if (curvs->ioption & IOPTION_SWAPDIRAB) {
if(curvs->ioption & IOPTION_SWAPDIRAB)
{
uint16 t = *j0; uint16 t = *j0;
*j0 = (*j0 & 0xC) | (*j1 & 0xF3); *j0 = (*j0 & 0xC) | (*j1 & 0xF3);
*j1 = (*j1 & 0xC) | (t & 0xF3); *j1 = (*j1 & 0xC) | (t & 0xF3);
} }
} }
void FCEU_VSUniPower(void) void FCEU_VSUniPower(void) {
{
coinon = 0; coinon = 0;
VSindex = 0; VSindex = 0;
if (secptr) if (secptr)
SetReadHandler(0x5e00, 0x5e01, VSSecRead); SetReadHandler(0x5e00, 0x5e01, VSSecRead);
if(curppu == RC2C05_04) if (curppu == RC2C05_04) {
{
OldReadPPU = GetReadHandler(0x2002); OldReadPPU = GetReadHandler(0x2002);
SetReadHandler(0x2002, 0x2002, A2002_Topgun); SetReadHandler(0x2002, 0x2002, A2002_Topgun);
} } else if (curppu == RC2C05_03) {
else if(curppu == RC2C05_03)
{
OldReadPPU = GetReadHandler(0x2002); OldReadPPU = GetReadHandler(0x2002);
SetReadHandler(0x2002, 0x2002, A2002_Gumshoe); SetReadHandler(0x2002, 0x2002, A2002_Gumshoe);
} } else if (curppu == RC2C05_02) {
else if(curppu == RC2C05_02)
{
OldReadPPU = GetReadHandler(0x2002); OldReadPPU = GetReadHandler(0x2002);
SetReadHandler(0x2002, 0x2002, A2002_MBJ); SetReadHandler(0x2002, 0x2002, A2002_MBJ);
} }
if(curppu == RC2C05_04 || curppu == RC2C05_01 || curppu == RC2C05_03 || curppu == RC2C05_02) if (curppu == RC2C05_04 || curppu == RC2C05_01 || curppu == RC2C05_03 || curppu == RC2C05_02) {
{
OldWritePPU[0] = GetWriteHandler(0x2000); OldWritePPU[0] = GetWriteHandler(0x2000);
OldWritePPU[1] = GetWriteHandler(0x2001); OldWritePPU[1] = GetWriteHandler(0x2001);
SetWriteHandler(0x2000, 0x2001, B2000_2001_2C05); SetWriteHandler(0x2000, 0x2001, B2000_2001_2C05);
} }
if(curmd5 == 0x2d396247cf58f9faLL) /* Super Xevious */ if (curmd5 == 0x2d396247cf58f9faLL) { /* Super Xevious */
{
SetReadHandler(0x5400, 0x57FF, XevRead); SetReadHandler(0x5400, 0x57FF, XevRead);
} }
} }
@ -295,8 +264,9 @@ VSUNIENTRY VSUniGames[] =
{ "Freedom Force", 0xed96436bd1b5e688LL, 4, 0, RP2C04_001, IOPTION_GUN }, /* Wrong color in game select screen? */ { "Freedom Force", 0xed96436bd1b5e688LL, 4, 0, RP2C04_001, IOPTION_GUN }, /* Wrong color in game select screen? */
{ "Stroke and Match Golf", 0x612325606e82bc66LL, 99, 2, RP2C04_002, IOPTION_SWAPDIRAB | IOPTION_PREDIP, 0x01 }, { "Stroke and Match Golf", 0x612325606e82bc66LL, 99, 2, RP2C04_002, IOPTION_SWAPDIRAB | IOPTION_PREDIP, 0x01 },
{"Goonies", 0x3b0085c4ff29098eLL, 151,1,RP2C04_003,0}, { "Goonies", 0xb4032d694e1d2733LL, 151, 1, RP2C04_003, 0 },
{ "Gradius", 0x50687ae63bdad976LL, 151, 1, RP2C04_001, IOPTION_SWAPDIRAB }, { "Gradius", 0x50687ae63bdad976LL, 151, 1, RP2C04_001, IOPTION_SWAPDIRAB },
{ "Gumshoe", 0x87161f8ee37758d3LL, 99, 2, RC2C05_03, IOPTION_GUN },
{ "Gumshoe", 0xb8500780bf69ce29LL, 99, 2, RC2C05_03, IOPTION_GUN }, { "Gumshoe", 0xb8500780bf69ce29LL, 99, 2, RC2C05_03, IOPTION_GUN },
{ "Hogan's Alley", 0xd78b7f0bb621fb45LL, 99, 2, RP2C04_001, IOPTION_GUN }, { "Hogan's Alley", 0xd78b7f0bb621fb45LL, 99, 2, RP2C04_001, IOPTION_GUN },
{ "Ice Climber", 0xd21e999513435e2aLL, 99, 2, RP2C05_004, IOPTION_SWAPDIRAB }, { "Ice Climber", 0xd21e999513435e2aLL, 99, 2, RP2C05_004, IOPTION_SWAPDIRAB },
@ -321,19 +291,16 @@ VSUNIENTRY VSUniGames[] =
{ "VS Castlevania", 0x92fd6909c81305b9LL, 2, 1, RP2C04_002, 0 }, { "VS Castlevania", 0x92fd6909c81305b9LL, 2, 1, RP2C04_002, 0 },
{ "VS Slalom", 0x4889b5a50a623215LL, 0, 1, RP2C04_002, 0 }, { "VS Slalom", 0x4889b5a50a623215LL, 0, 1, RP2C04_002, 0 },
{ "VS Super Mario Bros", 0x39d8cfa788e20b6cLL, 99, 2, RP2C05_004, 0 }, { "VS Super Mario Bros", 0x39d8cfa788e20b6cLL, 99, 2, RP2C05_004, 0 },
{ "VS Super Mario Bros [a1]", 0xfc182e5aefbce14dLL, 99, 2, RP2C05_004, 0 },
{ "VS TKO Boxing", 0x6e1ee06171d8ce3aLL, 4, 1, RP2C04_003, IOPTION_PREDIP, 0x00 }, { "VS TKO Boxing", 0x6e1ee06171d8ce3aLL, 4, 1, RP2C04_003, IOPTION_PREDIP, 0x00 },
{ 0 } { 0 }
}; };
void FCEU_VSUniCheck(uint64 md5partial, int *MapperNo, uint8 *Mirroring) void FCEU_VSUniCheck(uint64 md5partial, int *MapperNo, uint8 *Mirroring) {
{
VSUNIENTRY *vs = VSUniGames; VSUNIENTRY *vs = VSUniGames;
while(vs->name) while (vs->name) {
{ if (md5partial == vs->md5partial) {
if(md5partial == vs->md5partial)
{
if (vs->ppu < RCP2C03B) pale = vs->ppu; if (vs->ppu < RCP2C03B) pale = vs->ppu;
*MapperNo = vs->mapper; *MapperNo = vs->mapper;
*Mirroring = vs->mirroring; *Mirroring = vs->mirroring;
@ -354,17 +321,13 @@ void FCEU_VSUniCheck(uint64 md5partial, int *MapperNo, uint8 *Mirroring)
} }
vsdip = 0x0; vsdip = 0x0;
if(vs->ioption & IOPTION_PREDIP) if (vs->ioption & IOPTION_PREDIP) {
{
vsdip = vs->predip; vsdip = vs->predip;
} }
if(vs->ioption & IOPTION_GUN) if (vs->ioption & IOPTION_GUN) {
{
GameInfo->input[0] = SI_ZAPPER; GameInfo->input[0] = SI_ZAPPER;
GameInfo->input[1] = SI_NONE; GameInfo->input[1] = SI_NONE;
} } else {
else
{
GameInfo->input[0] = GameInfo->input[1] = SI_GAMEPAD; GameInfo->input[0] = GameInfo->input[1] = SI_GAMEPAD;
} }
curvs = vs; curvs = vs;
@ -374,31 +337,27 @@ void FCEU_VSUniCheck(uint64 md5partial, int *MapperNo, uint8 *Mirroring)
} }
} }
void FCEU_VSUniDraw(uint8 *XBuf) void FCEU_VSUniDraw(uint8 *XBuf) {
{
uint32 *dest; uint32 *dest;
int y, x; int y, x;
if (!DIPS) return; if (!DIPS) return;
dest = (uint32*)(XBuf + 256 * 12 + 164); dest = (uint32*)(XBuf + 256 * 12 + 164);
for(y=24;y;y--,dest+=(256-72)>>2) for (y = 24; y; y--, dest += (256 - 72) >> 2) {
{
for (x = 72 >> 2; x; x--, dest++) for (x = 72 >> 2; x; x--, dest++)
*dest = 0; *dest = 0;
} }
dest = (uint32*)(XBuf + 256 * (12 + 4) + 164 + 6); dest = (uint32*)(XBuf + 256 * (12 + 4) + 164 + 6);
for (y = 16; y; y--, dest += (256 >> 2) - 16) for (y = 16; y; y--, dest += (256 >> 2) - 16)
for(x=8;x;x--) for (x = 8; x; x--) {
{
*dest = 0x01010101; *dest = 0x01010101;
dest += 2; dest += 2;
} }
dest = (uint32*)(XBuf + 256 * (12 + 4) + 164 + 6); dest = (uint32*)(XBuf + 256 * (12 + 4) + 164 + 6);
for(x=0;x<8;x++,dest+=2) for (x = 0; x < 8; x++, dest += 2) {
{
uint32 *da = dest + (256 >> 2); uint32 *da = dest + (256 >> 2);
if (!((vsdip >> x) & 1)) if (!((vsdip >> x) & 1))

View File

@ -228,6 +228,7 @@
<PreprocessToFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessToFile> <PreprocessToFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessToFile>
<PreprocessSuppressLineNumbers Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessSuppressLineNumbers> <PreprocessSuppressLineNumbers Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessSuppressLineNumbers>
</ClCompile> </ClCompile>
<ClCompile Include="..\src\boards\09-034a.cpp" />
<ClCompile Include="..\src\boards\103.cpp" /> <ClCompile Include="..\src\boards\103.cpp" />
<ClCompile Include="..\src\boards\106.cpp" /> <ClCompile Include="..\src\boards\106.cpp" />
<ClCompile Include="..\src\boards\108.cpp" /> <ClCompile Include="..\src\boards\108.cpp" />
@ -362,7 +363,6 @@
<ClCompile Include="..\src\boards\sc-127.cpp" /> <ClCompile Include="..\src\boards\sc-127.cpp" />
<ClCompile Include="..\src\boards\sheroes.cpp" /> <ClCompile Include="..\src\boards\sheroes.cpp" />
<ClCompile Include="..\src\boards\sl1632.cpp" /> <ClCompile Include="..\src\boards\sl1632.cpp" />
<ClCompile Include="..\src\boards\smb2j.cpp" />
<ClCompile Include="..\src\boards\subor.cpp" /> <ClCompile Include="..\src\boards\subor.cpp" />
<ClCompile Include="..\src\boards\super24.cpp" /> <ClCompile Include="..\src\boards\super24.cpp" />
<ClCompile Include="..\src\boards\supervision.cpp" /> <ClCompile Include="..\src\boards\supervision.cpp" />

View File

@ -262,9 +262,6 @@
<ClCompile Include="..\src\boards\sl1632.cpp"> <ClCompile Include="..\src\boards\sl1632.cpp">
<Filter>boards</Filter> <Filter>boards</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\src\boards\smb2j.cpp">
<Filter>boards</Filter>
</ClCompile>
<ClCompile Include="..\src\boards\subor.cpp"> <ClCompile Include="..\src\boards\subor.cpp">
<Filter>boards</Filter> <Filter>boards</Filter>
</ClCompile> </ClCompile>
@ -961,6 +958,9 @@
<ClCompile Include="..\src\boards\vrc3.cpp"> <ClCompile Include="..\src\boards\vrc3.cpp">
<Filter>boards</Filter> <Filter>boards</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\src\boards\09-034a.cpp">
<Filter>boards</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\src\cart.h"> <ClInclude Include="..\src\cart.h">