merge mapper code from FCEUX
[fceu.git] / boards / sachen.c
index 64ad5f6..ab57f3c 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
 #include "mapinc.h"
 
  */
 
 #include "mapinc.h"
 
-static uint8 cmd;
+static uint8 cmd, dip;
 static uint8 latch[8];
 
 static void S74LS374MSync(uint8 mirr)
 static uint8 latch[8];
 
 static void S74LS374MSync(uint8 mirr)
@@ -64,7 +64,8 @@ static DECLFR(S74LS374NRead)
 {
   uint8 ret;
   if((A&0x4100)==0x4100)
 {
   uint8 ret;
   if((A&0x4100)==0x4100)
-    ret=(X.DB&0xC0)|((~cmd)&0x3F);
+//    ret=(X.DB&0xC0)|((~cmd)&0x3F);
+    ret=((~cmd)&0x3F)^dip;
   else
     ret=X.DB;
   return ret;
   else
     ret=X.DB;
   return ret;
@@ -72,6 +73,7 @@ static DECLFR(S74LS374NRead)
 
 static void S74LS374NPower(void)
 {
 
 static void S74LS374NPower(void)
 {
+   dip=0;
    latch[0]=latch[1]=latch[2]=latch[3]=latch[4]=0;
    S74LS374NSynco();
    SetReadHandler(0x8000,0xFFFF,CartBR);
    latch[0]=latch[1]=latch[2]=latch[3]=latch[4]=0;
    S74LS374NSynco();
    SetReadHandler(0x8000,0xFFFF,CartBR);
@@ -79,6 +81,13 @@ static void S74LS374NPower(void)
    SetReadHandler(0x4100,0x5fff,S74LS374NRead);
 }
 
    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)
 {
    S74LS374NSynco();
 static void S74LS374NRestore(int version)
 {
    S74LS374NSynco();
@@ -87,9 +96,11 @@ static void S74LS374NRestore(int version)
 void S74LS374N_Init(CartInfo *info)
 {
   info->Power=S74LS374NPower;
 void S74LS374N_Init(CartInfo *info)
 {
   info->Power=S74LS374NPower;
+  info->Reset=S74LS374NReset;
   GameStateRestore=S74LS374NRestore;
   AddExState(latch, 5, 0, "LATC");
   AddExState(&cmd, 1, 0, "CMD");
   GameStateRestore=S74LS374NRestore;
   AddExState(latch, 5, 0, "LATC");
   AddExState(&cmd, 1, 0, "CMD");
+  AddExState(&dip, 1, 0, "DIP");
 }
 
 static void S74LS374NASynco(void)
 }
 
 static void S74LS374NASynco(void)
@@ -291,6 +302,12 @@ static void SA72007Synco()
   setchr8(latch[0]>>7);
 }
 
   setchr8(latch[0]>>7);
 }
 
+static void SA009Synco()
+{
+  setprg32(0x8000,0);
+  setchr8(latch[0]&1);
+}
+
 static void SA72008Synco()
 {
   setprg32(0x8000,(latch[0]>>2)&1);
 static void SA72008Synco()
 {
   setprg32(0x8000,(latch[0]>>2)&1);
@@ -321,6 +338,14 @@ void SA72008_Init(CartInfo *info)
   AddExState(&latch[0], 1, 0, "LATC");
 }
 
   AddExState(&latch[0], 1, 0, "LATC");
 }
 
+void SA009_Init(CartInfo *info)
+{
+  WSync=SA009Synco;
+  GameStateRestore=SARestore;
+  info->Power=SAPower;
+  AddExState(&latch[0], 1, 0, "LATC");
+}
+
 void SA0036_Init(CartInfo *info)
 {
   WSync=SA72007Synco;
 void SA0036_Init(CartInfo *info)
 {
   WSync=SA72007Synco;
@@ -337,13 +362,15 @@ void SA0037_Init(CartInfo *info)
   AddExState(&latch[0], 1, 0, "LATC");
 }
 
   AddExState(&latch[0], 1, 0, "LATC");
 }
 
+// -----------------------------------------------
+
 static void TCU01Synco()
 {
 static void TCU01Synco()
 {
-  setprg32(0x8000,(latch[0]>>2)&1);
+  setprg32(0x8000,((latch[0]&0x80)>>6)|((latch[0]>>2)&1));
   setchr8((latch[0]>>3)&0xF);
 }
 
   setchr8((latch[0]>>3)&0xF);
 }
 
-static DECLFW(TCWrite)
+static DECLFW(TCU01Write)
 {
   if((A&0x103)==0x102)
   {
 {
   if((A&0x103)==0x102)
   {
@@ -352,11 +379,11 @@ static DECLFW(TCWrite)
   }
 }
 
   }
 }
 
-static void TCU01Reset(void)
+static void TCU01Power(void)
 {
   latch[0]=0;
   SetReadHandler(0x8000,0xFFFF,CartBR);
 {
   latch[0]=0;
   SetReadHandler(0x8000,0xFFFF,CartBR);
-  SetWriteHandler(0x4100,0xFFFF,TCWrite);
+  SetWriteHandler(0x4100,0xFFFF,TCU01Write);
   TCU01Synco();
 }
 
   TCU01Synco();
 }
 
@@ -368,10 +395,55 @@ static void TCU01Restore(int version)
 void TCU01_Init(CartInfo *info)
 {
   GameStateRestore=TCU01Restore;
 void TCU01_Init(CartInfo *info)
 {
   GameStateRestore=TCU01Restore;
-  info->Power=TCU01Reset;
+  info->Power=TCU01Power;
   AddExState(&latch[0], 1, 0, "LATC");
 }
 
   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;
 static DECLFR(TCA01Read)
 {
   uint8 ret;
@@ -382,7 +454,7 @@ static DECLFR(TCA01Read)
   return ret;
 }
 
   return ret;
 }
 
-static void TCA01Reset(void)
+static void TCA01Power(void)
 {
   setprg16(0x8000,0);
   setprg16(0xC000,1);
 {
   setprg16(0x8000,0);
   setprg16(0xC000,1);
@@ -393,6 +465,6 @@ static void TCA01Reset(void)
 
 void TCA01_Init(CartInfo *info)
 {
 
 void TCA01_Init(CartInfo *info)
 {
-  info->Power=TCA01Reset;
+  info->Power=TCA01Power;
 }
 
 }