X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=fceu.git;a=blobdiff_plain;f=boards%2Ffk23c.c;fp=boards%2Ffk23c.c;h=ca6c134a03a56a8efc2ec406c05c8e5ba5aeaa06;hp=c869680ee33e77da7ba5ab13eb8c4f87710575b3;hb=43725da7349c85fa13e828fdbf20cc7ac8d298d6;hpb=386f5371eb984fb9c2860c83e740890a75cd45c1 diff --git a/boards/fk23c.c b/boards/fk23c.c index c869680..ca6c134 100644 --- a/boards/fk23c.c +++ b/boards/fk23c.c @@ -1,4 +1,4 @@ -/* FCE Ultra - NES/Famicom Emulator +/* FCE Ultra - NES/Famicom Emulator * * Copyright notice for this file: * Copyright (C) 2006 CaH4e3 @@ -15,16 +15,14 @@ * * 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 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "mapinc.h" #include "mmc3.h" -#include "../ines.h" -static bool is_BMCFK23CA; static uint8 unromchr; -static uint32 dipswitch; +static uint32 dipswitch = 0; static uint8 *CHRRAM=NULL; static uint32 CHRRAMSize; @@ -52,96 +50,64 @@ static void BMCFK23CCW(uint32 A, uint8 V) } } -//some games are wired differently, and this will need to be changed. -//all the WXN games require prg_bonus = 1, and cah4e3's multicarts require prg_bonus = 0 -//we'll populate this from a game database -static int prg_bonus; -static int prg_mask; - -//prg_bonus = 0 -//4-in-1 (FK23C8021)[p1][!].nes -//4-in-1 (FK23C8033)[p1][!].nes -//4-in-1 (FK23C8043)[p1][!].nes -//4-in-1 (FK23Cxxxx, S-0210A PCB)[p1][!].nes - -//prg_bonus = 1 -//[m176]大富翁2-上海大亨.wxn.nes -//[m176]宠物翡翠.fix.nes -//[m176]格兰帝亚.wxn.nes -//[m176]梦幻之星.wxn.nes -//[m176]水浒神兽.fix.nes -//[m176]西楚霸王.fix.nes -//[m176]超级大富翁.wxn.nes -//[m176]雄霸天下.wxn.nes - -//works as-is under virtuanes m176 -//[m176]三侠五义.wxn.nes -//[m176]口袋金.fix.nes -//[m176]爆笑三国.fix.nes - -//needs other tweaks -//[m176]三国忠烈传.wxn.nes -//[m176]破釜沉舟.fix.nes - -//PRG wrapper static void BMCFK23CPW(uint32 A, uint8 V) { uint32 bank = (EXPREGS[1] & 0x1F); uint32 hiblock = ((EXPREGS[0] & 8) << 4)|((EXPREGS[0] & 0x80) << 1)|(UNIFchrrama?((EXPREGS[2] & 0x40)<<3):0); uint32 block = (EXPREGS[1] & 0x60) | hiblock; uint32 extra = (EXPREGS[3] & 2); - - if((EXPREGS[0]&7)==4) - setprg32(0x8000,EXPREGS[1]>>1); - else if ((EXPREGS[0]&7)==3) + switch(EXPREGS[0]&7) { - setprg16(0x8000,EXPREGS[1]); - setprg16(0xC000,EXPREGS[1]); - } - else - { - if(EXPREGS[0]&3) - { - uint32 blocksize = (6)-(EXPREGS[0]&3); - uint32 mask = (1<> 1); + break; } - setprg8r(0x10,0x6000,A001B&3); + setprg8r(0x10,0x6000,A001B&3); } -//PRG handler ($8000-$FFFF) static DECLFW(BMCFK23CHiWrite) { - if(EXPREGS[0]&0x40) - { - if(EXPREGS[0]&0x30) - unromchr=0; - else - { - unromchr=V&3; - FixMMC3CHR(MMC3_cmd); - } - } - else - { - if((A==0x8001)&&(EXPREGS[3]&2&&MMC3_cmd&8)) - { - EXPREGS[4|(MMC3_cmd&3)]=V; - FixMMC3PRG(MMC3_cmd); - FixMMC3CHR(MMC3_cmd); - } + if(EXPREGS[0]&0x40) + { + if(EXPREGS[0]&0x30) + unromchr=0; + else + { + unromchr=V&3; + FixMMC3CHR(MMC3_cmd); + } + } + else + { + if((A==0x8001)&&(EXPREGS[3]&2)&&(MMC3_cmd&8)) + { + EXPREGS[4|(MMC3_cmd&3)]=V; + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); + } else if(A<0xC000) { if(UNIFchrrama) { // hacky... strange behaviour, must be bit scramble due to pcb layot restrictions @@ -159,51 +125,35 @@ static DECLFW(BMCFK23CHiWrite) } } -//EXP handler ($5000-$5FFF) static DECLFW(BMCFK23CWrite) { - if(A&(1<<(dipswitch+4))) + //FCEU_printf("lo %04x:%02x\n",A,V); + if(dipswitch) // íóëåâîé äèï áåðåò ëþáûå çàïèñè ïî äåôîëòó, äàëüøå èäåò âûáîð + { + if(A&(1<<(dipswitch+3))) { + EXPREGS[A&3]=V; +// FCEU_printf(" reg %d set!\n",A&3); + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); + } + } + else { - //printf("+ "); EXPREGS[A&3]=V; - - bool remap = false; - - //sometimes writing to reg0 causes remappings to occur. we think the 2 signifies this. - //if not, 0x24 is a value that is known to work - //however, the low 4 bits are known to control the mapping mode, so 0x20 is more likely to be the immediate remap flag - remap |= ((EXPREGS[0]&0xF0)==0x20); - - //this is an actual mapping reg. i think reg0 controls what happens when reg1 is written. anyway, we have to immediately remap these - remap |= (A&3)==1; - //this too. - remap |= (A&3)==2; - - if(remap) - { - FixMMC3PRG(MMC3_cmd); - FixMMC3CHR(MMC3_cmd); - } +// FCEU_printf(" reg %d set!\n",A&3); + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); } - - if(is_BMCFK23CA) - { - if(EXPREGS[3]&2) - EXPREGS[0] &= ~7; // hacky hacky! if someone wants extra banking, then for sure doesn't want mode 4 for it! (allow to run A version boards on normal mapper) - } - - //printf("%04X = $%02X\n",A,V); - //printf("%02X %02X %02X %02X\n",EXPREGS[0],EXPREGS[1],EXPREGS[2],EXPREGS[3]); + if(EXPREGS[3]&2) + EXPREGS[0] &= ~7; // hacky hacky! if someone wants extra banking, then for sure doesn't want mode 4 for it! (allow to run A version boards on normal mapper) } static void BMCFK23CReset(void) { - //NOT NECESSARY ANYMORE - //this little hack makes sure that we try all the dip switch settings eventually, if we reset enough - // dipswitch++; - // dipswitch&=7; - //printf("BMCFK23C dipswitch set to %d\n",dipswitch); - + if(dipswitch<=8) + dipswitch++; + else + dipswitch=0; EXPREGS[0]=EXPREGS[1]=EXPREGS[2]=EXPREGS[3]=0; EXPREGS[4]=EXPREGS[5]=EXPREGS[6]=EXPREGS[7]=0xFF; MMC3RegReset(); @@ -213,11 +163,12 @@ static void BMCFK23CReset(void) static void BMCFK23CPower(void) { - dipswitch = 0; GenMMC3Power(); - EXPREGS[0]=EXPREGS[1]=EXPREGS[2]=EXPREGS[3]=0; + EXPREGS[0]=4; + EXPREGS[1]=0xFF; + EXPREGS[2]=EXPREGS[3]=0; + dipswitch = 0; EXPREGS[4]=EXPREGS[5]=EXPREGS[6]=EXPREGS[7]=0xFF; - GenMMC3Power(); SetWriteHandler(0x5000,0x5fff,BMCFK23CWrite); SetWriteHandler(0x8000,0xFFFF,BMCFK23CHiWrite); FixMMC3PRG(MMC3_cmd); @@ -245,46 +196,31 @@ static void BMCFK23CAClose(void) void BMCFK23C_Init(CartInfo *info) { - is_BMCFK23CA = false; - - GenMMC3_Init(info, 512, 256, 8, 0); + GenMMC3_Init(info, 512, 256, 128, 0); cwrap=BMCFK23CCW; pwrap=BMCFK23CPW; info->Power=BMCFK23CPower; info->Reset=BMCFK23CReset; AddExState(EXPREGS, 8, 0, "EXPR"); - AddExState(&unromchr, 1, 0, "UNCHR"); - AddExState(&dipswitch, 1, 0, "DIPSW"); - - prg_bonus = 1; - if(MasterRomInfoParams.find("bonus") != MasterRomInfoParams.end()) - prg_bonus = atoi(MasterRomInfoParams["bonus"].c_str()); - - prg_mask = 0x7F>>(prg_bonus); + AddExState(&unromchr, 1, 0, "UCHR"); + AddExState(&dipswitch, 1, 0, "DPSW"); } void BMCFK23CA_Init(CartInfo *info) { - is_BMCFK23CA = true; - - GenMMC3_Init(info, 512, 256, 8, 0); + GenMMC3_Init(info, 512, 256, 128, 0); cwrap=BMCFK23CCW; pwrap=BMCFK23CPW; info->Power=BMCFK23CAPower; info->Reset=BMCFK23CReset; info->Close=BMCFK23CAClose; - - CHRRAMSize=8192; + + CHRRAMSize=8192; CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize); SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1); AddExState(CHRRAM, CHRRAMSize, 0, "CRAM"); AddExState(EXPREGS, 8, 0, "EXPR"); - AddExState(&unromchr, 1, 0, "UNCHR"); - AddExState(&dipswitch, 1, 0, "DIPSW"); - - prg_bonus = 1; - if(MasterRomInfoParams.find("bonus") != MasterRomInfoParams.end()) - prg_bonus = atoi(MasterRomInfoParams["bonus"].c_str()); - prg_mask = 0x7F>>(prg_bonus); + AddExState(&unromchr, 1, 0, "UCHR"); + AddExState(&dipswitch, 1, 0, "DPSW"); }