1 /* FCE Ultra - NES/Famicom Emulator
3 * Copyright notice for this file:
4 * Copyright (C) 1998 BERO
5 * Copyright (C) 2003 Xodnizel
6 * Mapper 12 code Copyright (C) 2003 CaH4e3
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 /* Code for emulating iNES mappers 4,12,44,45,47,49,52,74,114,115,116,118,
24 119,148,165,205,214,215,245,249,250,254
34 uint8 EXPREGS[8]; /* For bootleg games, mostly. */
36 static uint8 A000B,A001B;
37 static uint8 DRegBuf[8];
42 uint8 IRQCount,IRQLatch,IRQa;
45 static SFORMAT MMC3_StateRegs[]=
48 {&MMC3_cmd, 1, "CMD"},
51 {&IRQReload, 1, "IRQR"},
52 {&IRQCount, 1, "IRQC"},
53 {&IRQLatch, 1, "IRQL"},
58 static int mmc3opts=0;
62 void (*pwrap)(uint32 A, uint8 V);
63 void (*cwrap)(uint32 A, uint8 V);
64 void (*mwrap)(uint8 V);
66 void GenMMC3Power(void);
67 void FixMMC3PRG(int V);
68 void FixMMC3CHR(int V);
70 void GenMMC3_Init(CartInfo *info, int prg, int chr, int wram, int battery);
72 // ----------------------------------------------------------------------
73 // ------------------------- Generic MM3 Code ---------------------------
74 // ----------------------------------------------------------------------
76 void FixMMC3PRG(int V)
80 pwrap(0xC000,DRegBuf[6]);
85 pwrap(0x8000,DRegBuf[6]);
88 pwrap(0xA000,DRegBuf[7]);
92 void FixMMC3CHR(int V)
94 int cbase=(V&0x80)<<5;
96 cwrap((cbase^0x000),DRegBuf[0]&(~1));
97 cwrap((cbase^0x400),DRegBuf[0]|1);
98 cwrap((cbase^0x800),DRegBuf[1]&(~1));
99 cwrap((cbase^0xC00),DRegBuf[1]|1);
101 cwrap(cbase^0x1000,DRegBuf[2]);
102 cwrap(cbase^0x1400,DRegBuf[3]);
103 cwrap(cbase^0x1800,DRegBuf[4]);
104 cwrap(cbase^0x1c00,DRegBuf[5]);
107 void MMC3RegReset(void)
109 IRQCount=IRQLatch=IRQa=MMC3_cmd=0;
124 DECLFW(MMC3_CMDWrite)
126 // FCEU_printf("%04x:%04x\n",A,V);
130 if((V&0x40) != (MMC3_cmd&0x40))
132 if((V&0x80) != (MMC3_cmd&0x80))
138 int cbase=(MMC3_cmd&0x80)<<5;
139 DRegBuf[MMC3_cmd&0x7]=V;
140 switch(MMC3_cmd&0x07)
142 case 0: cwrap((cbase^0x000),V&(~1));
143 cwrap((cbase^0x400),V|1);
145 case 1: cwrap((cbase^0x800),V&(~1));
146 cwrap((cbase^0xC00),V|1);
148 case 2: cwrap(cbase^0x1000,V);
150 case 3: cwrap(cbase^0x1400,V);
152 case 4: cwrap(cbase^0x1800,V);
154 case 5: cwrap(cbase^0x1C00,V);
169 if(mwrap) mwrap(V&1);
173 Write_IRQFM(0x4017,0x40);
178 DECLFW(MMC3_IRQWrite)
180 // FCEU_printf("%04x:%04x\n",A,V);
183 case 0xC000:IRQLatch=V;break;
184 case 0xC001:IRQReload=1;break;
185 case 0xE000:X6502_IRQEnd(FCEU_IQEXT);IRQa=0;break;
186 case 0xE001:IRQa=1;break;
190 static void ClockMMC3Counter(void)
192 int count = IRQCount;
193 if(!count || IRQReload)
200 if((count|isRevB) && !IRQCount)
204 X6502_IRQBegin(FCEU_IQEXT);
209 static void MMC3_hb(void)
214 static void MMC3_hb_KickMasterHack(void)
216 if(scanline==238) ClockMMC3Counter();
220 static void MMC3_hb_PALStarWarsHack(void)
222 if(scanline==240) ClockMMC3Counter();
226 void GenMMC3Restore(int version)
228 if(mwrap) mwrap(A000B&1);
229 FixMMC3PRG(MMC3_cmd);
230 FixMMC3CHR(MMC3_cmd);
233 static void GENCWRAP(uint32 A, uint8 V)
235 if(!UNIFchrrama) setchr1(A,V);
238 static void GENPWRAP(uint32 A, uint8 V)
243 static void GENMWRAP(uint8 V)
249 static void GENNOMWRAP(uint8 V)
254 static DECLFW(MBWRAM)
259 static DECLFR(MAWRAM)
261 return(WRAM[A-0x6000]);
264 static DECLFW(MBWRAMMMC6)
269 static DECLFR(MAWRAMMMC6)
271 return(WRAM[A&0x3ff]);
274 void GenMMC3Power(void)
276 if(UNIFchrrama) setchr8(0);
278 SetWriteHandler(0x8000,0xBFFF,MMC3_CMDWrite);
279 SetWriteHandler(0xC000,0xFFFF,MMC3_IRQWrite);
280 SetReadHandler(0x8000,0xFFFF,CartBR);
287 FCEU_CheatAddRAM(1,0x7000,WRAM);
288 SetReadHandler(0x7000,0x7FFF,MAWRAMMMC6);
289 SetWriteHandler(0x7000,0x7FFF,MBWRAMMMC6);
293 FCEU_CheatAddRAM(wrams>>10,0x6000,WRAM);
294 SetReadHandler(0x6000,0x6000+wrams-1,MAWRAM);
295 SetWriteHandler(0x6000,0x6000+wrams-1,MBWRAM);
298 FCEU_dwmemset(WRAM,0,wrams);
302 FCEU_dwmemset(CHRRAM,0,CHRRAMSize);
305 static void GenMMC3Close(void)
314 //static uint16 _a12;
315 //static void FP_FASTAPASS(1) MMC3_PPU(uint32 A)
317 // if(A&0x2000)return;
318 // if((!_a12)&&(A&0x1000))
319 // ClockMMC3Counter();
323 void GenMMC3_Init(CartInfo *info, int prg, int chr, int wram, int battery)
331 PRGmask8[0]&=(prg>>13)-1;
332 CHRmask1[0]&=(chr>>10)-1;
333 CHRmask2[0]&=(chr>>11)-1;
338 WRAM=(uint8*)FCEU_gmalloc(wrams);
339 AddExState(WRAM, wrams, 0, "WRAM");
345 info->SaveGame[0]=WRAM;
346 info->SaveGameLen[0]=wrams;
349 // if(!chr) // duplicated CHR RAM set up
351 // CHRRAM=(uint8*)FCEU_gmalloc(8192);
353 // SetupCartCHRMapping(0, CHRRAM, 8192, 1);
354 // AddExState(CHRRAM, 8192, 0, "CHRR");
357 AddExState(MMC3_StateRegs, ~0, 0, 0);
359 info->Power=GenMMC3Power;
360 info->Reset=MMC3RegReset;
361 info->Close=GenMMC3Close;
363 if(info->CRC32 == 0x5104833e) // Kick Master
364 GameHBIRQHook = MMC3_hb_KickMasterHack;
365 else if(info->CRC32 == 0x5a6860f1 || info->CRC32 == 0xae280e20) // Shougi Meikan '92/'93
366 GameHBIRQHook = MMC3_hb_KickMasterHack;
367 else if(info->CRC32 == 0xfcd772eb) // PAL Star Wars, similar problem as Kick Master.
368 GameHBIRQHook = MMC3_hb_PALStarWarsHack;
370 GameHBIRQHook=MMC3_hb;
371 // PPU_hook=MMC3_PPU;
372 GameStateRestore=GenMMC3Restore;
375 // ----------------------------------------------------------------------
376 // -------------------------- MMC3 Based Code ---------------------------
377 // ----------------------------------------------------------------------
379 // ---------------------------- Mapper 4 --------------------------------
381 static int hackm4=0;/* For Karnov, maybe others. BLAH. Stupid iNES format.*/
383 static void M4Power(void)
390 void Mapper4_Init(CartInfo *info)
394 if((info->CRC32==0x93991433 || info->CRC32==0xaf65aa84))
396 FCEU_printf("Low-G-Man can not work normally in the iNES format.\nThis game has been recognized by its CRC32 value, and the appropriate changes will be made so it will run.\nIf you wish to hack this game, you should use the UNIF format for your hack.\n\n");
399 GenMMC3_Init(info,512,256,ws,info->battery);
404 // ---------------------------- Mapper 12 -------------------------------
406 static void M12CW(uint32 A, uint8 V)
408 setchr1(A,(EXPREGS[(A&0x1000)>>12]<<8)+V);
411 static DECLFW(M12Write)
414 EXPREGS[1]=(V&0x10)>>4;
417 static void M12Power(void)
419 EXPREGS[0]=EXPREGS[1]=0;
421 SetWriteHandler(0x4100,0x5FFF,M12Write);
424 void Mapper12_Init(CartInfo *info)
426 GenMMC3_Init(info, 512, 256, 8, info->battery);
428 info->Power=M12Power;
429 AddExState(EXPREGS, 2, 0, "EXPR");
432 // ---------------------------- Mapper 37 -------------------------------
434 static void M37PW(uint32 A, uint8 V)
444 static void M37CW(uint32 A, uint8 V)
452 static DECLFW(M37Write)
455 FixMMC3PRG(MMC3_cmd);
456 FixMMC3CHR(MMC3_cmd);
459 static void M37Reset(void)
465 static void M37Power(void)
469 SetWriteHandler(0x6000,0x7FFF,M37Write);
472 void Mapper37_Init(CartInfo *info)
474 GenMMC3_Init(info, 512, 256, 8, info->battery);
477 info->Power=M37Power;
478 info->Reset=M37Reset;
479 AddExState(EXPREGS, 1, 0, "EXPR");
482 // ---------------------------- Mapper 44 -------------------------------
484 static void M44PW(uint32 A, uint8 V)
487 if(EXPREGS[0]>=6) NV&=0x1F;
493 static void M44CW(uint32 A, uint8 V)
496 if(EXPREGS[0]<6) NV&=0x7F;
501 static DECLFW(M44Write)
506 FixMMC3PRG(MMC3_cmd);
507 FixMMC3CHR(MMC3_cmd);
513 static void M44Power(void)
517 SetWriteHandler(0xA000,0xBFFF,M44Write);
520 void Mapper44_Init(CartInfo *info)
522 GenMMC3_Init(info, 512, 256, 8, info->battery);
525 info->Power=M44Power;
526 AddExState(EXPREGS, 1, 0, "EXPR");
529 // ---------------------------- Mapper 45 -------------------------------
531 static void M45CW(uint32 A, uint8 V)
537 NV&=(1<<((EXPREGS[2]&7)+1))-1;
540 NV|=EXPREGS[0]|((EXPREGS[2]&0xF0)<<4);
545 static void M45PW(uint32 A, uint8 V)
547 V&=(EXPREGS[3]&0x3F)^0x3F;
552 static DECLFW(M45Write)
559 EXPREGS[EXPREGS[4]]=V;
560 EXPREGS[4]=(EXPREGS[4]+1)&3;
563 FCEU_printf("CHROR %02x, PRGOR %02x, CHRAND %02x, PRGAND %02x\n",EXPREGS[0],EXPREGS[1],EXPREGS[2],EXPREGS[3]);
564 FCEU_printf("CHR0 %03x, CHR1 %03x, PRG0 %03x, PRG1 %03x\n",
565 (0x00&((1<<((EXPREGS[2]&7)+1))-1))|(EXPREGS[0]|((EXPREGS[2]&0xF0)<<4)),
566 (0xFF&((1<<((EXPREGS[2]&7)+1))-1))|(EXPREGS[0]|((EXPREGS[2]&0xF0)<<4)),
567 (0x00&((EXPREGS[3]&0x3F)^0x3F))|(EXPREGS[1]),
568 (0xFF&((EXPREGS[3]&0x3F)^0x3F))|(EXPREGS[1]));
570 FixMMC3PRG(MMC3_cmd);
571 FixMMC3CHR(MMC3_cmd);
574 static void M45Reset(void)
576 EXPREGS[0]=EXPREGS[1]=EXPREGS[2]=EXPREGS[3]=EXPREGS[4]=0;
580 static void M45Power(void)
584 SetWriteHandler(0x6000,0x7FFF,M45Write);
587 void Mapper45_Init(CartInfo *info)
589 GenMMC3_Init(info, 512, 256, 8, info->battery);
592 info->Reset=M45Reset;
593 info->Power=M45Power;
594 AddExState(EXPREGS, 5, 0, "EXPR");
597 // ---------------------------- Mapper 47 -------------------------------
599 static void M47PW(uint32 A, uint8 V)
606 static void M47CW(uint32 A, uint8 V)
614 static DECLFW(M47Write)
617 FixMMC3PRG(MMC3_cmd);
618 FixMMC3CHR(MMC3_cmd);
621 static void M47Power(void)
625 SetWriteHandler(0x6000,0x7FFF,M47Write);
626 // SetReadHandler(0x6000,0x7FFF,0);
629 void Mapper47_Init(CartInfo *info)
631 GenMMC3_Init(info, 512, 256, 8, info->battery);
634 info->Power=M47Power;
635 AddExState(EXPREGS, 1, 0, "EXPR");
638 // ---------------------------- Mapper 49 -------------------------------
640 static void M49PW(uint32 A, uint8 V)
645 V|=(EXPREGS[0]&0xC0)>>2;
649 setprg32(0x8000,(EXPREGS[0]>>4)&3);
652 static void M49CW(uint32 A, uint8 V)
656 NV|=(EXPREGS[0]&0xC0)<<1;
660 static DECLFW(M49Write)
665 FixMMC3PRG(MMC3_cmd);
666 FixMMC3CHR(MMC3_cmd);
670 static void M49Reset(void)
676 static void M49Power(void)
680 SetWriteHandler(0x6000,0x7FFF,M49Write);
681 SetReadHandler(0x6000,0x7FFF,0);
684 void Mapper49_Init(CartInfo *info)
686 GenMMC3_Init(info, 512, 256, 0, 0);
689 info->Reset=M49Reset;
690 info->Power=M49Power;
691 AddExState(EXPREGS, 1, 0, "EXPR");
694 // ---------------------------- Mapper 52 -------------------------------
696 static void M52PW(uint32 A, uint8 V)
699 NV&=0x1F^((EXPREGS[0]&8)<<1);
700 NV|=((EXPREGS[0]&6)|((EXPREGS[0]>>3)&EXPREGS[0]&1))<<4;
704 static void M52CW(uint32 A, uint8 V)
707 NV&=0xFF^((EXPREGS[0]&0x40)<<1);
708 NV|=(((EXPREGS[0]>>3)&4)|((EXPREGS[0]>>1)&2)|((EXPREGS[0]>>6)&(EXPREGS[0]>>4)&1))<<7;
712 static DECLFW(M52Write)
721 FixMMC3PRG(MMC3_cmd);
722 FixMMC3CHR(MMC3_cmd);
725 static void M52Reset(void)
727 EXPREGS[0]=EXPREGS[1]=0;
731 static void M52Power(void)
735 SetWriteHandler(0x6000,0x7FFF,M52Write);
738 void Mapper52_Init(CartInfo *info)
740 GenMMC3_Init(info, 512, 256, 8, info->battery);
743 info->Reset=M52Reset;
744 info->Power=M52Power;
745 AddExState(EXPREGS, 2, 0, "EXPR");
748 // ---------------------------- Mapper 74 -------------------------------
750 static void M74CW(uint32 A, uint8 V)
752 if((V==8)||(V==9)) //Di 4 Ci - Ji Qi Ren Dai Zhan (As).nes, Ji Jia Zhan Shi (As).nes
758 void Mapper74_Init(CartInfo *info)
760 GenMMC3_Init(info, 512, 256, 8, info->battery);
763 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
764 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
765 AddExState(CHRRAM, CHRRAMSize, 0, "CHRR");
768 // ---------------------------- Mapper 114 ------------------------------
771 uint8 m114_perm[8] = {0, 3, 1, 5, 6, 7, 2, 4};
773 static void M114PWRAP(uint32 A, uint8 V)
777 setprg16(0x8000,EXPREGS[0]&0xF);
778 setprg16(0xC000,EXPREGS[0]&0xF);
784 static DECLFW(M114Write)
795 X6502_IRQEnd(FCEU_IQEXT);
797 else switch(A&0xE000)
799 case 0x8000: setmirror((V&1)^1); break;
800 case 0xA000: MMC3_CMDWrite(0x8000,(V&0xC0)|(m114_perm[V&7])); cmdin=1; break;
801 case 0xC000: if(!cmdin) break;
802 MMC3_CMDWrite(0x8001,V);
808 static DECLFW(M114ExWrite)
813 FixMMC3PRG(MMC3_cmd);
817 static void M114Power(void)
820 SetWriteHandler(0x8000,0xFFFF,M114Write);
821 SetWriteHandler(0x5000,0x7FFF,M114ExWrite);
824 static void M114Reset(void)
830 void Mapper114_Init(CartInfo *info)
832 GenMMC3_Init(info, 256, 256, 0, 0);
834 info->Power=M114Power;
835 info->Reset=M114Reset;
836 AddExState(EXPREGS, 1, 0, "EXPR");
837 AddExState(&cmdin, 1, 0, "CMDIN");
840 // ---------------------------- Mapper 115 ------------------------------
842 static void M115PW(uint32 A, uint8 V)
845 setprg32(0x8000,(EXPREGS[0]&7)>>1);
850 static void M115CW(uint32 A, uint8 V)
852 setchr1(A,(uint32)V|((EXPREGS[1]&1)<<8));
855 static DECLFW(M115Write)
861 FixMMC3PRG(MMC3_cmd);
864 static void M115Power(void)
867 SetWriteHandler(0x4100,0x7FFF,M115Write);
868 SetReadHandler(0x4100,0x7FFF,0);
871 void Mapper115_Init(CartInfo *info)
873 GenMMC3_Init(info, 128, 512, 0, 0);
876 info->Power=M115Power;
877 AddExState(EXPREGS, 2, 0, "EXPR");
880 // ---------------------------- Mapper 116 ------------------------------
882 static void M116CW(uint32 A, uint8 V)
884 // setchr1(A,V|((EXPREGS[0]&0x4)<<6));
891 static DECLFW(M116Write)
894 FixMMC3CHR(MMC3_cmd);
897 static void M116Power(void)
900 SetWriteHandler(0x4100,0x4100,M116Write);
903 void Mapper116_Init(CartInfo *info)
905 GenMMC3_Init(info, 128, 512, 0, 0);
907 info->Power=M116Power;
908 CHRRAM = (uint8*)FCEU_gmalloc(8192);
909 SetupCartCHRMapping(0x10, CHRRAM, 8192, 1);
910 AddExState(EXPREGS, 4, 0, "EXPR");
913 // ---------------------------- Mapper 118 ------------------------------
915 static uint8 PPUCHRBus;
916 static uint8 TKSMIR[8];
918 static void FP_FASTAPASS(1) TKSPPU(uint32 A)
923 setmirror(MI_0+TKSMIR[A]);
926 static void TKSWRAP(uint32 A, uint8 V)
930 if(PPUCHRBus==(A>>10))
931 setmirror(MI_0+(V>>7));
934 void Mapper118_Init(CartInfo *info)
936 GenMMC3_Init(info, 512, 256, 8, info->battery);
940 AddExState(&PPUCHRBus, 1, 0, "PPUC");
943 // ---------------------------- Mapper 119 ------------------------------
945 static void TQWRAP(uint32 A, uint8 V)
947 setchr1r((V&0x40)>>2,A,V&0x3F);
950 void Mapper119_Init(CartInfo *info)
952 GenMMC3_Init(info, 512, 64, 0, 0);
955 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
956 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
959 // ---------------------------- Mapper 165 ------------------------------
961 static void M165CW(uint32 A, uint8 V)
969 static void M165PPUFD(void)
973 M165CW(0x0000,DRegBuf[0]);
974 M165CW(0x1000,DRegBuf[2]);
978 static void M165PPUFE(void)
982 M165CW(0x0000,DRegBuf[1]);
983 M165CW(0x1000,DRegBuf[4]);
987 static void M165CWM(uint32 A, uint8 V)
989 if(((MMC3_cmd&0x7)==0)||((MMC3_cmd&0x7)==2))
991 if(((MMC3_cmd&0x7)==1)||((MMC3_cmd&0x7)==4))
995 static void FP_FASTAPASS(1) M165PPU(uint32 A)
997 if((A&0x1FF0)==0x1FD0)
1001 } else if((A&0x1FF0)==0x1FE0)
1008 static void M165Power(void)
1014 void Mapper165_Init(CartInfo *info)
1016 GenMMC3_Init(info, 512, 128, 8, info->battery);
1019 info->Power=M165Power;
1021 CHRRAM = (uint8*)FCEU_gmalloc(CHRRAMSize);
1022 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
1023 AddExState(CHRRAM, CHRRAMSize, 0, "CHRR");
1024 AddExState(EXPREGS, 4, 0, "EXPR");
1027 // ---------------------------- Mapper 182 ------------------------------
1028 // òà áëèöà ïåðìóòà öè à Ãà ëîãè÷Ãà 114 ìà ïïåðó, ðåãèñòðû ìà ïïåðà ãîðà çäî ñëîæÃåå,
1029 // ÷åì èñïîëüçóþòñÿ çäåñü, õîòÿ âñå ïðåêðà ñÃî ðà áîòà åò.
1031 //static uint8 m182_perm[8] = {0, 3, 1, 5, 6, 7, 2, 4};
1032 static DECLFW(M182Write)
1036 case 0x8001: setmirror((V&1)^1); break;
1037 case 0xA000: MMC3_CMDWrite(0x8000,m114_perm[V&7]); break;
1038 case 0xC000: MMC3_CMDWrite(0x8001,V); break;
1045 X6502_IRQEnd(FCEU_IQEXT);
1050 static void M182Power(void)
1053 SetWriteHandler(0x8000,0xFFFF,M182Write);
1056 void Mapper182_Init(CartInfo *info)
1058 GenMMC3_Init(info, 256, 256, 0, 0);
1059 info->Power=M182Power;
1062 // ---------------------------- Mapper 191 ------------------------------
1064 static void M191CW(uint32 A, uint8 V)
1066 setchr1r((V&0x80)>>3,A,V);
1069 void Mapper191_Init(CartInfo *info)
1071 GenMMC3_Init(info, 256, 256, 8, info->battery);
1074 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
1075 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
1076 AddExState(CHRRAM, CHRRAMSize, 0, "CHRR");
1079 // ---------------------------- Mapper 192 -------------------------------
1081 static void M192CW(uint32 A, uint8 V)
1083 if((V==8)||(V==9)||(V==0xA)||(V==0xB)) //Ying Lie Qun Xia Zhuan (Chinese),
1089 void Mapper192_Init(CartInfo *info)
1091 GenMMC3_Init(info, 512, 256, 8, info->battery);
1094 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
1095 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
1096 AddExState(CHRRAM, CHRRAMSize, 0, "CHRR");
1099 // ---------------------------- Mapper 194 -------------------------------
1101 static void M194CW(uint32 A, uint8 V)
1103 if(V<=1) //Dai-2-Ji - Super Robot Taisen (As).nes
1109 void Mapper194_Init(CartInfo *info)
1111 GenMMC3_Init(info, 512, 256, 8, info->battery);
1114 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
1115 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
1116 AddExState(CHRRAM, CHRRAMSize, 0, "CHRR");
1119 // ---------------------------- Mapper 198 -------------------------------
1121 static uint8 *wramtw;
1122 static uint16 wramsize;
1123 static void M198CW(uint32 A, uint8 V)
1125 if(V<=3) // Crystalis (c).nes, Captain Tsubasa Vol 2 - Super Striker (C)
1131 static void M198Power(void)
1134 setprg4r(0x10,0x5000,0);
1135 SetWriteHandler(0x5000,0x5fff,CartBW);
1136 SetReadHandler(0x5000,0x5fff,CartBR);
1139 static void M198Close(void)
1146 void Mapper198_Init(CartInfo *info)
1148 GenMMC3_Init(info, 512, 256, 8, info->battery);
1150 info->Power=M198Power;
1151 info->Close=M198Close;
1153 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
1154 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
1156 wramtw=(uint8*)FCEU_gmalloc(wramsize);
1157 SetupCartPRGMapping(0x10, wramtw, wramsize, 1);
1158 AddExState(CHRRAM, CHRRAMSize, 0, "CHRR");
1159 AddExState(wramtw, wramsize, 0, "WRAMTW");
1162 // ---------------------------- Mapper 199 -------------------------------
1164 static uint8 *wramtw;
1165 static uint16 wramsize;
1166 static void M199PW(uint32 A, uint8 V)
1174 void Mapper199_Init(CartInfo *info)
1176 GenMMC3_Init(info, 1024, 256, 8, info->battery);
1178 info->Power=M198Power;
1179 info->Close=M198Close;
1181 wramtw=(uint8*)FCEU_gmalloc(wramsize);
1182 SetupCartPRGMapping(0x10, wramtw, wramsize, 1);
1183 AddExState(CHRRAM, CHRRAMSize, 0, "CHRR");
1184 AddExState(wramtw, wramsize, 0, "WRAMTW");
1187 // ---------------------------- Mapper 205 ------------------------------
1189 static void M205PW(uint32 A, uint8 V)
1192 setprg8(A,(V&0x0f)|((EXPREGS[0]&3)<<4));
1194 setprg8(A,(V&0x1f)|((EXPREGS[0]&3)<<4));
1197 static void M205CW(uint32 A, uint8 V)
1199 setchr1(A,V|((EXPREGS[0]&3)<<7));
1202 static DECLFW(M205Write)
1204 if((A&0x6800)==0x6800) EXPREGS[0]= V;
1205 FixMMC3PRG(MMC3_cmd);
1206 FixMMC3CHR(MMC3_cmd);
1209 static void M205Reset(void)
1215 static void M205Power(void)
1218 SetWriteHandler(0x4020,0x7FFF,M205Write);
1221 void Mapper205_Init(CartInfo *info)
1223 GenMMC3_Init(info, 512, 256, 8, 0);
1226 info->Power=M205Power;
1227 info->Reset=M205Reset;
1228 AddExState(EXPREGS, 1, 0, "EXPR");
1231 // ---------------------------- Mapper 215 ------------------------------
1233 static uint8 m215_perm[8] = {0, 2, 5, 3, 6, 1, 7, 4};
1235 static void M215CW(uint32 A, uint8 V)
1240 setchr1(A,(V&0x7F)|((EXPREGS[1]&0x10)<<3));
1243 static void M215PW(uint32 A, uint8 V)
1247 setprg16(0x8000,(EXPREGS[0]&0x0F)|(EXPREGS[1]&0x10));
1248 setprg16(0xC000,(EXPREGS[0]&0x0F)|(EXPREGS[1]&0x10));
1250 else if(EXPREGS[1]&0x08)
1251 setprg8(A,(V&0x1F)|0x20);
1253 setprg8(A,(V&0x0F)|(EXPREGS[1]&0x10));
1256 static DECLFW(M215Write)
1265 else switch(A&0xE001)
1267 case 0xC001: IRQLatch=V; break;
1268 case 0xA001: IRQReload=1; break;
1269 case 0xE001: IRQa=1; break;
1270 case 0xE000: X6502_IRQEnd(FCEU_IQEXT); IRQa=0; break;
1271 case 0xC000: setmirror(((V|(V>>7))&1)^1); break;
1272 case 0xA000: MMC3_CMDWrite(0x8000,(V&0xC0)|(m215_perm[V&7])); cmdin=1; break;
1273 case 0x8001: if(!cmdin) break;
1274 MMC3_CMDWrite(0x8001,V);
1280 static DECLFW(M215ExWrite)
1286 FixMMC3PRG(MMC3_cmd);
1290 FixMMC3CHR(MMC3_cmd);
1299 static void M215Power(void)
1305 SetWriteHandler(0x8000,0xFFFF,M215Write);
1306 SetWriteHandler(0x5000,0x7FFF,M215ExWrite);
1309 void Mapper215_Init(CartInfo *info)
1311 GenMMC3_Init(info, 256, 256, 0, 0);
1314 info->Power=M215Power;
1315 AddExState(EXPREGS, 3, 0, "EXPR");
1316 AddExState(&cmdin, 1, 0, "CMDIN");
1319 // ---------------------------- Mapper 217 ------------------------------
1321 static uint8 m217_perm[8] = {0, 6, 3, 7, 5, 2, 4, 1};
1323 static void M217CW(uint32 A, uint8 V)
1326 setchr1(A,V|((EXPREGS[1]&3)<<8));
1328 setchr1(A,(V&0x7F)|((EXPREGS[1]&3)<<8)|((EXPREGS[1]&0x10)<<3));
1331 static void M217PW(uint32 A, uint8 V)
1335 setprg16(0x8000,(EXPREGS[0]&0x0F)|((EXPREGS[1]&3)<<4));
1336 setprg16(0xC000,(EXPREGS[0]&0x0F)|((EXPREGS[1]&3)<<4));
1338 else if(EXPREGS[1]&0x08)
1339 setprg8(A,(V&0x1F)|((EXPREGS[1]&3)<<5));
1341 setprg8(A,(V&0x0F)|((EXPREGS[1]&3)<<5)|(EXPREGS[1]&0x10));
1344 static DECLFW(M217Write)
1349 MMC3_IRQWrite(A, V);
1353 else switch(A&0xE001)
1355 case 0x8000: IRQCount=V; break;
1356 case 0xE000: X6502_IRQEnd(FCEU_IQEXT);IRQa=0; break;
1357 case 0xC001: IRQa=1; break;
1358 case 0xA001: setmirror((V&1)^1); break;
1359 case 0x8001: MMC3_CMDWrite(0x8000,(V&0xC0)|(m217_perm[V&7])); cmdin=1; break;
1360 case 0xA000: if(!cmdin) break;
1361 MMC3_CMDWrite(0x8001,V);
1367 static DECLFW(M217ExWrite)
1373 FixMMC3PRG(MMC3_cmd);
1377 FixMMC3PRG(MMC3_cmd);
1385 static void M217Power(void)
1391 SetWriteHandler(0x8000,0xFFFF,M217Write);
1392 SetWriteHandler(0x5000,0x7FFF,M217ExWrite);
1395 void Mapper217_Init(CartInfo *info)
1397 GenMMC3_Init(info, 256, 256, 0, 0);
1400 info->Power=M217Power;
1401 AddExState(EXPREGS, 3, 0, "EXPR");
1402 AddExState(&cmdin, 1, 0, "CMDIN");
1405 // ---------------------------- Mapper 245 ------------------------------
1407 static void M245CW(uint32 A, uint8 V)
1411 FixMMC3PRG(MMC3_cmd);
1414 static void M245PW(uint32 A, uint8 V)
1416 setprg8(A,(V&0x3F)|((EXPREGS[0]&2)<<5));
1419 static void M245Power(void)
1425 void Mapper245_Init(CartInfo *info)
1427 GenMMC3_Init(info, 512, 256, 8, info->battery);
1430 info->Power=M245Power;
1431 AddExState(EXPREGS, 1, 0, "EXPR");
1434 // ---------------------------- Mapper 249 ------------------------------
1436 static void M249PW(uint32 A, uint8 V)
1441 V=(V&1)|((V>>3)&2)|((V>>1)&4)|((V<<2)&8)|((V<<2)&0x10);
1445 V=(V&3)|((V>>1)&4)|((V>>4)&8)|((V>>2)&0x10)|((V<<3)&0x20)|((V<<2)&0xC0);
1451 static void M249CW(uint32 A, uint8 V)
1454 V=(V&3)|((V>>1)&4)|((V>>4)&8)|((V>>2)&0x10)|((V<<3)&0x20)|((V<<2)&0xC0);
1458 static DECLFW(M249Write)
1461 FixMMC3PRG(MMC3_cmd);
1462 FixMMC3CHR(MMC3_cmd);
1465 static void M249Power(void)
1469 SetWriteHandler(0x5000,0x5000,M249Write);
1472 void Mapper249_Init(CartInfo *info)
1474 GenMMC3_Init(info, 512, 256, 8, info->battery);
1477 info->Power=M249Power;
1478 AddExState(EXPREGS, 1, 0, "EXPR");
1481 // ---------------------------- Mapper 250 ------------------------------
1483 static DECLFW(M250Write)
1485 MMC3_CMDWrite((A&0xE000)|((A&0x400)>>10),A&0xFF);
1488 static DECLFW(M250IRQWrite)
1490 MMC3_IRQWrite((A&0xE000)|((A&0x400)>>10),A&0xFF);
1493 static void M250_Power(void)
1496 SetWriteHandler(0x8000,0xBFFF,M250Write);
1497 SetWriteHandler(0xC000,0xFFFF,M250IRQWrite);
1500 void Mapper250_Init(CartInfo *info)
1502 GenMMC3_Init(info, 512, 256, 8, info->battery);
1503 info->Power=M250_Power;
1506 // ---------------------------- Mapper 254 ------------------------------
1508 static DECLFR(MR254WRAM)
1511 return WRAM[A-0x6000];
1513 return WRAM[A-0x6000]^EXPREGS[1];
1516 static DECLFW(M254Write)
1519 case 0x8000: EXPREGS[0]=0xff;
1521 case 0xA001: EXPREGS[1]=V;
1526 static void M254_Power(void)
1529 SetWriteHandler(0x8000,0xBFFF,M254Write);
1530 SetReadHandler(0x6000,0x7FFF,MR254WRAM);
1533 void Mapper254_Init(CartInfo *info)
1535 GenMMC3_Init(info, 128, 128, 8, info->battery);
1536 info->Power=M254_Power;
1537 AddExState(EXPREGS, 2, 0, "EXPR");
1540 // ---------------------------- UNIF Boards -----------------------------
1542 void TEROM_Init(CartInfo *info)
1544 GenMMC3_Init(info, 32, 32, 0, 0);
1547 void TFROM_Init(CartInfo *info)
1549 GenMMC3_Init(info, 512, 64, 0, 0);
1552 void TGROM_Init(CartInfo *info)
1554 GenMMC3_Init(info, 512, 0, 0, 0);
1557 void TKROM_Init(CartInfo *info)
1559 GenMMC3_Init(info, 512, 256, 8, info->battery);
1562 void TLROM_Init(CartInfo *info)
1564 GenMMC3_Init(info, 512, 256, 0, 0);
1567 void TSROM_Init(CartInfo *info)
1569 GenMMC3_Init(info, 512, 256, 8, 0);
1572 void TLSROM_Init(CartInfo *info)
1574 GenMMC3_Init(info, 512, 256, 8, 0);
1578 AddExState(&PPUCHRBus, 1, 0, "PPUC");
1581 void TKSROM_Init(CartInfo *info)
1583 GenMMC3_Init(info, 512, 256, 8, info->battery);
1587 AddExState(&PPUCHRBus, 1, 0, "PPUC");
1590 void TQROM_Init(CartInfo *info)
1592 GenMMC3_Init(info, 512, 64, 0, 0);
1595 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
1596 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
1599 void HKROM_Init(CartInfo *info)
1601 GenMMC3_Init(info, 512, 512, 1, info->battery);