merge mapper code from FCEUX
[fceu.git] / boards / subor.c
1 #include "mapinc.h"\r
2 \r
3 static uint8 mode;\r
4 static uint8 DRegs[4];\r
5 \r
6 static SFORMAT StateRegs[]=\r
7 {\r
8   {DRegs, 4, "DREG"},\r
9   {0}\r
10 };\r
11 \r
12 static void Sync(void)\r
13 {\r
14   int base, bank;\r
15   base = ((DRegs[0]^DRegs[1])&0x10)<<1;\r
16   bank = (DRegs[2]^DRegs[3])&0x1f;\r
17 \r
18   if(DRegs[1]&0x08)\r
19   {\r
20     bank &= 0xfe;\r
21     if(mode==0)\r
22     {\r
23       setprg16(0x8000,base+bank+1);\r
24       setprg16(0xC000,base+bank+0);\r
25     }\r
26     else\r
27     {\r
28       setprg16(0x8000,base+bank+0);\r
29       setprg16(0xC000,base+bank+1);\r
30     }\r
31   }\r
32   else\r
33   {\r
34     if(DRegs[1]&0x04)\r
35     {\r
36       setprg16(0x8000,0x1f);\r
37       setprg16(0xC000,base+bank);\r
38     }\r
39     else\r
40     {\r
41       setprg16(0x8000,base+bank);\r
42       if(mode==0)\r
43          setprg16(0xC000,0x20);\r
44       else\r
45          setprg16(0xC000,0x07);\r
46     }\r
47   }\r
48 }\r
49 \r
50 static DECLFW(Mapper167_write)\r
51 {\r
52   DRegs[(A>>13)&0x03]=V;\r
53   Sync();\r
54 }\r
55 \r
56 static void StateRestore(int version)\r
57 {\r
58   Sync();\r
59 }\r
60 \r
61 void Mapper166_init(void)\r
62 {\r
63   mode=1;\r
64   DRegs[0]=DRegs[1]=DRegs[2]=DRegs[3]=0;\r
65   Sync();\r
66   SetWriteHandler(0x8000,0xFFFF,Mapper167_write);\r
67   GameStateRestore=StateRestore;\r
68   AddExState(&StateRegs, ~0, 0, 0);\r
69 }\r
70 \r
71 void Mapper167_init(void)\r
72 {\r
73   mode=0;\r
74   DRegs[0]=DRegs[1]=DRegs[2]=DRegs[3]=0;\r
75   Sync();\r
76   SetWriteHandler(0x8000,0xFFFF,Mapper167_write);\r
77   GameStateRestore=StateRestore;\r
78   AddExState(&StateRegs, ~0, 0, 0);\r
79 }\r