1 /* FCE Ultra - NES/Famicom Emulator
\r
3 * Copyright notice for this file:
\r
4 * Copyright (C) 1998 BERO
\r
5 * Copyright (C) 2003 Xodnizel
\r
6 * Mapper 12 code Copyright (C) 2003 CaH4e3
\r
8 * This program is free software; you can redistribute it and/or modify
\r
9 * it under the terms of the GNU General Public License as published by
\r
10 * the Free Software Foundation; either version 2 of the License, or
\r
11 * (at your option) any later version.
\r
13 * This program is distributed in the hope that it will be useful,
\r
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
16 * GNU General Public License for more details.
\r
18 * You should have received a copy of the GNU General Public License
\r
19 * along with this program; if not, write to the Free Software
\r
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
\r
23 /* Code for emulating iNES mappers 4,12,44,45,47,49,52,74,114,115,116,118,
\r
24 119,165,205,214,215,245,249,250,254
\r
35 uint8 EXPREGS[8]; /* For bootleg games, mostly. */
\r
41 uint8 IRQCount,IRQLatch,IRQa;
\r
44 static SFORMAT MMC3_StateRegs[]=
\r
46 {DRegBuf, 8, "REGS"},
\r
47 {&MMC3_cmd, 1, "CMD"},
\r
48 {&A000B, 1, "A000"},
\r
49 {&A001B, 1, "A001"},
\r
50 {&IRQReload, 1, "IRQR"},
\r
51 {&IRQCount, 1, "IRQC"},
\r
52 {&IRQLatch, 1, "IRQL"},
\r
57 static int mmc3opts=0;
\r
59 static int isRevB=1;
\r
61 void (*pwrap)(uint32 A, uint8 V);
\r
62 void (*cwrap)(uint32 A, uint8 V);
\r
63 void (*mwrap)(uint8 V);
\r
65 void GenMMC3Power(void);
\r
66 void FixMMC3PRG(int V);
\r
67 void FixMMC3CHR(int V);
\r
69 void GenMMC3_Init(CartInfo *info, int prg, int chr, int wram, int battery);
\r
71 // ----------------------------------------------------------------------
\r
72 // ------------------------- Generic MM3 Code ---------------------------
\r
73 // ----------------------------------------------------------------------
\r
75 void FixMMC3PRG(int V)
\r
79 pwrap(0xC000,DRegBuf[6]);
\r
84 pwrap(0x8000,DRegBuf[6]);
\r
87 pwrap(0xA000,DRegBuf[7]);
\r
91 void FixMMC3CHR(int V)
\r
93 int cbase=(V&0x80)<<5;
\r
95 cwrap((cbase^0x000),DRegBuf[0]&(~1));
\r
96 cwrap((cbase^0x400),DRegBuf[0]|1);
\r
97 cwrap((cbase^0x800),DRegBuf[1]&(~1));
\r
98 cwrap((cbase^0xC00),DRegBuf[1]|1);
\r
100 cwrap(cbase^0x1000,DRegBuf[2]);
\r
101 cwrap(cbase^0x1400,DRegBuf[3]);
\r
102 cwrap(cbase^0x1800,DRegBuf[4]);
\r
103 cwrap(cbase^0x1c00,DRegBuf[5]);
\r
105 if(mwrap) mwrap(A000B);
\r
108 void MMC3RegReset(void)
\r
110 IRQCount=IRQLatch=IRQa=MMC3_cmd=0;
\r
125 DECLFW(MMC3_CMDWrite)
\r
127 // FCEU_printf("bs %04x %02x\n",A,V);
\r
131 if((V&0x40) != (MMC3_cmd&0x40))
\r
133 if((V&0x80) != (MMC3_cmd&0x80))
\r
139 int cbase=(MMC3_cmd&0x80)<<5;
\r
140 DRegBuf[MMC3_cmd&0x7]=V;
\r
141 switch(MMC3_cmd&0x07)
\r
143 case 0: cwrap((cbase^0x000),V&(~1));
\r
144 cwrap((cbase^0x400),V|1);
\r
146 case 1: cwrap((cbase^0x800),V&(~1));
\r
147 cwrap((cbase^0xC00),V|1);
\r
149 case 2: cwrap(cbase^0x1000,V);
\r
151 case 3: cwrap(cbase^0x1400,V);
\r
153 case 4: cwrap(cbase^0x1800,V);
\r
155 case 5: cwrap(cbase^0x1C00,V);
\r
170 if(mwrap) mwrap(V);
\r
178 DECLFW(MMC3_IRQWrite)
\r
180 // FCEU_printf("%04x:%04x\n",A,V);
\r
183 case 0xC000:IRQLatch=V;break;
\r
184 case 0xC001:IRQReload=1;break;
\r
185 case 0xE000:X6502_IRQEnd(FCEU_IQEXT);IRQa=0;break;
\r
186 case 0xE001:IRQa=1;break;
\r
190 static void ClockMMC3Counter(void)
\r
192 int count = IRQCount;
\r
193 if(!count || IRQReload)
\r
195 IRQCount = IRQLatch;
\r
200 if((count|isRevB) && !IRQCount)
\r
204 X6502_IRQBegin(FCEU_IQEXT);
\r
209 static void MMC3_hb(void)
\r
211 ClockMMC3Counter();
\r
214 static void MMC3_hb_KickMasterHack(void)
\r
216 if(scanline==238) ClockMMC3Counter();
\r
217 ClockMMC3Counter();
\r
220 static void MMC3_hb_PALStarWarsHack(void)
\r
222 if(scanline==240) ClockMMC3Counter();
\r
223 ClockMMC3Counter();
\r
226 void GenMMC3Restore(int version)
\r
228 FixMMC3PRG(MMC3_cmd);
\r
229 FixMMC3CHR(MMC3_cmd);
\r
232 static void GENCWRAP(uint32 A, uint8 V)
\r
234 setchr1(A,V); // Business Wars NEEDS THIS for 8K CHR-RAM
\r
237 static void GENPWRAP(uint32 A, uint8 V)
\r
239 setprg8(A,V&0x7F); // [NJ102] Mo Dao Jie (C) has 1024Mb MMC3 BOARD, maybe something other will be broken
\r
242 static void GENMWRAP(uint8 V)
\r
245 setmirror((V&1)^1);
\r
248 static void GENNOMWRAP(uint8 V)
\r
253 static DECLFW(MBWRAMMMC6)
\r
258 static DECLFR(MAWRAMMMC6)
\r
260 return(WRAM[A&0x3ff]);
\r
263 void GenMMC3Power(void)
\r
265 if(UNIFchrrama) setchr8(0);
\r
267 SetWriteHandler(0x8000,0xBFFF,MMC3_CMDWrite);
\r
268 SetWriteHandler(0xC000,0xFFFF,MMC3_IRQWrite);
\r
269 SetReadHandler(0x8000,0xFFFF,CartBR);
\r
276 FCEU_CheatAddRAM(1,0x7000,WRAM);
\r
277 SetReadHandler(0x7000,0x7FFF,MAWRAMMMC6);
\r
278 SetWriteHandler(0x7000,0x7FFF,MBWRAMMMC6);
\r
282 FCEU_CheatAddRAM((wrams&0x1fff)>>10,0x6000,WRAM);
\r
283 SetWriteHandler(0x6000,0x6000 + ((wrams - 1) & 0x1fff),CartBW);
\r
284 SetReadHandler(0x6000,0x6000 + ((wrams - 1) & 0x1fff),CartBR);
\r
285 setprg8r(0x10,0x6000,0);
\r
288 FCEU_dwmemset(WRAM,0,wrams);
\r
292 FCEU_dwmemset(CHRRAM,0,CHRRAMSize);
\r
295 static void GenMMC3Close(void)
\r
298 FCEU_gfree(CHRRAM);
\r
304 void GenMMC3_Init(CartInfo *info, int prg, int chr, int wram, int battery)
\r
312 PRGmask8[0]&=(prg>>13)-1;
\r
313 CHRmask1[0]&=(chr>>10)-1;
\r
314 CHRmask2[0]&=(chr>>11)-1;
\r
319 WRAM=(uint8*)FCEU_gmalloc(wrams);
\r
320 SetupCartPRGMapping(0x10,WRAM,wrams,1);
\r
321 AddExState(WRAM, wrams, 0, "MMC3WRAM");
\r
327 info->SaveGame[0]=WRAM;
\r
328 info->SaveGameLen[0]=wrams;
\r
331 AddExState(MMC3_StateRegs, ~0, 0, 0);
\r
333 info->Power=GenMMC3Power;
\r
334 info->Reset=MMC3RegReset;
\r
335 info->Close=GenMMC3Close;
\r
337 if(info->CRC32 == 0x5104833e) // Kick Master
\r
338 GameHBIRQHook = MMC3_hb_KickMasterHack;
\r
339 else if(info->CRC32 == 0x5a6860f1 || info->CRC32 == 0xae280e20) // Shougi Meikan '92/'93
\r
340 GameHBIRQHook = MMC3_hb_KickMasterHack;
\r
341 else if(info->CRC32 == 0xfcd772eb) // PAL Star Wars, similar problem as Kick Master.
\r
342 GameHBIRQHook = MMC3_hb_PALStarWarsHack;
\r
344 GameHBIRQHook=MMC3_hb;
\r
345 GameStateRestore=GenMMC3Restore;
\r
348 // ----------------------------------------------------------------------
\r
349 // -------------------------- MMC3 Based Code ---------------------------
\r
350 // ----------------------------------------------------------------------
\r
352 // ---------------------------- Mapper 4 --------------------------------
\r
354 static int hackm4=0;/* For Karnov, maybe others. BLAH. Stupid iNES format.*/
\r
356 static void M4Power(void)
\r
359 A000B=(hackm4^1)&1;
\r
363 void Mapper4_Init(CartInfo *info)
\r
367 if((info->CRC32==0x93991433 || info->CRC32==0xaf65aa84))
\r
369 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");
\r
372 GenMMC3_Init(info,512,256,ws,info->battery);
\r
373 info->Power=M4Power;
\r
374 hackm4=info->mirror;
\r
377 // ---------------------------- Mapper 12 -------------------------------
\r
379 static void M12CW(uint32 A, uint8 V)
\r
381 setchr1(A,(EXPREGS[(A&0x1000)>>12]<<8)+V);
\r
384 static DECLFW(M12Write)
\r
387 EXPREGS[1]=(V&0x10)>>4;
\r
390 static void M12Power(void)
\r
392 EXPREGS[0]=EXPREGS[1]=0;
\r
394 SetWriteHandler(0x4100,0x5FFF,M12Write);
\r
397 void Mapper12_Init(CartInfo *info)
\r
399 GenMMC3_Init(info, 512, 256, 8, info->battery);
\r
403 info->Power=M12Power;
\r
404 AddExState(EXPREGS, 2, 0, "EXPR");
\r
407 // ---------------------------- Mapper 37 -------------------------------
\r
409 static void M37PW(uint32 A, uint8 V)
\r
419 static void M37CW(uint32 A, uint8 V)
\r
427 static DECLFW(M37Write)
\r
429 EXPREGS[0]=(V&6)>>1;
\r
430 FixMMC3PRG(MMC3_cmd);
\r
431 FixMMC3CHR(MMC3_cmd);
\r
434 static void M37Reset(void)
\r
440 static void M37Power(void)
\r
444 SetWriteHandler(0x6000,0x7FFF,M37Write);
\r
447 void Mapper37_Init(CartInfo *info)
\r
449 GenMMC3_Init(info, 512, 256, 8, info->battery);
\r
452 info->Power=M37Power;
\r
453 info->Reset=M37Reset;
\r
454 AddExState(EXPREGS, 1, 0, "EXPR");
\r
457 // ---------------------------- Mapper 44 -------------------------------
\r
459 static void M44PW(uint32 A, uint8 V)
\r
462 if(EXPREGS[0]>=6) NV&=0x1F;
\r
468 static void M44CW(uint32 A, uint8 V)
\r
471 if(EXPREGS[0]<6) NV&=0x7F;
\r
476 static DECLFW(M44Write)
\r
481 FixMMC3PRG(MMC3_cmd);
\r
482 FixMMC3CHR(MMC3_cmd);
\r
485 MMC3_CMDWrite(A,V);
\r
488 static void M44Power(void)
\r
492 SetWriteHandler(0xA000,0xBFFF,M44Write);
\r
495 void Mapper44_Init(CartInfo *info)
\r
497 GenMMC3_Init(info, 512, 256, 8, info->battery);
\r
500 info->Power=M44Power;
\r
501 AddExState(EXPREGS, 1, 0, "EXPR");
\r
504 // ---------------------------- Mapper 45 -------------------------------
\r
506 static void M45CW(uint32 A, uint8 V)
\r
512 NV&=(1<<((EXPREGS[2]&7)+1))-1;
\r
515 NV&=0; // hack ;( don't know exactly how it should be
\r
516 NV|=EXPREGS[0]|((EXPREGS[2]&0xF0)<<4);
\r
521 static void M45PW(uint32 A, uint8 V)
\r
523 V&=(EXPREGS[3]&0x3F)^0x3F;
\r
528 static DECLFW(M45Write)
\r
530 if(EXPREGS[3]&0x40)
\r
535 EXPREGS[EXPREGS[4]]=V;
\r
536 EXPREGS[4]=(EXPREGS[4]+1)&3;
\r
537 // if(!EXPREGS[4])
\r
539 // FCEU_printf("CHROR %02x, PRGOR %02x, CHRAND %02x, PRGAND %02x\n",EXPREGS[0],EXPREGS[1],EXPREGS[2],EXPREGS[3]);
\r
540 // FCEU_printf("CHR0 %03x, CHR1 %03x, PRG0 %03x, PRG1 %03x\n",
\r
541 // (0x00&((1<<((EXPREGS[2]&7)+1))-1))|(EXPREGS[0]|((EXPREGS[2]&0xF0)<<4)),
\r
542 // (0xFF&((1<<((EXPREGS[2]&7)+1))-1))|(EXPREGS[0]|((EXPREGS[2]&0xF0)<<4)),
\r
543 // (0x00&((EXPREGS[3]&0x3F)^0x3F))|(EXPREGS[1]),
\r
544 // (0xFF&((EXPREGS[3]&0x3F)^0x3F))|(EXPREGS[1]));
\r
546 FixMMC3PRG(MMC3_cmd);
\r
547 FixMMC3CHR(MMC3_cmd);
\r
550 static void M45Reset(void)
\r
552 EXPREGS[0]=EXPREGS[1]=EXPREGS[2]=EXPREGS[3]=EXPREGS[4]=0;
\r
556 static void M45Power(void)
\r
560 SetWriteHandler(0x6000,0x7FFF,M45Write);
\r
563 void Mapper45_Init(CartInfo *info)
\r
565 GenMMC3_Init(info, 512, 256, 8, info->battery);
\r
568 info->Reset=M45Reset;
\r
569 info->Power=M45Power;
\r
570 AddExState(EXPREGS, 5, 0, "EXPR");
\r
573 // ---------------------------- Mapper 47 -------------------------------
\r
575 static void M47PW(uint32 A, uint8 V)
\r
582 static void M47CW(uint32 A, uint8 V)
\r
590 static DECLFW(M47Write)
\r
593 FixMMC3PRG(MMC3_cmd);
\r
594 FixMMC3CHR(MMC3_cmd);
\r
597 static void M47Power(void)
\r
601 SetWriteHandler(0x6000,0x7FFF,M47Write);
\r
602 // SetReadHandler(0x6000,0x7FFF,0);
\r
605 void Mapper47_Init(CartInfo *info)
\r
607 GenMMC3_Init(info, 512, 256, 8, 0);
\r
610 info->Power=M47Power;
\r
611 AddExState(EXPREGS, 1, 0, "EXPR");
\r
614 // ---------------------------- Mapper 49 -------------------------------
\r
616 static void M49PW(uint32 A, uint8 V)
\r
621 V|=(EXPREGS[0]&0xC0)>>2;
\r
625 setprg32(0x8000,(EXPREGS[0]>>4)&3);
\r
628 static void M49CW(uint32 A, uint8 V)
\r
632 NV|=(EXPREGS[0]&0xC0)<<1;
\r
636 static DECLFW(M49Write)
\r
641 FixMMC3PRG(MMC3_cmd);
\r
642 FixMMC3CHR(MMC3_cmd);
\r
646 static void M49Reset(void)
\r
652 static void M49Power(void)
\r
656 SetWriteHandler(0x6000,0x7FFF,M49Write);
\r
657 SetReadHandler(0x6000,0x7FFF,0);
\r
660 void Mapper49_Init(CartInfo *info)
\r
662 GenMMC3_Init(info, 512, 256, 0, 0);
\r
665 info->Reset=M49Reset;
\r
666 info->Power=M49Power;
\r
667 AddExState(EXPREGS, 1, 0, "EXPR");
\r
670 // ---------------------------- Mapper 52 -------------------------------
\r
672 static void M52PW(uint32 A, uint8 V)
\r
675 NV&=0x1F^((EXPREGS[0]&8)<<1);
\r
676 NV|=((EXPREGS[0]&6)|((EXPREGS[0]>>3)&EXPREGS[0]&1))<<4;
\r
680 static void M52CW(uint32 A, uint8 V)
\r
683 NV&=0xFF^((EXPREGS[0]&0x40)<<1);
\r
684 NV|=(((EXPREGS[0]>>3)&4)|((EXPREGS[0]>>1)&2)|((EXPREGS[0]>>6)&(EXPREGS[0]>>4)&1))<<7;
\r
688 static DECLFW(M52Write)
\r
697 FixMMC3PRG(MMC3_cmd);
\r
698 FixMMC3CHR(MMC3_cmd);
\r
701 static void M52Reset(void)
\r
703 EXPREGS[0]=EXPREGS[1]=0;
\r
707 static void M52Power(void)
\r
711 SetWriteHandler(0x6000,0x7FFF,M52Write);
\r
714 void Mapper52_Init(CartInfo *info)
\r
716 GenMMC3_Init(info, 512, 256, 8, info->battery);
\r
719 info->Reset=M52Reset;
\r
720 info->Power=M52Power;
\r
721 AddExState(EXPREGS, 2, 0, "EXPR");
\r
724 // ---------------------------- Mapper 74 -------------------------------
\r
726 static void M74CW(uint32 A, uint8 V)
\r
728 if((V==8)||(V==9)) //Di 4 Ci - Ji Qi Ren Dai Zhan (As).nes, Ji Jia Zhan Shi (As).nes
\r
729 setchr1r(0x10,A,V);
\r
734 void Mapper74_Init(CartInfo *info)
\r
736 GenMMC3_Init(info, 512, 256, 8, info->battery);
\r
739 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
\r
740 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
\r
741 AddExState(CHRRAM, CHRRAMSize, 0, "CHRR");
\r
744 // ---------------------------- Mapper 114 ------------------------------
\r
746 static uint8 cmdin;
\r
747 uint8 m114_perm[8] = {0, 3, 1, 5, 6, 7, 2, 4};
\r
749 static void M114PWRAP(uint32 A, uint8 V)
\r
751 if(EXPREGS[0]&0x80)
\r
753 setprg16(0x8000,EXPREGS[0]&0xF);
\r
754 setprg16(0xC000,EXPREGS[0]&0xF);
\r
760 static DECLFW(M114Write)
\r
764 case 0x8001: MMC3_CMDWrite(0xA000,V); break;
\r
765 case 0xA000: MMC3_CMDWrite(0x8000,(V&0xC0)|(m114_perm[V&7])); cmdin=1; break;
\r
766 case 0xC000: if(!cmdin) break; MMC3_CMDWrite(0x8001,V); cmdin=0; break;
\r
767 case 0xA001: IRQLatch=V; break;
\r
768 case 0xC001: IRQReload=1; break;
\r
769 case 0xE000: X6502_IRQEnd(FCEU_IQEXT);IRQa=0; break;
\r
770 case 0xE001: IRQa=1; break;
\r
774 static DECLFW(M114ExWrite)
\r
779 FixMMC3PRG(MMC3_cmd);
\r
783 static void M114Power(void)
\r
786 SetWriteHandler(0x8000,0xFFFF,M114Write);
\r
787 SetWriteHandler(0x5000,0x7FFF,M114ExWrite);
\r
790 static void M114Reset(void)
\r
796 void Mapper114_Init(CartInfo *info)
\r
799 GenMMC3_Init(info, 256, 256, 0, 0);
\r
801 info->Power=M114Power;
\r
802 info->Reset=M114Reset;
\r
803 AddExState(EXPREGS, 1, 0, "EXPR");
\r
804 AddExState(&cmdin, 1, 0, "CMDIN");
\r
807 // ---------------------------- Mapper 115 ------------------------------
\r
809 static void M115PW(uint32 A, uint8 V)
\r
811 //zero 09-apr-2012 - #3515357 - changed to support Bao Qing Tian (mapper 248) which was missing BG gfx. 115 game(s?) seem still to work OK.
\r
813 if(A==0x8000 && EXPREGS[0]&0x80)
\r
814 setprg16(0x8000,(EXPREGS[0]&0xF));
\r
817 static void M115CW(uint32 A, uint8 V)
\r
819 setchr1(A,(uint32)V|((EXPREGS[1]&1)<<8));
\r
822 static DECLFW(M115Write)
\r
824 // FCEU_printf("%04x:%04x\n",A,V);
\r
825 if(A==0x5080) EXPREGS[2]=V;
\r
830 FixMMC3PRG(MMC3_cmd);
\r
833 static DECLFR(M115Read)
\r
838 static void M115Power(void)
\r
841 SetWriteHandler(0x4100,0x7FFF,M115Write);
\r
842 SetReadHandler(0x5000,0x5FFF,M115Read);
\r
845 void Mapper115_Init(CartInfo *info)
\r
847 GenMMC3_Init(info, 128, 512, 0, 0);
\r
850 info->Power=M115Power;
\r
851 AddExState(EXPREGS, 2, 0, "EXPR");
\r
854 // ---------------------------- Mapper 118 ------------------------------
\r
856 static uint8 PPUCHRBus;
\r
857 static uint8 TKSMIR[8];
\r
859 static void TKSPPU(uint32 A)
\r
864 setmirror(MI_0+TKSMIR[A]);
\r
867 static void TKSWRAP(uint32 A, uint8 V)
\r
869 TKSMIR[A>>10]=V>>7;
\r
871 if(PPUCHRBus==(A>>10))
\r
872 setmirror(MI_0+(V>>7));
\r
875 // ---------------------------- Mapper 119 ------------------------------
\r
877 static void TQWRAP(uint32 A, uint8 V)
\r
879 setchr1r((V&0x40)>>2,A,V&0x3F);
\r
882 void Mapper119_Init(CartInfo *info)
\r
884 GenMMC3_Init(info, 512, 64, 0, 0);
\r
887 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
\r
888 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
\r
891 // ---------------------------- Mapper 134 ------------------------------
\r
893 static void M134PW(uint32 A, uint8 V)
\r
895 setprg8(A,(V&0x1F)|((EXPREGS[0]&2)<<4));
\r
898 static void M134CW(uint32 A, uint8 V)
\r
900 setchr1(A,(V&0xFF)|((EXPREGS[0]&0x20)<<3));
\r
903 static DECLFW(M134Write)
\r
906 FixMMC3CHR(MMC3_cmd);
\r
907 FixMMC3PRG(MMC3_cmd);
\r
910 static void M134Power(void)
\r
914 SetWriteHandler(0x6001,0x6001,M134Write);
\r
917 static void M134Reset(void)
\r
923 void Mapper134_Init(CartInfo *info)
\r
925 GenMMC3_Init(info, 256, 256, 0, 0);
\r
928 info->Power=M134Power;
\r
929 info->Reset=M134Reset;
\r
930 AddExState(EXPREGS, 4, 0, "EXPR");
\r
933 // ---------------------------- Mapper 165 ------------------------------
\r
935 static void M165CW(uint32 A, uint8 V)
\r
938 setchr4r(0x10,A,0);
\r
943 static void M165PPUFD(void)
\r
945 if(EXPREGS[0]==0xFD)
\r
947 M165CW(0x0000,DRegBuf[0]);
\r
948 M165CW(0x1000,DRegBuf[2]);
\r
952 static void M165PPUFE(void)
\r
954 if(EXPREGS[0]==0xFE)
\r
956 M165CW(0x0000,DRegBuf[1]);
\r
957 M165CW(0x1000,DRegBuf[4]);
\r
961 static void M165CWM(uint32 A, uint8 V)
\r
963 if(((MMC3_cmd&0x7)==0)||((MMC3_cmd&0x7)==2))
\r
965 if(((MMC3_cmd&0x7)==1)||((MMC3_cmd&0x7)==4))
\r
969 static void M165PPU(uint32 A)
\r
971 if((A&0x1FF0)==0x1FD0)
\r
975 } else if((A&0x1FF0)==0x1FE0)
\r
982 static void M165Power(void)
\r
988 void Mapper165_Init(CartInfo *info)
\r
990 GenMMC3_Init(info, 512, 128, 8, info->battery);
\r
993 info->Power=M165Power;
\r
995 CHRRAM = (uint8*)FCEU_gmalloc(CHRRAMSize);
\r
996 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
\r
997 AddExState(CHRRAM, CHRRAMSize, 0, "CHRR");
\r
998 AddExState(EXPREGS, 4, 0, "EXPR");
\r
1001 // ---------------------------- Mapper 191 ------------------------------
\r
1003 static void M191CW(uint32 A, uint8 V)
\r
1005 setchr1r((V&0x80)>>3,A,V);
\r
1008 void Mapper191_Init(CartInfo *info)
\r
1010 GenMMC3_Init(info, 256, 256, 8, info->battery);
\r
1013 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
\r
1014 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
\r
1015 AddExState(CHRRAM, CHRRAMSize, 0, "CHRR");
\r
1018 // ---------------------------- Mapper 192 -------------------------------
\r
1020 static void M192CW(uint32 A, uint8 V)
\r
1022 if((V==8)||(V==9)||(V==0xA)||(V==0xB)) //Ying Lie Qun Xia Zhuan (Chinese),
\r
1023 setchr1r(0x10,A,V);
\r
1028 void Mapper192_Init(CartInfo *info)
\r
1030 GenMMC3_Init(info, 512, 256, 8, info->battery);
\r
1033 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
\r
1034 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
\r
1035 AddExState(CHRRAM, CHRRAMSize, 0, "CHRR");
\r
1038 // ---------------------------- Mapper 194 -------------------------------
\r
1040 static void M194CW(uint32 A, uint8 V)
\r
1042 if(V<=1) //Dai-2-Ji - Super Robot Taisen (As).nes
\r
1043 setchr1r(0x10,A,V);
\r
1048 void Mapper194_Init(CartInfo *info)
\r
1050 GenMMC3_Init(info, 512, 256, 8, info->battery);
\r
1053 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
\r
1054 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
\r
1055 AddExState(CHRRAM, CHRRAMSize, 0, "CHRR");
\r
1058 // ---------------------------- Mapper 195 -------------------------------
\r
1059 static uint8 *wramtw;
\r
1060 static uint16 wramsize;
\r
1062 static void M195CW(uint32 A, uint8 V)
\r
1064 if(V<=3) // Crystalis (c).nes, Captain Tsubasa Vol 2 - Super Striker (C)
\r
1065 setchr1r(0x10,A,V);
\r
1070 static void M195Power(void)
\r
1073 setprg4r(0x10,0x5000,0);
\r
1074 SetWriteHandler(0x5000,0x5fff,CartBW);
\r
1075 SetReadHandler(0x5000,0x5fff,CartBR);
\r
1078 static void M195Close(void)
\r
1081 FCEU_gfree(wramtw);
\r
1085 void Mapper195_Init(CartInfo *info)
\r
1087 GenMMC3_Init(info, 512, 256, 8, info->battery);
\r
1089 info->Power=M195Power;
\r
1090 info->Close=M195Close;
\r
1092 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
\r
1093 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
\r
1095 wramtw=(uint8*)FCEU_gmalloc(wramsize);
\r
1096 SetupCartPRGMapping(0x10, wramtw, wramsize, 1);
\r
1097 AddExState(CHRRAM, CHRRAMSize, 0, "CHRR");
\r
1098 AddExState(wramtw, wramsize, 0, "WRAMTW");
\r
1101 // ---------------------------- Mapper 196 -------------------------------
\r
1103 static DECLFW(Mapper196Write)
\r
1105 A=(A&0xFFFE)|((A>>2)&1)|((A>>3)&1)|((A>>1)&1);
\r
1107 MMC3_IRQWrite(A,V);
\r
1109 MMC3_CMDWrite(A,V);
\r
1112 static void Mapper196Power(void)
\r
1115 SetWriteHandler(0x8000,0xFFFF,Mapper196Write);
\r
1118 void Mapper196_Init(CartInfo *info)
\r
1120 GenMMC3_Init(info, 128, 128, 0, 0);
\r
1121 info->Power=Mapper196Power;
\r
1124 // ---------------------------- Mapper 197 -------------------------------
\r
1126 static void M197CW(uint32 A, uint8 V)
\r
1129 setchr4(0x0000,V>>1);
\r
1130 else if(A==0x1000)
\r
1131 setchr2(0x1000,V);
\r
1132 else if(A==0x1400)
\r
1133 setchr2(0x1800,V);
\r
1136 void Mapper197_Init(CartInfo *info)
\r
1138 GenMMC3_Init(info, 128, 512, 8, 0);
\r
1142 // ---------------------------- Mapper 198 -------------------------------
\r
1144 static void M198PW(uint32 A, uint8 V)
\r
1146 if(V>=0x50) // Tenchi o Kurau II - Shokatsu Koumei Den (J) (C).nes
\r
1147 setprg8(A,V&0x4F);
\r
1152 void Mapper198_Init(CartInfo *info)
\r
1154 GenMMC3_Init(info, 1024, 256, 8, info->battery);
\r
1156 info->Power=M195Power;
\r
1157 info->Close=M195Close;
\r
1159 wramtw=(uint8*)FCEU_gmalloc(wramsize);
\r
1160 SetupCartPRGMapping(0x10, wramtw, wramsize, 1);
\r
1161 AddExState(wramtw, wramsize, 0, "WRAMTW");
\r
1164 // ---------------------------- Mapper 205 ------------------------------
\r
1166 static void M205PW(uint32 A, uint8 V)
\r
1169 setprg8(A,(V&0x0f)|((EXPREGS[0]&3)<<4));
\r
1171 setprg8(A,(V&0x1f)|((EXPREGS[0]&3)<<4));
\r
1174 static void M205CW(uint32 A, uint8 V)
\r
1176 setchr1(A,V|((EXPREGS[0]&3)<<7));
\r
1179 static DECLFW(M205Write)
\r
1181 if((A&0x6800)==0x6800) EXPREGS[0]= V;
\r
1182 FixMMC3PRG(MMC3_cmd);
\r
1183 FixMMC3CHR(MMC3_cmd);
\r
1186 static void M205Reset(void)
\r
1192 static void M205Power(void)
\r
1195 SetWriteHandler(0x4020,0x7FFF,M205Write);
\r
1198 void Mapper205_Init(CartInfo *info)
\r
1200 GenMMC3_Init(info, 512, 256, 8, 0);
\r
1203 info->Power=M205Power;
\r
1204 info->Reset=M205Reset;
\r
1205 AddExState(EXPREGS, 1, 0, "EXPR");
\r
1208 // ---------------------------- Mapper 245 ------------------------------
\r
1210 static void M245CW(uint32 A, uint8 V)
\r
1212 if(!UNIFchrrama) // Yong Zhe Dou E Long - Dragon Quest VI (As).nes NEEDS THIS for RAM cart
\r
1215 FixMMC3PRG(MMC3_cmd);
\r
1218 static void M245PW(uint32 A, uint8 V)
\r
1220 setprg8(A,(V&0x3F)|((EXPREGS[0]&2)<<5));
\r
1223 static void M245Power(void)
\r
1229 void Mapper245_Init(CartInfo *info)
\r
1231 GenMMC3_Init(info, 512, 256, 8, info->battery);
\r
1234 info->Power=M245Power;
\r
1235 AddExState(EXPREGS, 1, 0, "EXPR");
\r
1238 // ---------------------------- Mapper 249 ------------------------------
\r
1240 static void M249PW(uint32 A, uint8 V)
\r
1242 if(EXPREGS[0]&0x2)
\r
1245 V=(V&1)|((V>>3)&2)|((V>>1)&4)|((V<<2)&8)|((V<<2)&0x10);
\r
1249 V=(V&3)|((V>>1)&4)|((V>>4)&8)|((V>>2)&0x10)|((V<<3)&0x20)|((V<<2)&0xC0);
\r
1255 static void M249CW(uint32 A, uint8 V)
\r
1257 if(EXPREGS[0]&0x2)
\r
1258 V=(V&3)|((V>>1)&4)|((V>>4)&8)|((V>>2)&0x10)|((V<<3)&0x20)|((V<<2)&0xC0);
\r
1262 static DECLFW(M249Write)
\r
1265 FixMMC3PRG(MMC3_cmd);
\r
1266 FixMMC3CHR(MMC3_cmd);
\r
1269 static void M249Power(void)
\r
1273 SetWriteHandler(0x5000,0x5000,M249Write);
\r
1276 void Mapper249_Init(CartInfo *info)
\r
1278 GenMMC3_Init(info, 512, 256, 8, info->battery);
\r
1281 info->Power=M249Power;
\r
1282 AddExState(EXPREGS, 1, 0, "EXPR");
\r
1285 // ---------------------------- Mapper 250 ------------------------------
\r
1287 static DECLFW(M250Write)
\r
1289 MMC3_CMDWrite((A&0xE000)|((A&0x400)>>10),A&0xFF);
\r
1292 static DECLFW(M250IRQWrite)
\r
1294 MMC3_IRQWrite((A&0xE000)|((A&0x400)>>10),A&0xFF);
\r
1297 static void M250_Power(void)
\r
1300 SetWriteHandler(0x8000,0xBFFF,M250Write);
\r
1301 SetWriteHandler(0xC000,0xFFFF,M250IRQWrite);
\r
1304 void Mapper250_Init(CartInfo *info)
\r
1306 GenMMC3_Init(info, 512, 256, 8, info->battery);
\r
1307 info->Power=M250_Power;
\r
1310 // ---------------------------- Mapper 254 ------------------------------
\r
1312 static DECLFR(MR254WRAM)
\r
1315 return WRAM[A-0x6000];
\r
1317 return WRAM[A-0x6000]^EXPREGS[1];
\r
1320 static DECLFW(M254Write)
\r
1323 case 0x8000: EXPREGS[0]=0xff;
\r
1325 case 0xA001: EXPREGS[1]=V;
\r
1327 MMC3_CMDWrite(A,V);
\r
1330 static void M254_Power(void)
\r
1333 SetWriteHandler(0x8000,0xBFFF,M254Write);
\r
1334 SetReadHandler(0x6000,0x7FFF,MR254WRAM);
\r
1337 void Mapper254_Init(CartInfo *info)
\r
1339 GenMMC3_Init(info, 128, 128, 8, info->battery);
\r
1340 info->Power=M254_Power;
\r
1341 AddExState(EXPREGS, 2, 0, "EXPR");
\r
1344 // ---------------------------- UNIF Boards -----------------------------
\r
1346 void TBROM_Init(CartInfo *info)
\r
1348 GenMMC3_Init(info, 64, 64, 0, 0);
\r
1351 void TEROM_Init(CartInfo *info)
\r
1353 GenMMC3_Init(info, 32, 32, 0, 0);
\r
1356 void TFROM_Init(CartInfo *info)
\r
1358 GenMMC3_Init(info, 512, 64, 0, 0);
\r
1361 void TGROM_Init(CartInfo *info)
\r
1363 GenMMC3_Init(info, 512, 0, 0, 0);
\r
1366 void TKROM_Init(CartInfo *info)
\r
1368 GenMMC3_Init(info, 512, 256, 8, info->battery);
\r
1371 void TLROM_Init(CartInfo *info)
\r
1373 GenMMC3_Init(info, 512, 256, 0, 0);
\r
1376 void TSROM_Init(CartInfo *info)
\r
1378 GenMMC3_Init(info, 512, 256, 8, 0);
\r
1381 void TLSROM_Init(CartInfo *info)
\r
1383 GenMMC3_Init(info, 512, 256, 8, 0);
\r
1387 AddExState(&PPUCHRBus, 1, 0, "PPUC");
\r
1390 void TKSROM_Init(CartInfo *info)
\r
1392 GenMMC3_Init(info, 512, 256, 8, info->battery);
\r
1396 AddExState(&PPUCHRBus, 1, 0, "PPUC");
\r
1399 void TQROM_Init(CartInfo *info)
\r
1401 GenMMC3_Init(info, 512, 64, 0, 0);
\r
1404 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
\r
1405 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
\r
1408 void HKROM_Init(CartInfo *info)
\r
1410 GenMMC3_Init(info, 512, 512, 1, info->battery);
\r