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,165,205,245,249,250,254
35 uint8 EXPREGS[8]; /* For bootleg games, mostly. */
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"},
61 void (*pwrap)(uint32 A, uint8 V);
62 void (*cwrap)(uint32 A, uint8 V);
63 void (*mwrap)(uint8 V);
65 void GenMMC3Power(void);
66 void FixMMC3PRG(int V);
67 void FixMMC3CHR(int V);
69 void GenMMC3_Init(CartInfo *info, int prg, int chr, int wram, int battery);
71 // ----------------------------------------------------------------------
72 // ------------------------- Generic MM3 Code ---------------------------
73 // ----------------------------------------------------------------------
75 void FixMMC3PRG(int V)
79 pwrap(0xC000,DRegBuf[6]);
84 pwrap(0x8000,DRegBuf[6]);
87 pwrap(0xA000,DRegBuf[7]);
91 void FixMMC3CHR(int V)
93 int cbase=(V&0x80)<<5;
95 cwrap((cbase^0x000),DRegBuf[0]&(~1));
96 cwrap((cbase^0x400),DRegBuf[0]|1);
97 cwrap((cbase^0x800),DRegBuf[1]&(~1));
98 cwrap((cbase^0xC00),DRegBuf[1]|1);
100 cwrap(cbase^0x1000,DRegBuf[2]);
101 cwrap(cbase^0x1400,DRegBuf[3]);
102 cwrap(cbase^0x1800,DRegBuf[4]);
103 cwrap(cbase^0x1c00,DRegBuf[5]);
105 if(mwrap) mwrap(A000B);
108 void MMC3RegReset(void)
110 IRQCount=IRQLatch=IRQa=MMC3_cmd=0;
125 DECLFW(MMC3_CMDWrite)
127 // FCEU_printf("bs %04x %02x\n",A,V);
131 if((V&0x40) != (MMC3_cmd&0x40))
133 if((V&0x80) != (MMC3_cmd&0x80))
139 int cbase=(MMC3_cmd&0x80)<<5;
140 DRegBuf[MMC3_cmd&0x7]=V;
141 switch(MMC3_cmd&0x07)
143 case 0: cwrap((cbase^0x000),V&(~1));
144 cwrap((cbase^0x400),V|1);
146 case 1: cwrap((cbase^0x800),V&(~1));
147 cwrap((cbase^0xC00),V|1);
149 case 2: cwrap(cbase^0x1000,V);
151 case 3: cwrap(cbase^0x1400,V);
153 case 4: cwrap(cbase^0x1800,V);
155 case 5: cwrap(cbase^0x1C00,V);
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 FixMMC3PRG(MMC3_cmd);
229 FixMMC3CHR(MMC3_cmd);
232 static void GENCWRAP(uint32 A, uint8 V)
234 setchr1(A,V); // Business Wars NEEDS THIS for 8K CHR-RAM
237 static void GENPWRAP(uint32 A, uint8 V)
239 setprg8(A,V&0x7F); // [NJ102] Mo Dao Jie (C) has 1024Mb MMC3 BOARD, maybe something other will be broken
242 static void GENMWRAP(uint8 V)
248 static void GENNOMWRAP(uint8 V)
253 static DECLFW(MBWRAMMMC6)
258 static DECLFR(MAWRAMMMC6)
260 return(WRAM[A&0x3ff]);
263 void GenMMC3Power(void)
265 if(UNIFchrrama) setchr8(0);
267 SetWriteHandler(0x8000,0xBFFF,MMC3_CMDWrite);
268 SetWriteHandler(0xC000,0xFFFF,MMC3_IRQWrite);
269 SetReadHandler(0x8000,0xFFFF,CartBR);
276 FCEU_CheatAddRAM(1,0x7000,WRAM);
277 SetReadHandler(0x7000,0x7FFF,MAWRAMMMC6);
278 SetWriteHandler(0x7000,0x7FFF,MBWRAMMMC6);
282 FCEU_CheatAddRAM((wrams&0x1fff)>>10,0x6000,WRAM);
283 SetWriteHandler(0x6000,0x6000 + ((wrams - 1) & 0x1fff),CartBW);
284 SetReadHandler(0x6000,0x6000 + ((wrams - 1) & 0x1fff),CartBR);
285 setprg8r(0x10,0x6000,0);
288 FCEU_dwmemset(WRAM,0,wrams);
292 FCEU_dwmemset(CHRRAM,0,CHRRAMSize);
295 static void GenMMC3Close(void)
304 void GenMMC3_Init(CartInfo *info, int prg, int chr, int wram, int battery)
312 PRGmask8[0]&=(prg>>13)-1;
313 CHRmask1[0]&=(chr>>10)-1;
314 CHRmask2[0]&=(chr>>11)-1;
319 WRAM=(uint8*)FCEU_gmalloc(wrams);
320 SetupCartPRGMapping(0x10,WRAM,wrams,1);
321 AddExState(WRAM, wrams, 0, "MRAM");
327 info->SaveGame[0]=WRAM;
328 info->SaveGameLen[0]=wrams;
331 AddExState(MMC3_StateRegs, ~0, 0, 0);
333 info->Power=GenMMC3Power;
334 info->Reset=MMC3RegReset;
335 info->Close=GenMMC3Close;
337 if(info->CRC32 == 0x5104833e) // Kick Master
338 GameHBIRQHook = MMC3_hb_KickMasterHack;
339 else if(info->CRC32 == 0x5a6860f1 || info->CRC32 == 0xae280e20) // Shougi Meikan '92/'93
340 GameHBIRQHook = MMC3_hb_KickMasterHack;
341 else if(info->CRC32 == 0xfcd772eb) // PAL Star Wars, similar problem as Kick Master.
342 GameHBIRQHook = MMC3_hb_PALStarWarsHack;
344 GameHBIRQHook=MMC3_hb;
345 GameStateRestore=GenMMC3Restore;
348 // ----------------------------------------------------------------------
349 // -------------------------- MMC3 Based Code ---------------------------
350 // ----------------------------------------------------------------------
352 // ---------------------------- Mapper 4 --------------------------------
354 static int hackm4=0;/* For Karnov, maybe others. BLAH. Stupid iNES format.*/
356 static void M4Power(void)
363 void Mapper4_Init(CartInfo *info)
367 if((info->CRC32==0x93991433 || info->CRC32==0xaf65aa84))
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");
372 GenMMC3_Init(info,512,256,ws,info->battery);
377 // ---------------------------- Mapper 12 -------------------------------
379 static void M12CW(uint32 A, uint8 V)
381 setchr1(A,(EXPREGS[(A&0x1000)>>12]<<8)+V);
384 static DECLFW(M12Write)
387 EXPREGS[1]=(V&0x10)>>4;
390 static void M12Power(void)
392 EXPREGS[0]=EXPREGS[1]=0;
394 SetWriteHandler(0x4100,0x5FFF,M12Write);
397 void Mapper12_Init(CartInfo *info)
399 GenMMC3_Init(info, 512, 256, 8, info->battery);
401 info->Power=M12Power;
402 AddExState(EXPREGS, 2, 0, "EXPR");
405 // ---------------------------- Mapper 37 -------------------------------
407 static void M37PW(uint32 A, uint8 V)
417 static void M37CW(uint32 A, uint8 V)
425 static DECLFW(M37Write)
428 FixMMC3PRG(MMC3_cmd);
429 FixMMC3CHR(MMC3_cmd);
432 static void M37Reset(void)
438 static void M37Power(void)
442 SetWriteHandler(0x6000,0x7FFF,M37Write);
445 void Mapper37_Init(CartInfo *info)
447 GenMMC3_Init(info, 512, 256, 8, info->battery);
450 info->Power=M37Power;
451 info->Reset=M37Reset;
452 AddExState(EXPREGS, 1, 0, "EXPR");
455 // ---------------------------- Mapper 44 -------------------------------
457 static void M44PW(uint32 A, uint8 V)
460 if(EXPREGS[0]>=6) NV&=0x1F;
466 static void M44CW(uint32 A, uint8 V)
469 if(EXPREGS[0]<6) NV&=0x7F;
474 static DECLFW(M44Write)
479 FixMMC3PRG(MMC3_cmd);
480 FixMMC3CHR(MMC3_cmd);
486 static void M44Power(void)
490 SetWriteHandler(0xA000,0xBFFF,M44Write);
493 void Mapper44_Init(CartInfo *info)
495 GenMMC3_Init(info, 512, 256, 8, info->battery);
498 info->Power=M44Power;
499 AddExState(EXPREGS, 1, 0, "EXPR");
502 // ---------------------------- Mapper 45 -------------------------------
504 static void M45CW(uint32 A, uint8 V)
510 NV&=(1<<((EXPREGS[2]&7)+1))-1;
513 NV&=0; // hack ;( don't know exactly how it should be
514 NV|=EXPREGS[0]|((EXPREGS[2]&0xF0)<<4);
519 static void M45PW(uint32 A, uint8 V)
521 V&=(EXPREGS[3]&0x3F)^0x3F;
526 static DECLFW(M45Write)
533 EXPREGS[EXPREGS[4]]=V;
534 EXPREGS[4]=(EXPREGS[4]+1)&3;
537 // FCEU_printf("CHROR %02x, PRGOR %02x, CHRAND %02x, PRGAND %02x\n",EXPREGS[0],EXPREGS[1],EXPREGS[2],EXPREGS[3]);
538 // FCEU_printf("CHR0 %03x, CHR1 %03x, PRG0 %03x, PRG1 %03x\n",
539 // (0x00&((1<<((EXPREGS[2]&7)+1))-1))|(EXPREGS[0]|((EXPREGS[2]&0xF0)<<4)),
540 // (0xFF&((1<<((EXPREGS[2]&7)+1))-1))|(EXPREGS[0]|((EXPREGS[2]&0xF0)<<4)),
541 // (0x00&((EXPREGS[3]&0x3F)^0x3F))|(EXPREGS[1]),
542 // (0xFF&((EXPREGS[3]&0x3F)^0x3F))|(EXPREGS[1]));
544 FixMMC3PRG(MMC3_cmd);
545 FixMMC3CHR(MMC3_cmd);
548 static DECLFR(M45Read)
550 uint32 addr = 1<<(EXPREGS[5]+4);
551 if(A&(addr|(addr-1)))
557 static void M45Reset(void)
559 EXPREGS[0]=EXPREGS[1]=EXPREGS[2]=EXPREGS[3]=EXPREGS[4]=0;
565 static void M45Power(void)
569 EXPREGS[0]=EXPREGS[1]=EXPREGS[2]=EXPREGS[3]=EXPREGS[4]=EXPREGS[5]=0;
570 SetWriteHandler(0x5000,0x7FFF,M45Write);
571 SetReadHandler(0x5000,0x5FFF,M45Read);
574 void Mapper45_Init(CartInfo *info)
576 GenMMC3_Init(info, 512, 256, 8, info->battery);
579 info->Reset=M45Reset;
580 info->Power=M45Power;
581 AddExState(EXPREGS, 5, 0, "EXPR");
584 // ---------------------------- Mapper 47 -------------------------------
586 static void M47PW(uint32 A, uint8 V)
593 static void M47CW(uint32 A, uint8 V)
601 static DECLFW(M47Write)
604 FixMMC3PRG(MMC3_cmd);
605 FixMMC3CHR(MMC3_cmd);
608 static void M47Power(void)
612 SetWriteHandler(0x6000,0x7FFF,M47Write);
613 // SetReadHandler(0x6000,0x7FFF,0);
616 void Mapper47_Init(CartInfo *info)
618 GenMMC3_Init(info, 512, 256, 8, 0);
621 info->Power=M47Power;
622 AddExState(EXPREGS, 1, 0, "EXPR");
625 // ---------------------------- Mapper 49 -------------------------------
627 static void M49PW(uint32 A, uint8 V)
632 V|=(EXPREGS[0]&0xC0)>>2;
636 setprg32(0x8000,(EXPREGS[0]>>4)&3);
639 static void M49CW(uint32 A, uint8 V)
643 NV|=(EXPREGS[0]&0xC0)<<1;
647 static DECLFW(M49Write)
652 FixMMC3PRG(MMC3_cmd);
653 FixMMC3CHR(MMC3_cmd);
657 static void M49Reset(void)
663 static void M49Power(void)
667 SetWriteHandler(0x6000,0x7FFF,M49Write);
668 SetReadHandler(0x6000,0x7FFF,0);
671 void Mapper49_Init(CartInfo *info)
673 GenMMC3_Init(info, 512, 256, 0, 0);
676 info->Reset=M49Reset;
677 info->Power=M49Power;
678 AddExState(EXPREGS, 1, 0, "EXPR");
681 // ---------------------------- Mapper 52 -------------------------------
682 static void M52PW(uint32 A, uint8 V)
684 uint32 mask = 0x1F^((EXPREGS[0]&8)<<1);
685 uint32 bank = ((EXPREGS[0]&6)|((EXPREGS[0]>>3)&EXPREGS[0]&1))<<4;
686 setprg8(A, bank|(V & mask));
689 static void M52CW(uint32 A, uint8 V)
691 uint32 mask = 0xFF^((EXPREGS[0]&0x40)<<1);
692 // uint32 bank = (((EXPREGS[0]>>3)&4)|((EXPREGS[0]>>1)&2)|((EXPREGS[0]>>6)&(EXPREGS[0]>>4)&1))<<7;
693 uint32 bank = (((EXPREGS[0]>>4)&2)|(EXPREGS[0]&4)|((EXPREGS[0]>>6)&(EXPREGS[0]>>4)&1))<<7; // actually 256K CHR banks index bits is inverted!
694 setchr1(A, bank|(V & mask));
697 static DECLFW(M52Write)
706 FixMMC3PRG(MMC3_cmd);
707 FixMMC3CHR(MMC3_cmd);
710 static void M52Reset(void)
712 EXPREGS[0]=EXPREGS[1]=0;
716 static void M52Power(void)
720 SetWriteHandler(0x6000,0x7FFF,M52Write);
723 void Mapper52_Init(CartInfo *info)
725 GenMMC3_Init(info, 256, 256, 8, info->battery);
728 info->Reset=M52Reset;
729 info->Power=M52Power;
730 AddExState(EXPREGS, 2, 0, "EXPR");
733 // ---------------------------- Mapper 74 -------------------------------
735 static void M74CW(uint32 A, uint8 V)
737 if((V==8)||(V==9)) //Di 4 Ci - Ji Qi Ren Dai Zhan (As).nes, Ji Jia Zhan Shi (As).nes
743 void Mapper74_Init(CartInfo *info)
745 GenMMC3_Init(info, 512, 256, 8, info->battery);
748 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
749 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
750 AddExState(CHRRAM, CHRRAMSize, 0, "CHRR");
753 // ---------------------------- Mapper 114 ------------------------------
756 uint8 m114_perm[8] = {0, 3, 1, 5, 6, 7, 2, 4};
758 static void M114PWRAP(uint32 A, uint8 V)
762 // FCEU_printf("8000-C000:%02X\n",EXPREGS[0]&0xF);
763 setprg16(0x8000,EXPREGS[0]&0xF);
764 setprg16(0xC000,EXPREGS[0]&0xF);
767 // FCEU_printf("%04X:%02X\n",A,V&0x3F);
772 static DECLFW(M114Write)
776 case 0x8001: MMC3_CMDWrite(0xA000,V); break;
777 case 0xA000: MMC3_CMDWrite(0x8000,(V&0xC0)|(m114_perm[V&7])); cmdin=1; break;
778 case 0xC000: if(!cmdin) break; MMC3_CMDWrite(0x8001,V); cmdin=0; break;
779 case 0xA001: IRQLatch=V; break;
780 case 0xC001: IRQReload=1; break;
781 case 0xE000: X6502_IRQEnd(FCEU_IQEXT);IRQa=0; break;
782 case 0xE001: IRQa=1; break;
786 static DECLFW(M114ExWrite)
791 FixMMC3PRG(MMC3_cmd);
795 static void M114Power(void)
798 SetWriteHandler(0x8000,0xFFFF,M114Write);
799 SetWriteHandler(0x5000,0x7FFF,M114ExWrite);
802 static void M114Reset(void)
808 void Mapper114_Init(CartInfo *info)
811 GenMMC3_Init(info, 256, 256, 0, 0);
813 info->Power=M114Power;
814 info->Reset=M114Reset;
815 AddExState(EXPREGS, 1, 0, "EXPR");
816 AddExState(&cmdin, 1, 0, "CMDI");
819 // ---------------------------- Mapper 115 KN-658 board ------------------------------
821 static void M115PW(uint32 A, uint8 V)
824 setprg32(0x8000,(EXPREGS[0]&7)>>1);
829 static void M115CW(uint32 A, uint8 V)
831 setchr1(A,(uint32)V|((EXPREGS[1]&1)<<8));
834 static DECLFW(M115Write)
836 // FCEU_printf("%04x:%04x\n",A,V);
837 if(A==0x5080) EXPREGS[2]=V;
842 FixMMC3PRG(MMC3_cmd);
845 static DECLFR(M115Read)
850 static void M115Power(void)
853 SetWriteHandler(0x4100,0x7FFF,M115Write);
854 SetReadHandler(0x5000,0x5FFF,M115Read);
857 void Mapper115_Init(CartInfo *info)
859 GenMMC3_Init(info, 128, 512, 0, 0);
862 info->Power=M115Power;
863 AddExState(EXPREGS, 2, 0, "EXPR");
866 // ---------------------------- Mapper 118 ------------------------------
868 static uint8 PPUCHRBus;
869 static uint8 TKSMIR[8];
871 static void FP_FASTAPASS(1) TKSPPU(uint32 A)
876 setmirror(MI_0+TKSMIR[A]);
879 static void TKSWRAP(uint32 A, uint8 V)
883 if(PPUCHRBus==(A>>10))
884 setmirror(MI_0+(V>>7));
887 // ---------------------------- Mapper 119 ------------------------------
889 static void TQWRAP(uint32 A, uint8 V)
891 setchr1r((V&0x40)>>2,A,V&0x3F);
894 void Mapper119_Init(CartInfo *info)
896 GenMMC3_Init(info, 512, 64, 0, 0);
899 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
900 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
903 // ---------------------------- Mapper 134 ------------------------------
905 static void M134PW(uint32 A, uint8 V)
907 setprg8(A,(V&0x1F)|((EXPREGS[0]&2)<<4));
910 static void M134CW(uint32 A, uint8 V)
912 setchr1(A,(V&0xFF)|((EXPREGS[0]&0x20)<<3));
915 static DECLFW(M134Write)
918 FixMMC3CHR(MMC3_cmd);
919 FixMMC3PRG(MMC3_cmd);
922 static void M134Power(void)
926 SetWriteHandler(0x6001,0x6001,M134Write);
929 static void M134Reset(void)
935 void Mapper134_Init(CartInfo *info)
937 GenMMC3_Init(info, 256, 256, 0, 0);
940 info->Power=M134Power;
941 info->Reset=M134Reset;
942 AddExState(EXPREGS, 4, 0, "EXPR");
945 // ---------------------------- Mapper 165 ------------------------------
947 static void M165CW(uint32 A, uint8 V)
955 static void M165PPUFD(void)
959 M165CW(0x0000,DRegBuf[0]);
960 M165CW(0x1000,DRegBuf[2]);
964 static void M165PPUFE(void)
968 M165CW(0x0000,DRegBuf[1]);
969 M165CW(0x1000,DRegBuf[4]);
973 static void M165CWM(uint32 A, uint8 V)
975 if(((MMC3_cmd&0x7)==0)||((MMC3_cmd&0x7)==2))
977 if(((MMC3_cmd&0x7)==1)||((MMC3_cmd&0x7)==4))
981 static void FP_FASTAPASS(1) M165PPU(uint32 A)
983 if((A&0x1FF0)==0x1FD0)
987 } else if((A&0x1FF0)==0x1FE0)
994 static void M165Power(void)
1000 void Mapper165_Init(CartInfo *info)
1002 GenMMC3_Init(info, 512, 128, 8, info->battery);
1005 info->Power=M165Power;
1007 CHRRAM = (uint8*)FCEU_gmalloc(CHRRAMSize);
1008 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
1009 AddExState(CHRRAM, CHRRAMSize, 0, "CHRR");
1010 AddExState(EXPREGS, 4, 0, "EXPR");
1013 // ---------------------------- Mapper 191 ------------------------------
1015 static void M191CW(uint32 A, uint8 V)
1017 setchr1r((V&0x80)>>3,A,V);
1020 void Mapper191_Init(CartInfo *info)
1022 GenMMC3_Init(info, 256, 256, 8, info->battery);
1025 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
1026 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
1027 AddExState(CHRRAM, CHRRAMSize, 0, "CHRR");
1030 // ---------------------------- Mapper 192 -------------------------------
1032 static void M192CW(uint32 A, uint8 V)
1034 if((V==8)||(V==9)||(V==0xA)||(V==0xB)) //Ying Lie Qun Xia Zhuan (Chinese),
1040 void Mapper192_Init(CartInfo *info)
1042 GenMMC3_Init(info, 512, 256, 8, info->battery);
1045 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
1046 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
1047 AddExState(CHRRAM, CHRRAMSize, 0, "CHRR");
1050 // ---------------------------- Mapper 194 -------------------------------
1052 static void M194CW(uint32 A, uint8 V)
1054 if(V<=1) //Dai-2-Ji - Super Robot Taisen (As).nes
1060 void Mapper194_Init(CartInfo *info)
1062 GenMMC3_Init(info, 512, 256, 8, info->battery);
1065 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
1066 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
1067 AddExState(CHRRAM, CHRRAMSize, 0, "CHRR");
1070 // ---------------------------- Mapper 195 -------------------------------
1071 static uint8 *wramtw;
1072 static uint16 wramsize;
1074 static void M195CW(uint32 A, uint8 V)
1076 if(V<=3) // Crystalis (c).nes, Captain Tsubasa Vol 2 - Super Striker (C)
1082 static void M195Power(void)
1085 setprg4r(0x10,0x5000,0);
1086 SetWriteHandler(0x5000,0x5fff,CartBW);
1087 SetReadHandler(0x5000,0x5fff,CartBR);
1090 static void M195Close(void)
1097 void Mapper195_Init(CartInfo *info)
1099 GenMMC3_Init(info, 512, 256, 8, info->battery);
1101 info->Power=M195Power;
1102 info->Close=M195Close;
1104 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
1105 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
1107 wramtw=(uint8*)FCEU_gmalloc(wramsize);
1108 SetupCartPRGMapping(0x10, wramtw, wramsize, 1);
1109 AddExState(CHRRAM, CHRRAMSize, 0, "CHRR");
1110 AddExState(wramtw, wramsize, 0, "TRAM");
1113 // ---------------------------- Mapper 196 -------------------------------
1114 // MMC3 board with optional command address line connection, allows to
1115 // make three-four different wirings to IRQ address lines and separately to
1116 // CMD address line, Mali Boss additionally check if wiring are correct for
1119 static void M196PW(uint32 A, uint8 V)
1121 if(EXPREGS[0]) // Tenchi o Kurau II - Shokatsu Koumei Den (J) (C).nes
1122 setprg32(0x8000,EXPREGS[1]);
1127 static DECLFW(Mapper196Write)
1130 A=(A&0xFFFE)|((A>>2)&1)|((A>>3)&1);
1134 A=(A&0xFFFE)|((A>>2)&1)|((A>>3)&1)|((A>>1)&1);
1139 static DECLFW(Mapper196WriteLo)
1142 EXPREGS[1]=(V&0xf)|(V>>4);
1143 FixMMC3PRG(MMC3_cmd);
1146 static void Mapper196Power(void)
1149 EXPREGS[0] = EXPREGS[1] = 0;
1150 SetWriteHandler(0x6000,0x6FFF,Mapper196WriteLo);
1151 SetWriteHandler(0x8000,0xFFFF,Mapper196Write);
1154 void Mapper196_Init(CartInfo *info)
1156 GenMMC3_Init(info, 128, 128, 0, 0);
1158 info->Power=Mapper196Power;
1161 // ---------------------------- Mapper 197 -------------------------------
1163 static void M197CW(uint32 A, uint8 V)
1166 setchr4(0x0000,V>>1);
1173 void Mapper197_Init(CartInfo *info)
1175 GenMMC3_Init(info, 128, 512, 8, 0);
1179 // ---------------------------- Mapper 198 -------------------------------
1181 static void M198PW(uint32 A, uint8 V)
1183 if(V>=0x50) // Tenchi o Kurau II - Shokatsu Koumei Den (J) (C).nes
1189 void Mapper198_Init(CartInfo *info)
1191 GenMMC3_Init(info, 1024, 256, 8, info->battery);
1193 info->Power=M195Power;
1194 info->Close=M195Close;
1196 wramtw=(uint8*)FCEU_gmalloc(wramsize);
1197 SetupCartPRGMapping(0x10, wramtw, wramsize, 1);
1198 AddExState(wramtw, wramsize, 0, "TRAM");
1201 // ---------------------------- Mapper 205 ------------------------------
1204 static void M205PW(uint32 A, uint8 V)
1206 // GN-30A - íà÷àëüíàÿ ìàñêà äîëæíà áûòü 1F + àïïàðàòíûé ïåðåêëþ÷àòåëü íà øèíå àäðåñà
1207 setprg8(A,(V&0x0f)|EXPREGS[0]);
1210 static void M205CW(uint32 A, uint8 V)
1212 // GN-30A - íà÷àëüíàÿ ìàñêà äîëæíà áûòü FF
1213 setchr1(A,(V&0x7F)|(EXPREGS[0]<<3));
1216 static DECLFW(M205Write)
1218 if(EXPREGS[2] == 0) {
1219 EXPREGS[0] = A & 0x30;
1220 EXPREGS[2] = A & 0x80;
1221 FixMMC3PRG(MMC3_cmd);
1222 FixMMC3CHR(MMC3_cmd);
1228 static void M205Reset(void)
1230 EXPREGS[0]=EXPREGS[2]=0;
1234 static void M205Power(void)
1237 SetWriteHandler(0x6000,0x6fff,M205Write);
1240 void Mapper205_Init(CartInfo *info)
1242 GenMMC3_Init(info, 256, 256, 8, 0);
1245 info->Power=M205Power;
1246 info->Reset=M205Reset;
1247 AddExState(EXPREGS, 1, 0, "EXPR");
1250 // ---------------------------- Mapper 245 ------------------------------
1252 static void M245CW(uint32 A, uint8 V)
1254 if(!UNIFchrrama) // Yong Zhe Dou E Long - Dragon Quest VI (As).nes NEEDS THIS for RAM cart
1257 FixMMC3PRG(MMC3_cmd);
1260 static void M245PW(uint32 A, uint8 V)
1262 setprg8(A,(V&0x3F)|((EXPREGS[0]&2)<<5));
1265 static void M245Power(void)
1271 void Mapper245_Init(CartInfo *info)
1273 GenMMC3_Init(info, 512, 256, 8, info->battery);
1276 info->Power=M245Power;
1277 AddExState(EXPREGS, 1, 0, "EXPR");
1280 // ---------------------------- Mapper 249 ------------------------------
1282 static void M249PW(uint32 A, uint8 V)
1287 V=(V&1)|((V>>3)&2)|((V>>1)&4)|((V<<2)&8)|((V<<2)&0x10);
1291 V=(V&3)|((V>>1)&4)|((V>>4)&8)|((V>>2)&0x10)|((V<<3)&0x20)|((V<<2)&0xC0);
1297 static void M249CW(uint32 A, uint8 V)
1300 V=(V&3)|((V>>1)&4)|((V>>4)&8)|((V>>2)&0x10)|((V<<3)&0x20)|((V<<2)&0xC0);
1304 static DECLFW(M249Write)
1307 FixMMC3PRG(MMC3_cmd);
1308 FixMMC3CHR(MMC3_cmd);
1311 static void M249Power(void)
1315 SetWriteHandler(0x5000,0x5000,M249Write);
1318 void Mapper249_Init(CartInfo *info)
1320 GenMMC3_Init(info, 512, 256, 8, info->battery);
1323 info->Power=M249Power;
1324 AddExState(EXPREGS, 1, 0, "EXPR");
1327 // ---------------------------- Mapper 250 ------------------------------
1329 static DECLFW(M250Write)
1331 MMC3_CMDWrite((A&0xE000)|((A&0x400)>>10),A&0xFF);
1334 static DECLFW(M250IRQWrite)
1336 MMC3_IRQWrite((A&0xE000)|((A&0x400)>>10),A&0xFF);
1339 static void M250_Power(void)
1342 SetWriteHandler(0x8000,0xBFFF,M250Write);
1343 SetWriteHandler(0xC000,0xFFFF,M250IRQWrite);
1346 void Mapper250_Init(CartInfo *info)
1348 GenMMC3_Init(info, 512, 256, 8, info->battery);
1349 info->Power=M250_Power;
1352 // ---------------------------- Mapper 254 ------------------------------
1354 static DECLFR(MR254WRAM)
1357 return WRAM[A-0x6000];
1359 return WRAM[A-0x6000]^EXPREGS[1];
1362 static DECLFW(M254Write)
1365 case 0x8000: EXPREGS[0]=0xff;
1367 case 0xA001: EXPREGS[1]=V;
1372 static void M254_Power(void)
1375 SetWriteHandler(0x8000,0xBFFF,M254Write);
1376 SetReadHandler(0x6000,0x7FFF,MR254WRAM);
1379 void Mapper254_Init(CartInfo *info)
1381 GenMMC3_Init(info, 128, 128, 8, info->battery);
1382 info->Power=M254_Power;
1383 AddExState(EXPREGS, 2, 0, "EXPR");
1386 // ---------------------------- UNIF Boards -----------------------------
1388 void TBROM_Init(CartInfo *info)
1390 GenMMC3_Init(info, 64, 64, 0, 0);
1393 void TEROM_Init(CartInfo *info)
1395 GenMMC3_Init(info, 32, 32, 0, 0);
1398 void TFROM_Init(CartInfo *info)
1400 GenMMC3_Init(info, 512, 64, 0, 0);
1403 void TGROM_Init(CartInfo *info)
1405 GenMMC3_Init(info, 512, 0, 0, 0);
1408 void TKROM_Init(CartInfo *info)
1410 GenMMC3_Init(info, 512, 256, 8, info->battery);
1413 void TLROM_Init(CartInfo *info)
1415 GenMMC3_Init(info, 512, 256, 0, 0);
1418 void TSROM_Init(CartInfo *info)
1420 GenMMC3_Init(info, 512, 256, 8, 0);
1423 void TLSROM_Init(CartInfo *info)
1425 GenMMC3_Init(info, 512, 256, 8, 0);
1429 AddExState(&PPUCHRBus, 1, 0, "PPUC");
1432 void TKSROM_Init(CartInfo *info)
1434 GenMMC3_Init(info, 512, 256, 8, info->battery);
1438 AddExState(&PPUCHRBus, 1, 0, "PPUC");
1441 void TQROM_Init(CartInfo *info)
1443 GenMMC3_Init(info, 512, 64, 0, 0);
1446 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
1447 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
1450 void HKROM_Init(CartInfo *info)
1452 GenMMC3_Init(info, 512, 512, 1, info->battery);