merge mappers from FCEU-mm
[fceu.git] / boards / sachen.c
index bcec3a9..a2b5741 100644 (file)
 
 #include "mapinc.h"
 
-static uint8 cmd;
+static uint8 cmd, dip;
 static uint8 latch[8];
 
-static void MSync(uint8 mirr)
+static void S74LS374MSync(uint8 mirr)
 {
   switch(mirr&3)
   {
@@ -38,7 +38,7 @@ static void S74LS374NSynco(void)
 {
   setprg32(0x8000,latch[0]);
   setchr8(latch[1]|latch[3]|latch[4]);
-  MSync(latch[2]);
+  S74LS374MSync(latch[2]);
 }
 
 static DECLFW(S74LS374NWrite)
@@ -50,9 +50,9 @@ static DECLFW(S74LS374NWrite)
   {
     switch(cmd)
     {
-      case 2:latch[3]=(V&1)<<3;break;
+      case 2:latch[0]=V&1; latch[3]=(V&1)<<3;break;
       case 4:latch[4]=(V&1)<<2;break;
-      case 5:latch[0]=V&0x7;break;
+      case 5:latch[0]=V&7;break;
       case 6:latch[1]=V&3;break;
       case 7:latch[2]=V>>1;break;
     }
@@ -60,12 +60,32 @@ static DECLFW(S74LS374NWrite)
   }
 }
 
+static DECLFR(S74LS374NRead)
+{
+  uint8 ret;
+  if((A&0x4100)==0x4100)
+//    ret=(X.DB&0xC0)|((~cmd)&0x3F);
+    ret=((~cmd)&0x3F)^dip;
+  else
+    ret=X.DB;
+  return ret;
+}
+
 static void S74LS374NPower(void)
 {
+   dip=0;
    latch[0]=latch[1]=latch[2]=latch[3]=latch[4]=0;
    S74LS374NSynco();
    SetReadHandler(0x8000,0xFFFF,CartBR);
    SetWriteHandler(0x4100,0x7FFF,S74LS374NWrite);
+   SetReadHandler(0x4100,0x5fff,S74LS374NRead);
+}
+
+static void S74LS374NReset(void)
+{
+   dip^=1;
+   latch[0]=latch[1]=latch[2]=latch[3]=latch[4]=0;
+   S74LS374NSynco();
 }
 
 static void S74LS374NRestore(int version)
@@ -76,16 +96,18 @@ static void S74LS374NRestore(int version)
 void S74LS374N_Init(CartInfo *info)
 {
   info->Power=S74LS374NPower;
+  info->Reset=S74LS374NReset;
   GameStateRestore=S74LS374NRestore;
   AddExState(latch, 5, 0, "LATC");
   AddExState(&cmd, 1, 0, "CMD");
+  AddExState(&dip, 1, 0, "DIP");
 }
 
 static void S74LS374NASynco(void)
 {
   setprg32(0x8000,latch[0]);
   setchr8(latch[1]);
-  MSync(latch[2]);
+  S74LS374MSync(latch[2]);
 }
 
 static DECLFW(S74LS374NAWrite)
@@ -104,7 +126,7 @@ static DECLFW(S74LS374NAWrite)
       case 6:latch[1]=(latch[1]&1)|latch[3]|((V&3)<<1);break;
       case 7:latch[2]=V&1;break;
     }
-    S74LS374NSynco();
+    S74LS374NASynco();
   }
 }
 
@@ -126,7 +148,6 @@ void S74LS374NA_Init(CartInfo *info)
 }
 
 static int type;
-//static int PPUbus;
 static void S8259Synco(void)
 {
   int x;
@@ -159,7 +180,10 @@ static void S8259Synco(void)
       }
     }
   }
-  MSync(latch[7]>>1);
+  if(!(latch[7]&1))
+    S74LS374MSync(latch[7]>>1);
+  else
+    setmirror(MI_V);
 }
 
 static DECLFW(S8259Write)
@@ -230,12 +254,6 @@ void S8259D_Init(CartInfo *info) // Kevin's Horton 137 mapper
 
 static void(*WSync)(void);
 
-static void SA0161MSynco()
-{
-  setprg32(0x8000,(latch[0]>>3)&1);
-  setchr8(latch[0]&7);
-}
-
 static DECLFW(SAWrite)
 {
   if(A&0x100)
@@ -245,7 +263,7 @@ static DECLFW(SAWrite)
   }
 }
 
-static void SAReset(void)
+static void SAPower(void)
 {
   latch[0]=0;
   WSync();
@@ -253,116 +271,119 @@ static void SAReset(void)
   SetWriteHandler(0x4100,0x5FFF,SAWrite);
 }
 
-static void SA0161MRestore(int version)
+static void SARestore(int version)
 {
-  SA0161MSynco();
+  WSync();
 }
 
-void SA0161M_Init(CartInfo *info)
+static DECLFW(SADWrite)
 {
-  WSync=SA0161MSynco;
-  GameStateRestore=SA0161MRestore;
-  info->Power=SAReset;
-  AddExState(&latch[0], 1, 0, "LATC");
+  latch[0]=V;
+  WSync();
 }
 
-static void SA72007Synco()
+static void SADPower(void)
 {
-  setprg32(0x8000,0);
-  setchr8(latch[0]>>7);
+  latch[0]=0;
+  WSync();
+  SetReadHandler(0x8000,0xFFFF,CartBR);
+  SetWriteHandler(0x8000,0xFFFF,SADWrite);
 }
 
-static void SA72007Restore(int version)
+static void SA0161MSynco()
 {
-  SA72007Synco();
+  setprg32(0x8000,(latch[0]>>3)&1);
+  setchr8(latch[0]&7);
 }
 
-void SA72007_Init(CartInfo *info)
+static void SA72007Synco()
 {
-  WSync=SA72007Synco;
-  GameStateRestore=SA72007Restore;
-  info->Power=SAReset;
-  AddExState(&latch[0], 1, 0, "LATC");
+  setprg32(0x8000,0);
+  setchr8(latch[0]>>7);
 }
 
-static void SA72008Synco()
+static void SA009Synco()
 {
-  setprg32(0x8000,(latch[0]>>2)&1);
-  setchr8(latch[0]&3);
+  setprg32(0x8000,0);
+  setchr8(latch[0]&1);
 }
 
-static void SA72008Restore(int version)
+static void SA72008Synco()
 {
-  SA72008Synco();
+  setprg32(0x8000,(latch[0]>>2)&1);
+  setchr8(latch[0]&3);
 }
 
-void SA72008_Init(CartInfo *info)
+void SA0161M_Init(CartInfo *info)
 {
-  WSync=SA72008Synco;
-  GameStateRestore=SA72008Restore;
-  info->Power=SAReset;
+  WSync=SA0161MSynco;
+  GameStateRestore=SARestore;
+  info->Power=SAPower;
   AddExState(&latch[0], 1, 0, "LATC");
 }
 
-static DECLFW(SADWrite)
-{
-  latch[0]=V;
-  WSync();
-}
-
-static void SADReset(void)
+void SA72007_Init(CartInfo *info)
 {
-  latch[0]=0;
-  WSync();
-  SetReadHandler(0x8000,0xFFFF,CartBR);
-  SetWriteHandler(0x8000,0xFFFF,SADWrite);
+  WSync=SA72007Synco;
+  GameStateRestore=SARestore;
+  info->Power=SAPower;
+  AddExState(&latch[0], 1, 0, "LATC");
 }
 
-static void SA0037Synco()
+void SA72008_Init(CartInfo *info)
 {
-  setprg32(0x8000,(latch[0]>>3)&1);
-  setchr8(latch[0]&7);
+  WSync=SA72008Synco;
+  GameStateRestore=SARestore;
+  info->Power=SAPower;
+  AddExState(&latch[0], 1, 0, "LATC");
 }
 
-static void SA0037Restore(int version)
+void SA009_Init(CartInfo *info)
 {
-  SA0037Synco();
+  WSync=SA009Synco;
+  GameStateRestore=SARestore;
+  info->Power=SAPower;
+  AddExState(&latch[0], 1, 0, "LATC");
 }
 
 void SA0036_Init(CartInfo *info)
 {
   WSync=SA72007Synco;
-  GameStateRestore=SA72007Restore;
-  info->Power=SADReset;
+  GameStateRestore=SARestore;
+  info->Power=SADPower;
   AddExState(&latch[0], 1, 0, "LATC");
 }
 
 void SA0037_Init(CartInfo *info)
 {
-  WSync=SA0037Synco;
-  GameStateRestore=SA0037Restore;
-  info->Power=SADReset;
+  WSync=SA0161MSynco;
+  GameStateRestore=SARestore;
+  info->Power=SADPower;
   AddExState(&latch[0], 1, 0, "LATC");
 }
 
+// -----------------------------------------------
+
 static void TCU01Synco()
 {
-  setprg32(0x8000,(latch[0]>>2)&1);
+  setprg32(0x8000,((latch[0]&0x80)>>6)|((latch[0]>>2)&1));
   setchr8((latch[0]>>3)&0xF);
 }
 
-static DECLFW(TCWrite)
+static DECLFW(TCU01Write)
 {
   if((A&0x103)==0x102)
+  {
     latch[0]=V;
-  TCU01Synco();
+    TCU01Synco();
+  }
 }
 
-static void TCU01Reset(void)
+static void TCU01Power(void)
 {
   latch[0]=0;
   SetReadHandler(0x8000,0xFFFF,CartBR);
-  SetWriteHandler(0x4100,0xFFFF,TCWrite);
+  SetWriteHandler(0x4100,0xFFFF,TCU01Write);
   TCU01Synco();
 }
 
@@ -374,10 +395,55 @@ static void TCU01Restore(int version)
 void TCU01_Init(CartInfo *info)
 {
   GameStateRestore=TCU01Restore;
-  info->Power=TCU01Reset;
+  info->Power=TCU01Power;
   AddExState(&latch[0], 1, 0, "LATC");
 }
 
+//-----------------------------------------------
+
+static void TCU02Synco()
+{
+  setprg32(0x8000,0);
+  setchr8(latch[0]&3);
+}
+
+static DECLFW(TCU02Write)
+{
+  if((A&0x103)==0x102)
+  {
+    latch[0]=V+3;
+    TCU02Synco();
+  }
+}
+
+static DECLFR(TCU02Read)
+{
+  return (latch[0]&0x3F)|(X.DB&0xC0);
+}
+
+static void TCU02Power(void)
+{
+  latch[0]=0;
+  SetReadHandler(0x8000,0xFFFF,CartBR);
+  SetReadHandler(0x4100,0x4100,TCU02Read);
+  SetWriteHandler(0x4100,0xFFFF,TCU02Write);
+  TCU02Synco();
+}
+
+static void TCU02Restore(int version)
+{
+  TCU02Synco();
+}
+
+void TCU02_Init(CartInfo *info)
+{
+  GameStateRestore=TCU02Restore;
+  info->Power=TCU02Power;
+  AddExState(&latch[0], 1, 0, "LATC");
+}
+
+// ---------------------------------------------
+
 static DECLFR(TCA01Read)
 {
   uint8 ret;
@@ -388,7 +454,7 @@ static DECLFR(TCA01Read)
   return ret;
 }
 
-static void TCA01Reset(void)
+static void TCA01Power(void)
 {
   setprg16(0x8000,0);
   setprg16(0xC000,1);
@@ -399,5 +465,6 @@ static void TCA01Reset(void)
 
 void TCA01_Init(CartInfo *info)
 {
-  info->Power=TCA01Reset;
+  info->Power=TCA01Power;
 }
+