diff --git a/trunk/src/boards/8in1.cpp b/trunk/src/boards/8in1.cpp new file mode 100644 index 00000000..3e2f9640 --- /dev/null +++ b/trunk/src/boards/8in1.cpp @@ -0,0 +1,67 @@ +/* FCE Ultra - NES/Famicom Emulator + * + * Copyright notice for this file: + * Copyright (C) 2016 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 + * + * 8-in-1 Rockin' Kats, Snake, (PCB marked as "8 in 1"), similar to 12IN1, + * but with MMC3 on board, all games are hacked the same, Snake is buggy too! + * + * no reset-citcuit, so selected game can be reset, but to change it you must use power + * + */ + +#include "mapinc.h" +#include "mmc3.h" + +static void BMC8IN1CW(uint32 A, uint8 V) { + setchr1(A, ((EXPREGS[0] & 0xC) << 5) | (V & 0x7F)); +} + +static void BMC8IN1PW(uint32 A, uint8 V) { + if(EXPREGS[0] & 0x10) { // MMC3 mode + setprg8(A, ((EXPREGS[0] & 0xC) << 2) | (V & 0xF)); + } else { + setprg32(0x8000, EXPREGS[0] & 0xF); + } +} + +static DECLFW(BMC8IN1Write) { + if(A & 0x1000) { + EXPREGS[0] = V; + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); + } else { + if(A < 0xC000) + MMC3_CMDWrite(A, V); + else + MMC3_IRQWrite(A, V); + } +} + +static void BMC8IN1Power(void) { + EXPREGS[0] = 0; + GenMMC3Power(); + SetWriteHandler(0x8000, 0xFFFF, BMC8IN1Write); +} + +void BMC8IN1_Init(CartInfo *info) { + GenMMC3_Init(info, 128, 128, 0, 0); + cwrap = BMC8IN1CW; + pwrap = BMC8IN1PW; + info->Power = BMC8IN1Power; + AddExState(EXPREGS, 1, 0, "EXPR"); +} diff --git a/trunk/src/boards/et-4320.cpp b/trunk/src/boards/et-4320.cpp new file mode 100644 index 00000000..19042260 --- /dev/null +++ b/trunk/src/boards/et-4320.cpp @@ -0,0 +1,119 @@ +/* FCE Ultra - NES/Famicom Emulator +* +* Copyright notice for this file: +* Copyright (C) 2016 Cluster +* http://clusterrr.com +* clusterrr@clusterrr.com +* +* 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 +*/ + +/* +MMC3-based multicart mapper with CHR RAM, CHR ROM and PRG RAM + +$6000-7FFF: A~[011xxxxx xxMRSBBB] Multicart reg +This register can only be written to if PRG-RAM is enabled and writable (see $A001) +and BBB = 000 (power on state) + +BBB = CHR+PRG block select bits (A19, A18, A17 for both PRG and CHR) +S = PRG block size & mirroring mode (0=128k with normal MMC3, 1=256k with TxSROM-like single-screen mirroring) +R = CHR mode (0=CHR ROM 1=CHR RAM) +M = CHR block size (0=256k 1=128k) +ignored when S is 0 for some reason + +Example Game: +-------------------------- +7 in 1 multicart (Amarello, TMNT2, Contra, Ninja Cat, Ninja Crusaders, Rainbow Islands 2) +*/ + +#include "mapinc.h" +#include "mmc3.h" + +static uint8 *CHRRAM; +static uint32 CHRRAMSize; +static uint8 PPUCHRBus; +static uint8 TKSMIR[8]; + +static void BMC810131C_PW(uint32 A, uint8 V) { + if ((EXPREGS[0] >> 3) & 1) + setprg8(A, (V & 0x1F) | ((EXPREGS[0] & 7) << 4)); + else + setprg8(A, (V & 0x0F) | ((EXPREGS[0] & 7) << 4)); +} + +static void BMC810131C_CW(uint32 A, uint8 V) { + if ((EXPREGS[0] >> 4) & 1) + setchr1r(0x10, A, V); + else if (((EXPREGS[0] >> 5) & 1) && ((EXPREGS[0] >> 3) & 1)) + setchr1(A, V | ((EXPREGS[0] & 7) << 7)); + else + setchr1(A, (V & 0x7F) | ((EXPREGS[0] & 7) << 7)); + + TKSMIR[A >> 10] = V >> 7; + if (((EXPREGS[0] >> 3) & 1) && (PPUCHRBus == (A >> 10))) + setmirror(MI_0 + (V >> 7)); +} + +static DECLFW(BMC810131C_Write) { + if (((A001B & 0xC0) == 0x80) && !(EXPREGS[0] & 7)) + { + EXPREGS[0] = A & 0x3F; + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); + } + else { + CartBW(A, V); + } +} + +static void BMC810131C_Reset(void) { + EXPREGS[0] = 0; + MMC3RegReset(); +} + +static void BMC810131C_Power(void) { + EXPREGS[0] = 0; + GenMMC3Power(); + SetWriteHandler(0x6000, 0x7FFF, BMC810131C_Write); +} + +static void BMC810131C_Close(void) { + if (CHRRAM) + FCEU_gfree(CHRRAM); + CHRRAM = NULL; +} + +static void TKSPPU(uint32 A) { + A &= 0x1FFF; + A >>= 10; + PPUCHRBus = A; + if ((EXPREGS[0] >> 3) & 1) + setmirror(MI_0 + TKSMIR[A]); +} + +void BMC810131C_Init(CartInfo *info) { + GenMMC3_Init(info, 256, 256, 8, 0); + CHRRAMSize = 8192; + CHRRAM = (uint8*)FCEU_gmalloc(CHRRAMSize); + SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1); + AddExState(CHRRAM, CHRRAMSize, 0, "CHRR"); + pwrap = BMC810131C_PW; + cwrap = BMC810131C_CW; + PPU_hook = TKSPPU; + info->Power = BMC810131C_Power; + info->Reset = BMC810131C_Reset; + info->Close = BMC810131C_Close; + AddExState(EXPREGS, 1, 0, "EXPR"); +} diff --git a/trunk/src/boards/ks7016.cpp b/trunk/src/boards/ks7016.cpp new file mode 100644 index 00000000..3e856202 --- /dev/null +++ b/trunk/src/boards/ks7016.cpp @@ -0,0 +1,85 @@ +/* FCE Ultra - NES/Famicom Emulator + * + * Copyright notice for this file: + * Copyright (C) 2016 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 Conversion (Exciting Basket), weird banking addressing, seems because + * of used addressing scheme, made to disable the lower system banks from 6000 + * but the kaiser mapper chip and PCB are the same as usual + * probably need a hard eprom dump to verify actual banks layout + * + */ + +#include "mapinc.h" + +static uint8 preg; + +static SFORMAT StateRegs[] = +{ + { &preg, 1, "PREG" }, + { 0 } +}; + +static void Sync(void) { + setprg8(0x6000, preg); + setprg8(0x8000, 0xC); + setprg8(0xA000, 0xD); + setprg8(0xC000, 0xE); + setprg8(0xE000, 0xF); + setchr8(0); +} + +static DECLFW(UNLKS7016Write) { + u16 mask = (A & 0x30); + switch(A & 0xD943) { + case 0xD943: { + if(mask == 0x30) { + preg = 8 | 3; // or A, or no bus (all FF) + } else { + preg = (A >> 2) & 0xF; // can be anything but C-F + } + Sync(); + break; + } + case 0xD903: { // this case isn't usedby the game, but addressing does this as a side effect + if(mask == 0x30) { + preg = 8 | ((A >> 2) & 3); // also masked C-F from output + } else { + preg = 8 | 3; + } + Sync(); + break; + } + } +} + +static void UNLKS7016Power(void) { + preg = 8; + Sync(); + SetReadHandler(0x6000, 0xffff, CartBR); + SetWriteHandler(0x8000, 0xffff, UNLKS7016Write); +} + +static void StateRestore(int version) { + Sync(); +} + +void UNLKS7016_Init(CartInfo *info) { + info->Power = UNLKS7016Power; + GameStateRestore = StateRestore; + AddExState(&StateRegs, ~0, 0, 0); +} diff --git a/trunk/src/unif.cpp b/trunk/src/unif.cpp index 6a36508f..302911e5 100644 --- a/trunk/src/unif.cpp +++ b/trunk/src/unif.cpp @@ -371,6 +371,7 @@ static BMAPPING bmap[] = { { "KS7010", UNLKS7010_Init, 0 }, { "KS7012", UNLKS7012_Init, 0 }, { "KS7013B", UNLKS7013B_Init, 0 }, + { "KS7016", UNLKS7016_Init, 0 }, { "KS7017", UNLKS7017_Init, 0 }, { "KS7030", UNLKS7030_Init, 0 }, { "KS7031", UNLKS7031_Init, 0 }, @@ -465,6 +466,8 @@ static BMAPPING bmap[] = { { "HP898F", BMCHP898F_Init, 0 }, { "F-15", BMCF15_Init, 0 }, { "RT-01", UNLRT01_Init, 0 }, + { "81-01-31-C", BMC810131C_Init, 0 }, + { "8-IN-1", BMC8IN1_Init, 0 }, { 0, 0, 0 } }; diff --git a/trunk/src/unif.h b/trunk/src/unif.h index 432c00c2..d19f0dce 100644 --- a/trunk/src/unif.h +++ b/trunk/src/unif.h @@ -123,6 +123,7 @@ void UNLH2288_Init(CartInfo *info); void UNLKOF97_Init(CartInfo *info); void UNLKS7012_Init(CartInfo *info); void UNLKS7013B_Init(CartInfo *info); +void UNLKS7016_Init(CartInfo *info); void UNLKS7017_Init(CartInfo *info); void UNLKS7030_Init(CartInfo *info); void UNLKS7031_Init(CartInfo *info); @@ -153,6 +154,8 @@ void UNLEH8813A_Init(CartInfo *info); void BMCHP898F_Init(CartInfo *info); void BMCF15_Init(CartInfo *info); void UNLRT01_Init(CartInfo *info); +void BMC810131C_Init(CartInfo *info); +void BMC8IN1_Init(CartInfo *info); extern uint8 *UNIFchrrama; // Meh. So I can stop CHR RAM // bank switcherooing with certain boards... diff --git a/trunk/vc/vc10_fceux.vcxproj b/trunk/vc/vc10_fceux.vcxproj index 2fe5014d..d22d7594 100644 --- a/trunk/vc/vc10_fceux.vcxproj +++ b/trunk/vc/vc10_fceux.vcxproj @@ -307,6 +307,7 @@ + @@ -319,6 +320,7 @@ + @@ -326,6 +328,7 @@ + diff --git a/trunk/vc/vc10_fceux.vcxproj.filters b/trunk/vc/vc10_fceux.vcxproj.filters index ac1dd439..3f5187f0 100644 --- a/trunk/vc/vc10_fceux.vcxproj.filters +++ b/trunk/vc/vc10_fceux.vcxproj.filters @@ -1069,6 +1069,15 @@ boards + + boards + + + boards + + + boards +