mappers updated to 0.98.16
[fceu.git] / boards / h2288.c
1 /* FCE Ultra - NES/Famicom Emulator
2  *
3  * Copyright notice for this file:
4  *  Copyright (C) 2005 CaH4e3
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #include "mapinc.h"
22 #include "mmc3.h"
23
24 extern uint8 m114_perm[8];
25
26 static void H2288PW(uint32 A, uint8 V)
27 {
28   if(EXPREGS[0]&0x40)
29   {
30     uint8 bank=(EXPREGS[0]&5)|((EXPREGS[0]&8)>>2)|((EXPREGS[0]&0x20)>>2);
31     if(EXPREGS[0]&2)
32       setprg32(0x8000,bank>>1);
33     else
34     {
35       setprg16(0x8000,bank);
36       setprg16(0xC000,bank);
37     }
38   }
39   else
40     setprg8(A,V&0x3F);
41 }
42
43 static DECLFW(H2288WriteHi)
44 {
45   switch (A&0x8001)
46   {
47     case 0x8000: MMC3_CMDWrite(0x8000,(V&0xC0)|(m114_perm[V&7])); break;
48     case 0x8001: MMC3_CMDWrite(0x8001,V); break;
49   }
50 }
51
52 static DECLFW(H2288WriteLo)
53 {
54   if(A&0x800)
55   {
56     if(A&1)
57       EXPREGS[1]=V;
58     else
59       EXPREGS[0]=V;
60     FixMMC3PRG(MMC3_cmd);
61   }
62 }
63
64 static DECLFR(H2288Read)
65 {
66   int bit;
67   bit=(A&1)^1;
68   bit&=((A>>8)&1);
69   bit^=1;
70   return((X.DB&0xFE)|bit);
71 }
72
73 static void H2288Power(void)
74 {
75   EXPREGS[0]=EXPREGS[1]=0;
76   GenMMC3Power();
77   SetReadHandler(0x5000,0x5FFF,H2288Read);
78   SetReadHandler(0x8000,0xFFFF,CartBR);
79   SetWriteHandler(0x5000,0x5FFF,H2288WriteLo);
80   SetWriteHandler(0x8000,0x8FFF,H2288WriteHi);
81 }
82
83 void UNLH2288_Init(CartInfo *info)
84 {
85   GenMMC3_Init(info, 256, 256, 0, 0);
86   pwrap=H2288PW;
87   info->Power=H2288Power;
88   AddExState(EXPREGS, 2, 0, "EXPR");
89 }