1 /* FCE Ultra - NES/Famicom Emulator
3 * Copyright notice for this file:
4 * Copyright (C) 1998 BERO
5 * Copyright (C) 2002 Ben Parnell
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
41 static DECLFR(VSRead);
43 static uint8 *trainerpoo=0;
44 static uint8 *ROM=NULL;
48 static uint32 ROM_size;
51 static void CheckVSUni(void);
52 static int MMC_init(int type);
53 void (*MapClose)(void);
54 void (*MapperReset)(void);
57 static int SaveGame=0;
59 static iNES_HEADER head;
61 /* MapperReset() is called when the NES is reset(with the reset button).
62 Mapperxxx_init is called when the NES has been powered on.
65 static void iNESGI(int h)
74 SetReadHandler(0x8000,0xFFFF,CartBR);
81 if(ROM) {free(ROM);ROM=0;}
82 if(VROM) {free(VROM);VROM=0;}
88 soot=FCEU_MakeFName(FCEUMKF_SAV,0,"sav");
91 FCEU_PrintError("WRAM file \"%s\" cannot be written to.\n",soot);
101 extern uint8 MMC1WRAMsize;
102 if(MMC1WRAMsize==2) ptr=WRAM+8192;
106 extern uint8 MMC5WRAMsize;
111 fwrite(ptr,1,amount,sp);
115 if(MapClose) MapClose();
116 if(trainerpoo) {free(trainerpoo);trainerpoo=0;}
122 uint32 iNESGameCRC32;
129 static void CheckBad(void)
133 struct CRCMATCH tab[CRCNT]={
134 {0x28d183ac,"Antarctic Adventure"},
135 {0x7095ac65,"Akumajo Densetsu"},
136 {0x1bd7ed5a,"Gradius 2"},
137 {0x81c3aa66,"Crisis Force"},
138 {0xfe3088df,"Fire Emblem Gaiden"},
139 {0xfa8339a5,"Bucky O'Hare"},
140 {0x3c539d78,"Ganbare Goemon 2"},
143 if(tab[x].crc == iNESGameCRC32)
145 FCEU_PrintError("The copy of the game you have loaded, %s, is a bad dump, has been hacked, or both. It will not work correctly on FCE Ultra. Use a good copy of the ROM image instead.",tab[x].name);
157 /* This is mostly for my personal use. So HA. */
158 static void SetInput(void)
160 static struct INPSEL moo[]=
162 {0xad9c63e2,SI_GAMEPAD,-1,SIFC_SHADOW}, /* Space Shadow */
163 {0x24598791,-1,SI_ZAPPER,0}, /* Duck Hunt */
164 {0xff24d794,-1,SI_ZAPPER,0}, /* Hogan's Alley */
165 {0xbeb8ab01,-1,SI_ZAPPER,0}, /* Gumshoe */
166 {0xde8fd935,-1,SI_ZAPPER,0}, /* To the Earth */
167 {0xedc3662b,-1,SI_ZAPPER,0}, /* Operation Wolf */
168 {0x23d17f5e,SI_GAMEPAD,SI_ZAPPER,0}, /* The Lone Ranger */
169 {0xb8b9aca3,-1,SI_ZAPPER,0}, /* Wild Gunman */
170 {0x5112dc21,-1,SI_ZAPPER,0}, /* Wild Gunman */
171 {0x4318a2f8,-1,SI_ZAPPER,0}, /* Barker Bill's Trick Shooting */
172 {0x5ee6008e,-1,SI_ZAPPER,0}, /* Mechanized Attack */
173 {0x3e58a87e,-1,SI_ZAPPER,0}, /* Freedom Force */
174 {0x851eb9be,SI_GAMEPAD,SI_ZAPPER,0}, /* Shooting Range */
175 {0x74bea652,SI_GAMEPAD,SI_ZAPPER,0}, /* Supergun 3-in-1 */
176 {0x32fb0583,-1,SI_ARKANOID,0}, /* Arkanoid(NES) */
177 {0xd89e5a67,-1,-1,SIFC_ARKANOID}, /* Arkanoid (J) */
178 {0x0f141525,-1,-1,SIFC_ARKANOID}, /* Arkanoid 2(J) */
180 {0xf7606810,-1,-1,SIFC_FKB}, /* Family BASIC 2.0A */
181 {0x895037bc,-1,-1,SIFC_FKB}, /* Family BASIC 2.1a */
182 {0xb2530afc,-1,-1,SIFC_FKB}, /* Family BASIC 3.0 */
187 while(moo[x].input1>=0 || moo[x].input2>=0 || moo[x].inputfc>=0)
189 if(moo[x].crc32==iNESGameCRC32)
191 FCEUGameInfo.input[0]=moo[x].input1;
192 FCEUGameInfo.input[1]=moo[x].input2;
193 FCEUGameInfo.inputfc=moo[x].inputfc;
207 static void CheckHInfo(void)
209 /* ROM images that have the battery-backed bit set in the header that really
210 don't have battery-backed RAM is not that big of a problem, so I'll
211 treat this differently.
214 static uint32 savie[SAVCNT]=
216 0x7cab2e9b,0x3ee43cda,0xe1383deb, /* Mouryou Senki Madara */
217 0x3b3f88f0,0x2545214c, /* Dragon Warrior PRG 0 and 1 */
218 0x8c5a784e, /* DW 2 */
219 0xa86a5318, /* DW 3 */
220 0x506e259d, /* DW 4 */
221 0xcebd2a31,0xb8b88130, /* Final Fantasy */
222 0x466efdc2, /* FF(J) */
223 0xc9556b36, /* FF1+2*/
224 0xd29db3c7, /* FF2 */
225 0x57e220d0, /* FF3 */
228 static struct CHINF moo[]=
230 {0xc68363f6,180,0}, /* Crazy Climber */
231 {0xbe939fce,9,1}, /* Punchout*/
232 {0x5e66eaea,13,1}, /* Videomation */
233 {0xaf5d7aa2,-1,0}, /* Clu Clu Land */
235 {0xc2730c30,34,0}, /* Deadly Towers */
236 {0x932ff06e,34,1}, /* Classic Concentration */
237 {0x4c7c1af3,34,1}, /* Caesar's Palace */
238 {0x9ea1dc76,2,0}, /* Rainbow Islands */
240 {0x9eefb4b4,4,8}, /* Pachi Slot Adventure 2 */
241 {0x5337f73c,4,8}, /* Niji no Silk Road */
242 {0x7474ac92,4,8}, /* Kabuki: Quantum Fighter */
244 {0x970bd9c2,1,8}, /* Hanjuku Hero */
246 {0xbb7c5f7a,89,8}, /* Mito Koumon or something similar */
247 /* Probably a Namco MMC3-workalike */
248 {0xa5e6baf9,4,1|4}, /* Dragon Slayer 4 */
249 {0xe40b4973,4,1|4}, /* Metro Cross */
250 {0xd97c31b0,4,1|4}, /* Rasaaru Ishii no Childs Quest */
252 {0x84382231,9,0}, /* Punch Out (J) */
254 {0xfcdaca80,0,0}, /* Elevator Action */
255 {0xe492d45a,0,0}, /* Zippy Race */
256 {0x32fa246f,0,0}, /* Tag Team Pro Wrestling */
257 {0x6d65cac6,2,0}, /* Terra Cresta */
258 {0x28c11d24,2,1}, /* Sukeban Deka */
259 {0x02863604,2,1}, /* Sukeban Deka */
260 {0x2bb6a0f8,2,1}, /* Sherlock Holmes */
261 {0x55773880,2,1}, /* Gilligan's Island */
262 {0x419461d0,2,1}, /* Super Cars */
263 {0x6e0eb43e,2,1}, /* Puss n Boots */
264 {0xfc3e5c86,2,1}, /* Trojan */
266 {0x291bcd7d,1,8}, /* Pachio Kun 2 */
267 {0xf74dfc91,1,-1}, /* Win, Lose, or Draw */
269 {0x59280bec,4,8}, /* Jackie Chan */
271 {0xfe364be5,1,8}, /* Deep Dungeon 4 */
272 {0xd8ee7669,1,8}, /* Adventures of Rad Gravity */
273 {0xa5e8d2cd,1,8}, /* Breakthru */
274 {0xf6fa4453,1,8}, /* Bigfoot */
275 {0x37ba3261,1,8}, /* Back to the Future 2 and 3 */
276 {0x934db14a,1,-1}, /* All-Pro Basketball */
277 {0xe94d5181,1,8}, /* Mirai Senshi - Lios */
278 {0x7156cb4d,1,8}, /* Muppet Adventure Carnival thingy */
279 {0x5b6ca654,1,8}, /* Barbie rev X*/
280 {0x57c12280,1,8}, /* Demon Sword */
282 {0xcf322bb3,3,1}, /* John Elway's Quarterback */
283 {0x9bde3267,3,1}, /* Adventures of Dino Riki */
284 {0x02cc3973,3,8}, /* Ninja Kid */
285 {0xb5d28ea2,3,1}, /* Mystery Quest - mapper 3?*/
286 {0xbc065fc3,3,1}, /* Pipe Dream */
288 {0x5b837e8d,1,8}, /* Alien Syndrome */
289 {0x283ad224,32,8}, /* Ai Sensei no Oshiete */
290 {0x5555fca3,32,8}, /* "" "" */
291 {0x243a8735,32,0x10|4}, /* Major League */
293 {0x6bc65d7e,66,1}, /* Youkai Club*/
294 {0xc2df0a00,66,1}, /* Bio Senshi Dan(hacked) */
295 {0xbde3ae9b,66,1}, /* Doraemon */
296 {0xd26efd78,66,1}, /* SMB Duck Hunt */
297 {0x811f06d9,66,1}, /* Dragon Power */
299 {0x3293afea,66,1}, /* Mississippi Satsujin Jiken */
300 {0xe84274c5,66,1}, /* "" "" */
303 {0x6e68e31a,16,8}, /* Dragon Ball 3*/
308 {0xbda8f8e4,152,8}, /* Gegege no Kitarou 2 */
309 {0x026c5fca,152,8}, /* Saint Seiya Ougon Densetsu */
310 {0x0f141525,152,8}, /* Arkanoid 2 (Japanese) */
311 {0xb1a94b82,152,8}, /* Pocket Zaurus */
313 {0x3f15d20d,153,8}, /* Famicom Jump 2 */
315 {0xbba58be5,70,-1}, /* Family Trainer - Manhattan Police */
316 {0x370ceb65,70,-1}, /* Family Trainer - Meiro Dai Sakusen */
317 {0xdd8ed0f7,70,1}, /* Kamen Rider Club */
319 {0x90c773c1,118,-1}, /* Goal! 2 */
320 {0xb9b4d9e0,118,-1}, /* NES Play Action Football */
321 {0x78b657ac,118,-1}, /* Armadillo */
322 {0x37b62d04,118,-1}, /* Ys 3 */
323 {0x07d92c31,118,-1}, /* RPG Jinsei Game */
324 {0x2705eaeb,234,-1}, /* Maxi 15 */
325 {0x404b2e8b,4,2}, /* Rad Racer 2 */
327 {0x1356f6a6,4,8}, /* "Cattou Ninden Teyandee" English tranlation.
328 Should I have even bothered to do this? */
329 {0x50fd4fd6,4,8}, /* "" "" */
331 {0xa912b064,51|0x800,8}, /* 11-in-1 Ball Games(has CHR ROM when it shouldn't) */
339 if(moo[x].crc32==iNESGameCRC32)
343 if(moo[x].mapper&0x800 && VROM_size)
349 if(MapperNo!=(moo[x].mapper&0xFF))
352 MapperNo=moo[x].mapper&0xFF;
359 if(Mirroring==2) /* Anything but hard-wired(four screen). */
365 else if(Mirroring!=moo[x].mirror)
367 if(Mirroring!=(moo[x].mirror&~4))
368 if((moo[x].mirror&~4)<=2) /* Don't complain if one-screen mirroring
369 needs to be set(the iNES header can't
370 hold this information).
373 Mirroring=moo[x].mirror;
379 } while(moo[x].mirror>=0 || moo[x].mapper>=0);
381 for(x=0;x<SAVCNT;x++)
383 if(savie[x]==iNESGameCRC32)
385 if(!(head.ROM_type&2))
393 /* Games that use these iNES mappers tend to have the four-screen bit set
394 when it should not be.
396 if((MapperNo==118 || MapperNo==24 || MapperNo==26) && (Mirroring==2))
405 strcpy(gigastr,"The iNES header contains incorrect information. For now, the information will be corrected in RAM. ");
407 sprintf(gigastr+strlen(gigastr),"The mapper number should be set to %d. ",MapperNo);
410 char *mstr[3]={"Horizontal","Vertical","Four-screen"};
411 sprintf(gigastr+strlen(gigastr),"Mirroring should be set to \"%s\". ",mstr[Mirroring&3]);
414 strcat(gigastr,"The battery-backed bit should be set. ");
416 strcat(gigastr,"This game should not have any CHR ROM. ");
417 strcat(gigastr,"\n");
418 FCEUD_PrintError(gigastr);
422 int iNESLoad(char *name, int fp)
426 if(FCEU_fread(&head,1,16,fp)!=16)
429 if(memcmp(&head,"NES\x1a",4))
432 if(!memcmp((char *)(&head)+0x7,"DiskDude",8))
434 memset((char *)(&head)+0x7,0,0x9);
437 if(!memcmp((char *)(&head)+0x7,"demiforce",9))
439 memset((char *)(&head)+0x7,0,0x9);
442 if(!memcmp((char *)(&head)+0xA,"Ni03",4))
444 if(!memcmp((char *)(&head)+0x7,"Dis",3))
445 memset((char *)(&head)+0x7,0,0x9);
447 memset((char *)(&head)+0xA,0,0x6);
453 ROM_size = head.ROM_size;
454 VROM_size = head.VROM_size;
455 ROM_size=uppow2(ROM_size);
458 VROM_size=uppow2(VROM_size);
460 MapperNo = (head.ROM_type>>4);
461 MapperNo|=(head.ROM_type2&0xF0);
463 Mirroring = (head.ROM_type&1);
464 if(head.ROM_type&8) Mirroring=2;
466 if(!(ROM=(uint8 *)FCEU_malloc(ROM_size<<14)))
470 if(!(VROM=(uint8 *)FCEU_malloc(VROM_size<<13)))
476 memset(ROM,0xFF,ROM_size<<14);
477 if(VROM_size) memset(VROM,0xFF,VROM_size<<13);
478 if(head.ROM_type&4) /* Trainer */
480 if(!(trainerpoo=FCEU_malloc(512)))
482 FCEU_fread(trainerpoo,512,1,fp);
485 SetupCartPRGMapping(0,ROM,ROM_size*0x4000,0);
486 SetupCartPRGMapping(1,WRAM,8192,1);
488 FCEU_fread(ROM,0x4000,head.ROM_size,fp);
491 FCEU_fread(VROM,0x2000,head.VROM_size,fp);
493 printf("File %s loaded.\n",name);
495 iNESGameCRC32=CalcCRC32(0,ROM,ROM_size<<14);
497 iNESGameCRC32=CalcCRC32(iNESGameCRC32,VROM,VROM_size<<13);
498 printf("\n PRG ROM: %3d x 16k\n CHR ROM: %3d x 8k\n ROM CRC32: %08lx\n Mapper: %d\n Mirroring: %s\n",head.ROM_size,head.VROM_size,iNESGameCRC32,MapperNo,Mirroring==2?"None(Four-screen)":Mirroring?"Vertical":"Horizontal");
499 if(head.ROM_type&2) puts(" Battery-backed.");
500 if(head.ROM_type&4) puts(" Trained.");
507 //if(MapperNo!=4 && MapperNo!=118 && MapperNo!=119) exit(1); // Testing
509 /* Must remain here because above functions might change value of
510 VROM_size and free(VROM).
513 SetupCartCHRMapping(0,VROM,VROM_size*0x2000,0);
516 SetupCartMirroring(4,1,ExtraNTARAM);
517 else if(Mirroring>=0x10)
518 SetupCartMirroring(2+(Mirroring&1),1,0);
520 SetupCartMirroring(Mirroring&1,(Mirroring&4)>>2,0);
522 if(MapperNo==5) DetectMMC5WRAMSize();
523 else if(MapperNo==1) DetectMMC1WRAMSize();
530 soot=FCEU_MakeFName(FCEUMKF_SAV,0,"sav");
541 extern uint8 MMC1WRAMsize;
542 if(MMC1WRAMsize==2) ptr=WRAM+8192;
546 extern uint8 MMC5WRAMsize;
550 if(fread(ptr,1,amount,sp)==amount)
551 printf(" WRAM Save File \"%s\" loaded...\n",soot);
556 GameInterface=iNESGI;
563 void FASTAPASS(1) onemir(uint8 V)
565 if(Mirroring==2) return;
572 void FASTAPASS(1) MIRROR_SET2(uint8 V)
574 if(Mirroring==2) return;
579 void FASTAPASS(1) MIRROR_SET(uint8 V)
581 if(Mirroring==2) return;
587 static void NONE_init(void)
589 ROM_BANK16(0x8000,0);
590 ROM_BANK16(0xC000,~0);
598 static uint8 secdata[2][32]=
601 0xff, 0xbf, 0xb7, 0x97, 0x97, 0x17, 0x57, 0x4f,
602 0x6f, 0x6b, 0xeb, 0xa9, 0xb1, 0x90, 0x94, 0x14,
603 0x56, 0x4e, 0x6f, 0x6b, 0xeb, 0xa9, 0xb1, 0x90,
604 0xd4, 0x5c, 0x3e, 0x26, 0x87, 0x83, 0x13, 0x00
607 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00,
608 0x00, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x94, 0x00,
609 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
610 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
614 static uint8 *secptr;
616 static void CheckVSUni(void)
618 FCEUGameInfo.type=GIT_VSUNI;
620 /* FCE Ultra doesn't complain when headers for these games are bad. */
622 switch(iNESGameCRC32)
624 default:FCEUGameInfo.type=0;break;
626 case 0xffbef374: pale=1;break; /* Castlevania */
629 case 0x7cff0f84: pale=2;break; /* SMB */
631 case 0xef7af338: pale=2;break; /* Ice Climber */
632 case 0xabe1a0c2: FCEUGameInfo.input[0]=SI_ZAPPER;break; /*Duck hunt */
633 case 0x16aa4e2d: pale=7;FCEUGameInfo.input[0]=SI_ZAPPER;break; /* hoganal ^_^ */
634 case 0x2b85420e: pale=3;break; /* Dr Mario */
636 case 0xfb0ddde7: pale=2;break;
637 case 0xc95321a8: pale=6;break; /* Excitebike */
638 case 0xb1c4c508: pale=1;break; /* Golf */
640 case 0x66471efe: break;
641 case 0xca3e9b1a: pale=7;break; /* Pinball*/
643 case 0xf735d926: pale=7; break; /* Gradius */
646 case 0x31678411:MapperNo=68;pale=7;break; /* Platoon */
648 case 0x74f713b4:pale=4;break; /* Goonies */
649 case 0x9ae2baa0:pale=5;break; /* Slalom */
650 case 0xe45485a5:secptr=secdata[1];vsdip=0x20;MapperNo=4;break; /* RBI Baseball */
651 case 0x21a653c7:vsdip=0x20;MapperNo=4;break; /* Super Sky Kid */
652 case 0xe9a6f17d:vsdip=0x20;break; /* Tetris */
654 case 0x159ef3c1:break; /* Star Luster */
655 case 0x9768e5e0:break; /* Stroke and Match Golf */
657 /* FCE Ultra doesn't have correct palettes for the following games. */
658 case 0x0fa322c2:pale=2;break; /* Clu Clu Land */
660 case 0x766c2cac: /* Soccer */
661 case 0x01357944: /* Battle City */
662 case 0xb2816bf9:break; /* Battle City (Bootleg) */
664 case 0x832cf592:FCEUGameInfo.input[0]=SI_ZAPPER;break; /* Freedom Force */
665 case 0x63abf889:break; /* Ladies Golf */
666 case 0x8c0c2df5:pale=2;MapperNo=1;Mirroring=1;break; /* Top Gun */
667 case 0x52c501d0:vsdip=0x80;MapperNo=4;secptr=secdata[0];break;
678 static DECLFR(VSRead)
680 //printf("$%04x, $%04x\n",A,X.PC);
684 case 0x5e00: VSindex=0;return 0xFF;
685 case 0x5e01: return(secptr[(VSindex++)&0x1F]);
689 static void DoVSHooks(void)
692 SetReadHandler(0x5e00,0x5e01,VSRead);
695 void (*MapInitTab[256])(void)=
698 Mapper1_init,Mapper2_init,Mapper3_init,Mapper4_init,
699 Mapper5_init,Mapper6_init,Mapper7_init,Mapper8_init,
700 Mapper9_init,Mapper10_init,Mapper11_init,0,
701 Mapper13_init,0,Mapper15_init,Mapper16_init,
702 Mapper17_init,Mapper18_init,Mapper19_init,0,
703 Mapper21_init,Mapper22_init,Mapper23_init,Mapper24_init,
704 Mapper25_init,Mapper26_init,0,0,
706 Mapper33_init,Mapper34_init,0,0,
708 Mapper41_init,Mapper42_init,Mapper43_init,Mapper44_init,
709 Mapper45_init,Mapper46_init,Mapper47_init,Mapper33_init,Mapper49_init,0,Mapper51_init,Mapper52_init,
712 Mapper65_init,Mapper66_init,Mapper67_init,Mapper68_init,
713 Mapper69_init,Mapper70_init,Mapper71_init,Mapper72_init,
714 Mapper73_init,0,Mapper75_init,Mapper76_init,
715 Mapper77_init,Mapper78_init,Mapper79_init,Mapper80_init,
716 0,Mapper82_init,Mapper83_init,0,
717 Mapper85_init,Mapper86_init,Mapper87_init,Mapper88_init,
718 Mapper89_init,Mapper90_init,0,Mapper92_init,
719 Mapper93_init,Mapper94_init,Mapper95_init,Mapper96_init,
720 Mapper97_init,0,Mapper99_init,0,
721 0,0,0,0,Mapper105_init,0,0,0,
722 0,0,0,Mapper112_init,Mapper113_init,0,0,0,
723 Mapper117_init,Mapper118_init,Mapper119_init,0,0,0,0,0,
725 0,0,0,0,0,0,0,Mapper140_init,
727 0,0,Mapper151_init,Mapper152_init,Mapper153_init,0,0,0,
730 0,0,0,0,0,0,0,Mapper180_init,
731 0,Mapper182_init,0,Mapper184_init,Mapper185_init,0,0,0,
732 Mapper189_init,0,0,0,0,0,0,0,
736 0,0,0,0,Mapper225_init,Mapper226_init,Mapper227_init,Mapper228_init,
737 Mapper229_init,0,0,Mapper232_init,0,Mapper234_init,Mapper43_init,0,
738 0,0,0,Mapper240_init,0,Mapper242_init,0,0,
739 Mapper245_init,Mapper246_init,0,Mapper248_init,Mapper249_init,Mapper250_init,0,0,0,0,0
749 return WRAM[A-0x6000];
752 void (*MapStateRestore)(int version);
753 void iNESStateRestore(int version)
757 if(!MapperNo) return;
760 setprg8(0x8000+x*8192,PRGBankList[x]);
764 setchr1(0x400*x,CHRBankList[x]);
768 case 0:setmirror(MI_H);break;
769 case 1:setmirror(MI_V);break;
771 case 0x10:setmirror(MI_0);break;
773 case 0x11:setmirror(MI_1);break;
775 if(MapStateRestore) MapStateRestore(version);
778 static int MMC_init(int type)
782 GameStateRestore=iNESStateRestore;
787 setprg8r(1,0x6000,0);
789 SetReadHandler(0x6000,0x7FFF,AWRAM);
790 SetWriteHandler(0x6000,0x7FFF,BWRAM);
791 FCEU_CheatAddRAM(8,0x6000,WRAM);
793 /* This statement represents atrocious code. I need to rewrite
794 all of the iNES mapper code... */
795 IRQCount=IRQLatch=IRQa=0;
798 extern uint8 MMC5WRAMsize,MMC1WRAMsize;
799 if(type==5 && MMC5WRAMsize==4)
800 memset(GameMemBlock+32768,0,sizeof(GameMemBlock)-32768);
801 else if(type==1 && MMC1WRAMsize==2)
803 memset(GameMemBlock,0,8192);
804 memset(GameMemBlock+16384,0,sizeof(GameMemBlock)-16384);
807 memset(GameMemBlock+8192,0,sizeof(GameMemBlock)-8192);
810 memset(GameMemBlock,0,sizeof(GameMemBlock));
812 memcpy(WRAM+4096,trainerpoo,512);
816 if(FCEUGameInfo.type==GIT_VSUNI)
820 MMC5HackVROMMask=CHRmask4[0];
821 MMC5HackExNTARAMPtr=MapperExRAM+0x6000;
823 MMC5HackVROMPTR=VROM;
827 AddExState(WRAM, 8192, 0, "WRAM");
828 if(type==19 || type==5 || type==6 || type==69 || type==85)
829 AddExState(MapperExRAM, 32768, 0, "MEXR");
830 if((!VROM_size || type==6 || type==19 || type==119) &&
831 (type!=13 && type!=96))
832 AddExState(CHRRAM, 8192, 0, "CHRR");
834 AddExState(ExtraNTARAM, 2048, 0, "EXNR");
836 /* Exclude some mappers whose emulation code handle save state stuff
838 if(type && type!=13 && type!=96)
840 AddExState(mapbyte1, 32, 0, "MPBY");
841 AddExState(&Mirroring, 1, 0, "MIRR");
842 AddExState(&IRQCount, 4, 1, "IRQC");
843 AddExState(&IRQLatch, 4, 1, "IQL1");
844 AddExState(&IRQa, 1, 0, "IRQA");
845 AddExState(PRGBankList, 4, 0, "PBL");
849 sprintf(tak,"CBL%d",x);
850 AddExState(&CHRBankList[x], 2, 1,tak);
854 if(MapInitTab[type]) MapInitTab[type]();
857 FCEU_PrintError("iNES mapper #%d is not supported at all.",type);