merge mappers from FCEU-mm
[fceu.git] / boards / a9746.c
1 /* FCE Ultra - NES/Famicom Emulator\r
2  *\r
3  * Copyright notice for this file:\r
4  *  Copyright (C) 2007 CaH4e3\r
5  *\r
6  * This program is free software; you can redistribute it and/or modify\r
7  * it under the terms of the GNU General Public License as published by\r
8  * the Free Software Foundation; either version 2 of the License, or\r
9  * (at your option) any later version.\r
10  *\r
11  * This program is distributed in the hope that it will be useful,\r
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14  * GNU General Public License for more details.\r
15  *\r
16  * You should have received a copy of the GNU General Public License\r
17  * along with this program; if not, write to the Free Software\r
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
19  */\r
20 \r
21 #include "mapinc.h"\r
22 #include "mmc3.h"\r
23 \r
24 static DECLFW(UNLA9746Write)\r
25 {\r
26 //   FCEU_printf("write raw %04x:%02x\n",A,V);\r
27    switch (A&0xE003)\r
28    {\r
29      case 0x8000: EXPREGS[1]=V; EXPREGS[0]=0; break;\r
30      case 0x8002: EXPREGS[0]=V; EXPREGS[1]=0; break;\r
31      case 0x8001: {\r
32                     uint8 bits_rev = ((V&0x20)>>5)|((V&0x10)>>3)|((V&0x08)>>1)|((V&0x04)<<1);\r
33                     switch(EXPREGS[0])\r
34                     {\r
35                       case 0x26: setprg8(0x8000, bits_rev); break;\r
36                       case 0x25: setprg8(0xA000, bits_rev); break; \r
37                       case 0x24: setprg8(0xC000, bits_rev); break; \r
38                       case 0x23: setprg8(0xE000, bits_rev); break;\r
39                     }\r
40                     switch(EXPREGS[1])\r
41                     {\r
42                       case 0x0a:\r
43                       case 0x08: EXPREGS[2] = (V << 4); break;\r
44                       case 0x09: setchr1(0x0000, EXPREGS[2]|(V >> 1)); break;\r
45                       case 0x0b: setchr1(0x0400, EXPREGS[2]|(V >> 1)|1);  break;\r
46                       case 0x0c:\r
47                       case 0x0e: EXPREGS[2] = (V << 4);  break;\r
48                       case 0x0d: setchr1(0x0800, EXPREGS[2]|(V >> 1));  break;\r
49                       case 0x0f: setchr1(0x0c00, EXPREGS[2]|(V >> 1)|1);  break;\r
50                       case 0x10:\r
51                       case 0x12: EXPREGS[2] = (V << 4);  break;\r
52                       case 0x11: setchr1(0x1000, EXPREGS[2]|(V >> 1)); break;\r
53                       case 0x14:\r
54                       case 0x16: EXPREGS[2] = (V << 4);  break;\r
55                       case 0x15: setchr1(0x1400, EXPREGS[2]|(V >> 1));  break;\r
56                       case 0x18:\r
57                       case 0x1a: EXPREGS[2] = (V << 4);  break;\r
58                       case 0x19: setchr1(0x1800, EXPREGS[2]|(V >> 1));  break;\r
59                       case 0x1c:\r
60                       case 0x1e: EXPREGS[2] = (V << 4);  break;\r
61                       case 0x1d: setchr1(0x1c00, EXPREGS[2]|(V >> 1));  break;\r
62                     }\r
63                   }\r
64                   break;\r
65    }\r
66 }\r
67 \r
68 static void UNLA9746Power(void)\r
69 {\r
70   GenMMC3Power();\r
71   SetWriteHandler(0x8000,0xbfff,UNLA9746Write);\r
72 }\r
73 \r
74 void UNLA9746_Init(CartInfo *info)\r
75 {\r
76   GenMMC3_Init(info, 128, 256, 0, 0);\r
77   info->Power=UNLA9746Power;\r
78   AddExState(EXPREGS, 6, 0, "EXPR");\r
79 }\r
80 \r