merge mappers from FCEU-mm
[fceu.git] / boards / addrlatch.c
index 4b70d6e..afd0919 100644 (file)
@@ -15,7 +15,7 @@
  *\r
  * You should have received a copy of the GNU General Public License\r
  * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
  */\r
 \r
 #include "mapinc.h"\r
@@ -27,7 +27,7 @@ static readfunc defread;
 \r
 static DECLFW(LatchWrite)\r
 {\r
-  FCEU_printf("%04x:%02x\n",A,V);\r
+//  FCEU_printf("%04x:%02x\n",A,V);\r
   latche=A;\r
   WSync();\r
 }\r
@@ -119,6 +119,41 @@ void BMCD1038_Init(CartInfo *info)
 }\r
 \r
 \r
+//------------------ UNL43272 ---------------------------\r
+// mapper much complex, including 16K bankswitching \r
+static void UNL43272Sync(void)\r
+{\r
+  if((latche&0x81) == 0x81)\r
+  {\r
+    setprg32(0x8000,(latche&0x38)>>3);\r
+  }\r
+  else\r
+    FCEU_printf("unrecognized command %04!\n",latche);\r
+  setchr8(0);\r
+  setmirror(0);\r
+}\r
+\r
+static DECLFR(UNL43272Read)\r
+{\r
+  if(latche&0x400)\r
+    return CartBR(A & 0xFE);\r
+  else\r
+    return CartBR(A);\r
+}\r
+\r
+static void UNL43272Reset(void)\r
+{\r
+  latche = 0;\r
+  UNL43272Sync();\r
+}\r
+\r
+void UNL43272_Init(CartInfo *info)\r
+{ \r
+  Latch_Init(info, UNL43272Sync, UNL43272Read, 0x81, 0x8000, 0xFFFF);\r
+  info->Reset=UNL43272Reset;\r
+  AddExState(&dipswitch, 1, 0, "DIPSW");\r
+}\r
+\r
 //------------------ Map 058 ---------------------------\r
 \r
 static void BMCGK192Sync(void)\r
@@ -139,6 +174,39 @@ void BMCGK192_Init(CartInfo *info)
   Latch_Init(info, BMCGK192Sync, 0, 0, 0x8000, 0xFFFF);\r
 }\r
 \r
+//------------------ Map 092 ---------------------------\r
+// Another two-in-one mapper, two Jaleco carts uses similar\r
+// hardware, but with different wiring.\r
+// Original code provided by LULU\r
+// Additionally, PCB contains DSP extra sound chip, used for voice samples (unemulated)\r
+\r
+static void M92Sync(void)\r
+{\r
+  uint8 reg = latche & 0xF0;\r
+  setprg16(0x8000,0);\r
+  if(latche>=0x9000)\r
+  {\r
+    switch (reg)\r
+    {\r
+      case 0xD0: setprg16(0xc000, latche & 15); break;\r
+      case 0xE0: setchr8(latche & 15); break;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    switch (reg)\r
+    {\r
+      case 0xB0: setprg16(0xc000, latche & 15); break;\r
+      case 0x70: setchr8(latche & 15); break;\r
+    }\r
+  }\r
+}\r
+\r
+void Mapper92_Init(CartInfo *info)\r
+{\r
+  Latch_Init(info, M92Sync, 0, 0x80B0, 0x8000, 0xFFFF);\r
+}\r
+\r
 //------------------ Map 200 ---------------------------\r
 \r
 static void M200Sync(void)\r
@@ -170,3 +238,49 @@ void BMC190in1_Init(CartInfo *info)
   Latch_Init(info, BMC190in1Sync, 0, 0, 0x8000, 0xFFFF);\r
 }\r
 \r
+//-------------- BMC810544-C-A1 ------------------------\r
+\r
+static void BMC810544CA1Sync(void)\r
+{\r
+  uint32 bank = latche>>7;\r
+  if(latche&0x40)\r
+    setprg32(0x8000,bank);\r
+  else\r
+  {\r
+    setprg16(0x8000,(bank<<1)|((latche>>5)&1));\r
+    setprg16(0xC000,(bank<<1)|((latche>>5)&1));\r
+  }\r
+  setchr8(latche&0x0f);\r
+  setmirror(((latche>>4)&1)^1);\r
+}\r
+\r
+void BMC810544CA1_Init(CartInfo *info)\r
+{ \r
+  Latch_Init(info, BMC810544CA1Sync, 0, 0, 0x8000, 0xFFFF);\r
+}\r
+\r
+//-------------- BMCNTD-03 ------------------------\r
+\r
+static void BMCNTD03Sync(void)\r
+{\r
+  // 1PPP Pmcc spxx xccc\r
+  // 1000 0000 0000 0000 v\r
+  // 1001 1100 0000 0100 h\r
+  // 1011 1010 1100 0100\r
+  uint32 prg = ((latche>>10)&0x1e);\r
+  uint32 chr = ((latche&0x0300)>>5)|(latche&7);\r
+  if(latche&0x80)\r
+  {\r
+    setprg16(0x8000,prg|((latche>>6)&1));\r
+    setprg16(0xC000,prg|((latche>>6)&1));\r
+  }\r
+  else\r
+    setprg32(0x8000,prg>>1);\r
+  setchr8(chr);\r
+  setmirror(((latche>>10)&1)^1);\r
+}\r
+\r
+void BMCNTD03_Init(CartInfo *info)\r
+{ \r
+  Latch_Init(info, BMCNTD03Sync, 0, 0, 0x8000, 0xFFFF);\r
+}\r