43725da7 |
1 | /* FCE Ultra - NES/Famicom Emulator\r |
386f5371 |
2 | *\r |
3 | * Copyright notice for this file:\r |
4 | * Copyright (C) 2006 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 |
43725da7 |
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r |
386f5371 |
19 | */\r |
20 | \r |
21 | #include "mapinc.h"\r |
22 | #include "mmc3.h"\r |
386f5371 |
23 | \r |
386f5371 |
24 | static uint8 unromchr;\r |
43725da7 |
25 | static uint32 dipswitch = 0;\r |
386f5371 |
26 | static uint8 *CHRRAM=NULL;\r |
27 | static uint32 CHRRAMSize;\r |
28 | \r |
29 | static void BMCFK23CCW(uint32 A, uint8 V)\r |
30 | {\r |
31 | if(EXPREGS[0]&0x40)\r |
32 | setchr8(EXPREGS[2]|unromchr);\r |
33 | else if(EXPREGS[0]&0x20) {\r |
34 | setchr1r(0x10, A, V);\r |
35 | }\r |
36 | else\r |
37 | {\r |
38 | uint16 base=(EXPREGS[2]&0x7F)<<3;\r |
39 | if(EXPREGS[3]&2)\r |
40 | {\r |
41 | int cbase=(MMC3_cmd&0x80)<<5;\r |
42 | setchr1(A,V|base);\r |
43 | setchr1(0x0000^cbase,DRegBuf[0]|base);\r |
44 | setchr1(0x0400^cbase,EXPREGS[6]|base);\r |
45 | setchr1(0x0800^cbase,DRegBuf[1]|base);\r |
46 | setchr1(0x0c00^cbase,EXPREGS[7]|base);\r |
47 | }\r |
48 | else\r |
49 | setchr1(A,V|base);\r |
50 | }\r |
51 | }\r |
52 | \r |
386f5371 |
53 | static void BMCFK23CPW(uint32 A, uint8 V)\r |
54 | {\r |
55 | uint32 bank = (EXPREGS[1] & 0x1F);\r |
56 | uint32 hiblock = ((EXPREGS[0] & 8) << 4)|((EXPREGS[0] & 0x80) << 1)|(UNIFchrrama?((EXPREGS[2] & 0x40)<<3):0);\r |
57 | uint32 block = (EXPREGS[1] & 0x60) | hiblock;\r |
58 | uint32 extra = (EXPREGS[3] & 2);\r |
43725da7 |
59 | switch(EXPREGS[0]&7)\r |
386f5371 |
60 | {\r |
43725da7 |
61 | case 0: setprg8(A, (block << 1) | (V & 0x3F));\r |
62 | if(extra)\r |
63 | {\r |
64 | setprg8(0xC000,EXPREGS[4]);\r |
65 | setprg8(0xE000,EXPREGS[5]);\r |
66 | }\r |
67 | break;\r |
68 | case 1: setprg8(A, ((hiblock | (EXPREGS[1] & 0x70)) << 1) | (V & 0x1F));\r |
69 | if(extra)\r |
70 | {\r |
71 | setprg8(0xC000,EXPREGS[4]);\r |
72 | setprg8(0xE000,EXPREGS[5]);\r |
73 | }\r |
74 | break;\r |
75 | case 2: setprg8(A, ((hiblock | (EXPREGS[1] & 0x78)) << 1) | (V & 0x0F));\r |
76 | if(extra)\r |
77 | {\r |
78 | setprg8(0xC000,EXPREGS[4]);\r |
79 | setprg8(0xE000,EXPREGS[5]);\r |
80 | }\r |
81 | break;\r |
82 | case 3: setprg16(0x8000,(bank | block));\r |
83 | setprg16(0xC000,(bank | block));\r |
84 | break;\r |
85 | case 4: setprg32(0x8000,(bank | block) >> 1);\r |
86 | break;\r |
386f5371 |
87 | }\r |
43725da7 |
88 | setprg8r(0x10,0x6000,A001B&3);\r |
386f5371 |
89 | }\r |
90 | \r |
386f5371 |
91 | static DECLFW(BMCFK23CHiWrite)\r |
92 | {\r |
43725da7 |
93 | if(EXPREGS[0]&0x40)\r |
94 | {\r |
95 | if(EXPREGS[0]&0x30)\r |
96 | unromchr=0;\r |
97 | else\r |
98 | {\r |
99 | unromchr=V&3;\r |
100 | FixMMC3CHR(MMC3_cmd);\r |
101 | }\r |
102 | }\r |
103 | else\r |
104 | {\r |
105 | if((A==0x8001)&&(EXPREGS[3]&2)&&(MMC3_cmd&8))\r |
106 | {\r |
107 | EXPREGS[4|(MMC3_cmd&3)]=V;\r |
108 | FixMMC3PRG(MMC3_cmd);\r |
109 | FixMMC3CHR(MMC3_cmd);\r |
110 | }\r |
386f5371 |
111 | else\r |
112 | if(A<0xC000) {\r |
113 | if(UNIFchrrama) { // hacky... strange behaviour, must be bit scramble due to pcb layot restrictions\r |
114 | // check if it not interfer with other dumps\r |
115 | if((A==0x8000)&&(V==0x46))\r |
116 | V=0x47;\r |
117 | else if((A==0x8000)&&(V==0x47))\r |
118 | V=0x46;\r |
119 | }\r |
120 | MMC3_CMDWrite(A,V);\r |
121 | FixMMC3PRG(MMC3_cmd);\r |
122 | }\r |
123 | else\r |
124 | MMC3_IRQWrite(A,V);\r |
125 | }\r |
126 | }\r |
127 | \r |
386f5371 |
128 | static DECLFW(BMCFK23CWrite)\r |
129 | {\r |
43725da7 |
130 | //FCEU_printf("lo %04x:%02x\n",A,V);\r |
131 |