updated bords/mappers/stuff to 0.98.15, lots of them got broken, asmcore support...
[fceu.git] / boards / super24.c
index 7cf0646..4265b5c 100644 (file)
-/* FCE Ultra - NES/Famicom Emulator
- *
- * Copyright notice for this file:
- *  Copyright (C) 2002 Ben Parnell
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * 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
- */
-
-#include "mapinc.h"
-//undef printf
-
-static int32 IRQCount,IRQLatch;
-static uint8 IRQa,resetmode,mbia;
-static uint8 sizer,bigbank,bigbank2;
-
-static uint8 DRegBuf[8],MMC3_cmd;
-
-static int masko8[8]={63,31,15,1,3,0,0,0};
-//static int masko1[8]={511,255,127,7,7,0,0,0};
-
-static void swsetprg8(uint32 A, uint32 V)
-{
- V&=masko8[sizer&7];
- V|=(bigbank*2);
- setprg8r((V/64)&15,A,V);
-}
-
-static void swsetchr1(uint32 A, uint32 V)
-{
- if(sizer&0x20)
-  setchr1r(0x10,A,V);
- else
- {
-//  V&=masko1[sizer&7];
-  V|=bigbank2*8;
-  setchr1r((V/512)&15,A,V);
- }
-}
-
-static void swsetchr2(uint32 A, uint32 V)
-{
- if(sizer&0x20)
-  setchr2r(0x10,A,V);
- else
- {
-  //V&=masko1[sizer&7]>>1;
-  V|=bigbank2*4;
-  setchr2r((V/256)&15,A,V);
- }
-}
-
-static void Sup24_hb(void)
-{
-     if(ScreenON || SpriteON)
-     {
-      resetmode=0;
-      if(IRQCount>=0)
-      {
-        IRQCount--;
-        if(IRQCount<0)
-        {
-         if(IRQa)
-         {
-            resetmode = 1;
-           X6502_IRQBegin(FCEU_IQEXT);
-         }
-        }
-      }
-     }
-}
-
-static DECLFW(Sup24IRQWrite)
-{
-        switch(A&0xE001)
-        {
-         case 0xc000:IRQLatch=V;
-                     if(resetmode==1)
-                      IRQCount=IRQLatch;
-                     break;
-         case 0xc001:resetmode=1;
-                     IRQCount=IRQLatch;
-                     break;
-         case 0xE000:IRQa=0;X6502_IRQEnd(FCEU_IQEXT);
-                     if(resetmode==1)
-                      {IRQCount=IRQLatch;}
-                     break;
-         case 0xE001:IRQa=1;
-                     if(resetmode==1)
-                       {IRQCount=IRQLatch;}
-                     break;
-        }
-}
-
-static INLINE void FixMMC3PRG(int V)
-{
-         swsetprg8(0xA000,DRegBuf[7]);
-         swsetprg8(0xE000,~0);
-          if(V&0x40)
-           {
-            swsetprg8(0xC000,DRegBuf[6]);
-            swsetprg8(0x8000,~1);
-           }
-          else
-           {
-            swsetprg8(0x8000,DRegBuf[6]);
-            swsetprg8(0xC000,~1);
-           }
-         X6502_Rebase();
-}
-
-static INLINE void FixMMC3CHR(int V)
-{
-           int cbase=(V&0x80)<<5;
-           swsetchr2((cbase^0x000),DRegBuf[0]>>1);
-           swsetchr2((cbase^0x800),DRegBuf[1]>>1);
-           swsetchr1(cbase^0x1000,DRegBuf[2]);
-           swsetchr1(cbase^0x1400,DRegBuf[3]);
-           swsetchr1(cbase^0x1800,DRegBuf[4]);
-           swsetchr1(cbase^0x1c00,DRegBuf[5]);
-}
-
-static DECLFW(Super24hiwrite)
-{
-       //printf("$%04x:$%02x, %d\n",A,V,scanline);
-        switch(A&0xE001)
-        {
-         case 0x8000:
-          if((V&0x40) != (MMC3_cmd&0x40))
-           FixMMC3PRG(V);
-          if((V&0x80) != (MMC3_cmd&0x80))
-           FixMMC3CHR(V);
-          MMC3_cmd = V;
-          break;
-
-        case 0x8001:
-                {
-                 int cbase=(MMC3_cmd&0x80)<<5;
-                 DRegBuf[MMC3_cmd&0x7]=V;
-                 switch(MMC3_cmd&0x07)
-                 {
-                  case 0: V>>=1;swsetchr2((cbase^0x000),V);break;
-                  case 1: V>>=1;swsetchr2((cbase^0x800),V);break;
-                  case 2: swsetchr1(cbase^0x1000,V); break;
-                  case 3: swsetchr1(cbase^0x1400,V); break;
-                  case 4: swsetchr1(cbase^0x1800,V); break;
-                  case 5: swsetchr1(cbase^0x1C00,V); break;
-                  case 6: if (MMC3_cmd&0x40) swsetprg8(0xC000,V);
-                          else swsetprg8(0x8000,V);
-                          X6502_Rebase();
-                          break;
-                  case 7: swsetprg8(0xA000,V);
-                          X6502_Rebase();
-                          break;
-                 }
-                }
-                break;
-
-        case 0xA000:
-               mbia=V;
-                setmirror((V&1)^1);
-                break;
- }
-}
-
-
-DECLFW(Super24Write)
-{
- //printf("$%04x:$%02x\n",A,V);
- switch(A)
- {
-  case 0x5ff0:sizer=V;
-             FixMMC3PRG(MMC3_cmd);
-             FixMMC3CHR(MMC3_cmd);
-             break;
-  case 0x5FF1:
-             bigbank=V;
-             FixMMC3PRG(MMC3_cmd);
-             break;
-  case 0x5FF2:
-             bigbank2=V;
-             FixMMC3CHR(MMC3_cmd);
-             break;
- }
-}
-
-static void Super24Reset(void)
-{
- SetWriteHandler(0x8000,0xBFFF,Super24hiwrite);
- SetWriteHandler(0x5000,0x7FFF,Super24Write);
- SetWriteHandler(0xC000,0xFFFF,Sup24IRQWrite);
- SetReadHandler(0x8000,0xFFFF,CartBR);
- GameHBIRQHook=Sup24_hb;
- IRQCount=IRQLatch=IRQa=resetmode=0;
- sizer=0x24;
- bigbank=159;
- bigbank2=0;
-
- MMC3_cmd=0;
- DRegBuf[6]=0;
- DRegBuf[7]=1;
-
- FixMMC3PRG(0);
- FixMMC3CHR(0);
-}
-
-static void MrRestore(int version)
-{
- FixMMC3PRG(MMC3_cmd);
- FixMMC3CHR(MMC3_cmd);
- setmirror((mbia&1)^1);
-}
-
-void Super24_Init(void)
-{
- BoardPower=Super24Reset;
- SetupCartCHRMapping(0x10, GameMemBlock, 8192, 1);
- GameStateRestore=MrRestore;
-
- AddExState(GameMemBlock, 8192, 0, "CHRR");
- AddExState(DRegBuf, 8, 0, "DREG");
- AddExState(&IRQCount, 4, 1, "IRQC");
- AddExState(&IRQLatch, 4, 1, "IQL1");
- AddExState(&IRQa, 1, 0, "IRQA");
- AddExState(&sizer, 1, 0, "SIZA");
- AddExState(&bigbank, 1, 0, "BIG1");
- AddExState(&bigbank2, 1, 0, "BIG2");
-}
+/* FCE Ultra - NES/Famicom Emulator\r
+ *\r
+ * Copyright notice for this file:\r
+ *  Copyright (C) 2005 CaH4e3\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ */\r
+\r
+#include "mapinc.h"\r
+#include "mmc3.h"\r
+\r
+static uint8 *CHRRAM = NULL;\r
+static uint8 resetmode;\r
+static int masko8[8]={63,31,15,1,3,0,0,0};\r
+\r
+static void Super24PW(uint32 A, uint8 V)\r
+{\r
+ uint32 NV=V&masko8[EXPREGS[0]&7];\r
+ NV|=(EXPREGS[1]<<1);\r
+ setprg8r((NV>>6)&0xF,A,NV);\r
+}\r
+\r
+static void Super24CW(uint32 A, uint8 V)\r
+{\r
+ if(EXPREGS[0]&0x20)\r
+  setchr1r(0x10,A,V);\r
+ else\r
+ {\r
+  uint32 NV=V|(EXPREGS[2]<<3);\r
+  setchr1r((NV>>9)&0xF,A,NV);\r
+ }\r
+}\r
+\r
+static DECLFW(Super24Write)\r
+{\r
+ switch(A)\r
+ {\r
+  case 0x5FF0: EXPREGS[0]=V;\r
+               FixMMC3PRG(MMC3_cmd);\r
+               FixMMC3CHR(MMC3_cmd);\r
+               break;\r
+  case 0x5FF1: EXPREGS[1]=V;\r
+               FixMMC3PRG(MMC3_cmd);\r
+               break;\r
+  case 0x5FF2: EXPREGS[2]=V;\r
+               FixMMC3CHR(MMC3_cmd);\r
+               break;\r
+ }\r
+}\r
+\r
+static DECLFW(Super24IRQ)\r
+{\r
+  switch(A&0xE001)\r
+  {\r
+    case 0xc000: IRQLatch=V;\r
+                 if(resetmode==1)\r
+                   IRQCount=IRQLatch;\r
+                 break;\r
+    case 0xc001: resetmode=1;\r
+                 IRQCount=IRQLatch;\r
+                 break;\r
+    case 0xE000: IRQa=0;\r
+                 X6502_IRQEnd(FCEU_IQEXT);\r
+                 if(resetmode==1)\r
+                   IRQCount=IRQLatch;\r
+                 break;\r
+    case 0xE001: IRQa=1;\r
+                 if(resetmode==1)\r
+                   IRQCount=IRQLatch;\r
+                 break;\r
+  }\r
+}\r
+\r
+static void Super24HB(void)\r
+{\r
+  resetmode=0;\r
+  if(IRQCount!=0)\r
+  {\r
+    IRQCount--;\r
+    if(IRQCount==0)\r
+    {\r
+      if(IRQa)\r
+      {\r
+        resetmode=1;\r
+        X6502_IRQBegin(FCEU_IQEXT);\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+static void Super24Power(void)\r
+{\r
+ EXPREGS[0]=0x24;\r
+ EXPREGS[1]=159;\r
+ EXPREGS[2]=0;\r
+ GenMMC3Power();\r
+ SetWriteHandler(0x5000,0x7FFF,Super24Write);\r
+ SetWriteHandler(0xC000,0xFFFF,Super24IRQ);\r
+ SetReadHandler(0x8000,0xFFFF,CartBR);\r
+}\r
+\r
+static void Super24Reset(void)\r
+{\r
+ EXPREGS[0]=0x24;\r
+ EXPREGS[1]=159;\r
+ EXPREGS[2]=0;\r
+ MMC3RegReset();\r
+}\r
+\r
+static void Super24Close(void)\r
+{\r
+ if(CHRRAM)\r
+  FCEU_gfree(CHRRAM);\r
+ CHRRAM = NULL;\r
+}\r
+\r
+void Super24_Init(CartInfo *info)\r
+{\r
+ info->Power=Super24Power;\r
+ info->Reset=Super24Reset;\r
+ info->Close=Super24Close;\r
+ cwrap=Super24CW;\r
+ pwrap=Super24PW;\r
+  CHRRAM=(uint8*)FCEU_gmalloc(8192);\r
+ SetupCartCHRMapping(0x10, CHRRAM, 8192, 1);\r
+ GameHBIRQHook=Super24HB;\r
+ AddExState(CHRRAM, 8192, 0, "CHRR");\r
+ AddExState(EXPREGS, 3, 0, "BIG2");\r
+}\r