*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "mapinc.h"
+#include "../ines.h"
-static uint8 latche;
+static uint8 latche, latcheinit, bus_conflict;
+static uint16 addrreg0, addrreg1;
+static uint8 *WRAM=NULL;
+static uint32 WRAMSIZE;
+static void(*WSync)(void);
-//------------------ CPROM ---------------------------
+static DECLFW(LatchWrite)
+{
+// FCEU_printf("bs %04x %02x\n",A,V);
+ if(bus_conflict)
+ latche=V&CartBR(A);
+ else
+ latche=V;
+ WSync();
+}
-static DECLFW(CPROMWrite)
+static void LatchPower(void)
{
- latche=V&3;
- setchr4(0x1000,latche);
+ latche=latcheinit;
+ WSync();
+ if(WRAM)
+ {
+ SetReadHandler(0x6000,0xFFFF,CartBR);
+ SetWriteHandler(0x6000,0x7FFF,CartBW);
+ }
+ else
+ {
+ SetReadHandler(0x8000,0xFFFF,CartBR);
+ }
+ SetWriteHandler(addrreg0,addrreg1,LatchWrite);
}
-static void CPROMReset(void)
+static void LatchClose(void)
{
- setprg32(0x8000,0);
- setchr8(0);
- SetReadHandler(0x8000,0xFFFF,CartBR);
- SetWriteHandler(0x8000,0xffff,CPROMWrite);
+ if(WRAM)
+ FCEU_gfree(WRAM);
+ WRAM=NULL;
}
-static void CPROMRestore(int version)
+static void StateRestore(int version)
{
- setchr4(0x1000,latche);
+ WSync();
}
-void CPROM_Init(CartInfo *info)
+static void Latch_Init(CartInfo *info, void (*proc)(void), uint8 init, uint16 adr0, uint16 adr1, uint8 wram, uint8 busc)
{
- info->Power=CPROMReset;
- GameStateRestore=CPROMRestore;
+ bus_conflict = busc;
+ latcheinit=init;
+ addrreg0=adr0;
+ addrreg1=adr1;
+ WSync=proc;
+ info->Power=LatchPower;
+ info->Close=LatchClose;
+ GameStateRestore=StateRestore;
+ if(wram)
+ {
+ WRAMSIZE=8192;
+ WRAM=(uint8*)FCEU_gmalloc(WRAMSIZE);
+ SetupCartPRGMapping(0x10,WRAM,WRAMSIZE,1);
+ if(info->battery)
+ {
+ info->SaveGame[0]=WRAM;
+ info->SaveGameLen[0]=WRAMSIZE;
+ }
+ AddExState(WRAM, WRAMSIZE, 0, "WRAM");
+ }
AddExState(&latche, 1, 0, "LATC");
}
-//------------------ CNROM ---------------------------
+//------------------ CPROM ---------------------------
-DECLFW(CNROMWrite)
+static void CPROMSync(void)
{
- latche=V&3;
- setchr8(latche);
+ setchr4(0x0000,0);
+ setchr4(0x1000,latche&3);
+ setprg16(0x8000,0);
+ setprg16(0xC000,1);
}
-static void CNROMReset(void)
+void CPROM_Init(CartInfo *info)
{
+ Latch_Init(info, CPROMSync, 0, 0x8000, 0xFFFF, 0, 0);
+}
+
+//------------------ Map 184 ---------------------------
+
+static void M184Sync(void)
+{
+ setchr4(0x0000,latche);
+ setchr4(0x1000,latche>>4);
setprg16(0x8000,0);
setprg16(0xC000,1);
- SetReadHandler(0x8000,0xFFFF,CartBR);
- SetWriteHandler(0x8000,0xffff,CNROMWrite);
}
-static void CNROMRestore(int version)
+void Mapper184_Init(CartInfo *info)
{
- setchr8(latche);
+ Latch_Init(info, M184Sync, 0, 0x6000, 0x7FFF, 0, 0);
+}
+
+//------------------ CNROM ---------------------------
+
+static void CNROMSync(void)
+{
+ //mbg 8/10/08 - fixed this so that large homebrew roms would work.
+ //setchr8(latche&3);
+ setchr8(latche);
+ setprg16(0x8000,0);
+ setprg16(0xC000,1);
+ setprg8r(0x10,0x6000,0); // Hayauchy IGO uses 2Kb or RAM
}
void CNROM_Init(CartInfo *info)
{
- info->Power=CNROMReset;
- GameStateRestore=CNROMRestore;
- AddExState(&latche, 1, 0, "LATC");
+ bool busc = MasterRomInfoParams.ContainsKey("busc");
+ Latch_Init(info, CNROMSync, 0, 0x8000, 0xFFFF, 1, busc?1:0);
}
-//------------------ NROM128 ---------------------------
+//------------------ ANROM ---------------------------
-static void NROM128Reset(void)
+static void ANROMSync()
{
- setprg16(0x8000,0);
- setprg16(0xC000,0);
+ setprg32(0x8000,latche&0xf);
+ setmirror(MI_0+((latche>>4)&1));
setchr8(0);
- SetReadHandler(0x8000,0xFFFF,CartBR);
}
-void NROM128_Init(CartInfo *info)
+void ANROM_Init(CartInfo *info)
{
- info->Power=NROM128Reset;
+ Latch_Init(info, ANROMSync, 0, 0x8000, 0xFFFF, 0, 0);
}
-//------------------ NROM256 ---------------------------
+//------------------ Map 70 ---------------------------
-static void NROM256Reset(void)
+static void M70Sync()
{
- setprg16(0x8000,0);
- setprg16(0xC000,1);
- setchr8(0);
- SetReadHandler(0x8000,0xFFFF,CartBR);
+ setprg16(0x8000,latche>>4);
+ setprg16(0xc000,~0);
+ setchr8(latche&0xf);
+}
+
+void Mapper70_Init(CartInfo *info)
+{
+ Latch_Init(info, M70Sync, 0, 0x8000, 0xFFFF, 0, 0);
+}
+
+//------------------ Map 152 ---------------------------
+
+static void M152Sync()
+{
+ setprg16(0x8000,(latche>>4)&7);
+ setprg16(0xc000,~0);
+ setchr8(latche&0xf);
+ setmirror(MI_0+((latche>>7)&1)); /* Saint Seiya...hmm. */
+}
+
+void Mapper152_Init(CartInfo *info)
+{
+ Latch_Init(info, M152Sync, 0, 0x8000, 0xFFFF, 0, 0);
+}
+
+//------------------ Map 78 ---------------------------
+/* Should be two separate emulation functions for this "mapper". Sigh. URGE TO KILL RISING. */
+static void M78Sync()
+{
+ setprg16(0x8000,(latche&7));
+ setprg16(0xc000,~0);
+ setchr8(latche>>4);
+ setmirror(MI_0+((latche>>3)&1));
}
-void NROM256_Init(CartInfo *info)
+void Mapper78_Init(CartInfo *info)
{
- info->Power=NROM256Reset;
+ Latch_Init(info, M78Sync, 0, 0x8000, 0xFFFF, 0, 0);
}
//------------------ MHROM ---------------------------
-static DECLFW(MHROMWrite)
+static void MHROMSync(void)
{
- setprg32(0x8000,V>>4);
- setchr8(V);
- latche=V;
+ setprg32(0x8000,latche>>4);
+ setchr8(latche&0xf);
}
-static void MHROMReset(void)
+void MHROM_Init(CartInfo *info)
{
- setprg32(0x8000,0);
- setchr8(0);
- latche=0;
- SetReadHandler(0x8000,0xFFFF,CartBR);
+ Latch_Init(info, MHROMSync, 0, 0x8000, 0xFFFF, 0, 0);
+}
+
+void Mapper140_Init(CartInfo *info)
+{
+ Latch_Init(info, MHROMSync, 0, 0x6000, 0x7FFF, 0, 0);
}
-static void MHROMRestore(int version)
+void Mapper240_Init(CartInfo *info)
{
- setprg32(0x8000,latche);
+ Latch_Init(info, MHROMSync, 0, 0x4020, 0x5FFF, 0, 0);
+ // need SRAM.
+}
+
+//------------------ Map 87 ---------------------------
+
+static void M87Sync(void)
+{
+ setprg16(0x8000,0);
+ setprg16(0xC000,1);
+ setchr8(((latche>>1)&1)|((latche<<1)&2));
+// setchr8(latche);
+}
+
+void Mapper87_Init(CartInfo *info)
+{
+ Latch_Init(info, M87Sync, ~0, 0x6000, 0xFFFF, 0, 0);
+}
+
+//------------------ Map 101 ---------------------------
+
+static void M101Sync(void)
+{
+ setprg16(0x8000,0);
+ setprg16(0xC000,1);
setchr8(latche);
- SetWriteHandler(0x8000,0xffff,MHROMWrite);
}
-void MHROM_Init(CartInfo *info)
-{
- info->Power=MHROMReset;
- AddExState(&latche, 1, 0,"LATC");
- PRGmask32[0]&=1;
- CHRmask8[0]&=1;
- GameStateRestore=MHROMRestore;
+void Mapper101_Init(CartInfo *info)
+{
+ Latch_Init(info, M101Sync, ~0, 0x6000, 0x7FFF, 0, 0);
}
+//------------------ Map 11 ---------------------------
+
+static void M11Sync(void)
+{
+ setprg32(0x8000,latche&0xf);
+ setchr8(latche>>4);
+}
+
+void Mapper11_Init(CartInfo *info)
+{
+ Latch_Init(info, M11Sync, 0, 0x8000, 0xFFFF, 0, 0);
+}
+
+void Mapper144_Init(CartInfo *info)
+{
+ Latch_Init(info, M11Sync, 0, 0x8001, 0xFFFF, 0, 0);
+}
+
+//------------------ Map 38 ---------------------------
+
+static void M38Sync(void)
+{
+ setprg32(0x8000,latche&3);
+ setchr8(latche>>2);
+}
+
+void Mapper38_Init(CartInfo *info)
+{
+ Latch_Init(info, M38Sync, 0, 0x7000, 0x7FFF, 0, 0);
+}
+
+//------------------ Map 36 ---------------------------
+
+static void M36Sync(void)
+{
+ setprg32(0x8000,latche>>4);
+ setchr8((latche)&0xF);
+}
+
+void Mapper36_Init(CartInfo *info)
+{
+ Latch_Init(info, M36Sync, 0, 0x8400, 0xfffe, 0, 0);
+}
//------------------ UNROM ---------------------------
-static void UNROMRestore(int version)
+static void UNROMSync(void)
{
setprg16(0x8000,latche);
+ setprg16(0xc000,~0);
+ setchr8(0);
}
-static DECLFW(UNROMWrite)
+void UNROM_Init(CartInfo *info)
{
- setprg16(0x8000,V);
- latche=V;
+ Latch_Init(info, UNROMSync, 0, 0x8000, 0xFFFF, 0, 1);
}
-static void UNROMReset(void)
+//------------------ Map 93 ---------------------------
+
+static void SSUNROMSync(void)
{
- setprg16(0x8000,0);
+ setprg16(0x8000,latche>>4);
setprg16(0xc000,~0);
setchr8(0);
- SetWriteHandler(0x8000,0xffff,UNROMWrite);
- SetReadHandler(0x8000,0xFFFF,CartBR);
- latche=0;
}
-void UNROM_Init(CartInfo *info)
+void SUNSOFT_UNROM_Init(CartInfo *info)
{
- info->Power=UNROMReset;
- PRGmask16[0]&=7;
- AddExState(&latche, 1, 0, "LATC");
- GameStateRestore=UNROMRestore;
+ Latch_Init(info, SSUNROMSync, 0, 0x8000, 0xFFFF, 0, 0);
}
-//------------------ GNROM ---------------------------
+//------------------ Map 94 ---------------------------
-static void GNROMSync()
+static void M94Sync(void)
{
- setchr8(latche&3);
- setprg32(0x8000,(latche>>4)&3);
+ setprg16(0x8000,latche>>2);
+ setprg16(0xc000,~0);
+ setchr8(0);
}
-static DECLFW(GNROMWrite)
+void Mapper94_Init(CartInfo *info)
{
- latche=V&0x33;
- GNROMSync();
+ Latch_Init(info, M94Sync, 0, 0x8000, 0xFFFF, 0, 0);
}
-static void GNROMStateRestore(int version)
+//------------------ Map 180 ---------------------------
+
+static void M180Sync(void)
{
- GNROMSync();
+ setprg16(0x8000,0);
+ setprg16(0xc000,latche);
+ setchr8(0);
}
-static void GNROMReset(void)
+void Mapper180_Init(CartInfo *info)
{
- latche=0;
- GNROMSync();
- SetWriteHandler(0x8000,0xffff,GNROMWrite);
+ Latch_Init(info, M180Sync, 0, 0x8000, 0xFFFF, 0, 0);
+}
+
+//------------------ Map 107 ---------------------------
+
+static void M107Sync(void)
+{
+ setprg32(0x8000,(latche>>1)&3);
+ setchr8(latche&7);
+}
+
+void Mapper107_Init(CartInfo *info)
+{
+ Latch_Init(info, M107Sync, ~0, 0x8000, 0xFFFF, 0, 0);
+}
+
+//------------------ Map 113 ---------------------------
+
+static void M113Sync(void)
+{
+ setprg32(0x8000,(latche>>3)&7);
+ setchr8(((latche>>3)&8)|(latche&7));
+// setmirror(latche>>7); // only for HES 6in1
+}
+
+void Mapper113_Init(CartInfo *info)
+{
+ Latch_Init(info, M113Sync, 0, 0x4100, 0x7FFF, 0, 0);
+}
+
+//------------------ A65AS ---------------------------
+
+// actually, there is two cart in one... First have extra mirroring
+// mode (one screen) and 32K bankswitching, second one have only
+// 16 bankswitching mode and normal mirroring... But there is no any
+// correlations between modes and they can be used in one mapper code.
+
+static void BMCA65ASSync(void)
+{
+ if(latche&0x40)
+ setprg32(0x8000,(latche>>1)&0x0F);
+ else
+ {
+ setprg16(0x8000,((latche&0x30)>>1)|(latche&7));
+ setprg16(0xC000,((latche&0x30)>>1)|7);
+ }
+ setchr8(0);
+ if(latche&0x80)
+ setmirror(MI_0+(((latche>>5)&1)));
+ else
+ setmirror(((latche>>3)&1)^1);
+}
+
+void BMCA65AS_Init(CartInfo *info)
+{
+ Latch_Init(info, BMCA65ASSync, 0, 0x8000, 0xFFFF, 0, 0);
+}
+
+//------------------ NROM ---------------------------
+
+#ifdef DEBUG_MAPPER
+static DECLFW(WriteHandler)
+{
+ FCEU_printf("bs %04x %02x\n",A,V);
+ CartBW(A,V);
+}
+#endif
+
+static void NROMPower(void)
+{
+ setprg8r(0x10,0x6000,0); // Famili BASIC (v3.0) need it (uses only 4KB), FP-BASIC uses 8KB
+ setprg16(0x8000,0);
+ setprg16(0xC000,~0);
+ setchr8(0);
+
+ SetReadHandler(0x6000,0x7FFF,CartBR);
+ SetWriteHandler(0x6000,0x7FFF,CartBW);
SetReadHandler(0x8000,0xFFFF,CartBR);
+
+ #ifdef DEBUG_MAPPER
+ SetWriteHandler(0x4020,0xFFFF,WriteHandler);
+ #endif
}
-void GNROM_Init(CartInfo *info)
+void NROM_Init(CartInfo *info)
{
- info->Power=GNROMReset;
- AddExState(&latche, 1, 0, "LATC");
- GameStateRestore=GNROMStateRestore;
+ info->Power=NROMPower;
+ info->Close=LatchClose;
+
+ WRAMSIZE=8192;
+ WRAM=(uint8*)FCEU_gmalloc(WRAMSIZE);
+ SetupCartPRGMapping(0x10,WRAM,WRAMSIZE,1);
+ if(info->battery)
+ {
+ info->SaveGame[0]=WRAM;
+ info->SaveGameLen[0]=WRAMSIZE;
+ }
+ AddExState(WRAM, WRAMSIZE, 0, "WRAM");
}