merge mapper code from FCEUX
[fceu.git] / mappers / 227.c
index 457e79e..8b5cff9 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
- * 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"
 
+//zero 14-apr-2012 - redid this entirely to match bizhawk
+
 #define rg mapbyte1
 
 static void DoSync(uint32 A)
 {
- int32 p=((A>>3)&0xF) | ((A>>4)&0x10);
+       int S = A & 1;
+       int M_horz = (A>>1)&1;
+       int p = (A >> 2) & 0x1F;
+       p += (A&0x100) ? 0x20 : 0;
+       bool o = (A>>7)&1;
+       bool L = (A>>9)&1;
+
+       if (o && !S )   
+       {
+               ROM_BANK16(0x8000,p);
+               ROM_BANK16(0xC000,p);
+       }
+       if (o && S )
+       {
+               ROM_BANK16(0x8000,p);
+               ROM_BANK16(0xC000,p+1);
+       }
+       if (!o && !S && !L )
+       {
+               ROM_BANK16(0x8000,p);
+               ROM_BANK16(0xC000,p&0x38);
+       }
+       if (!o && S && !L )
+       {
+               ROM_BANK16(0x8000,p&0x3E);
+               ROM_BANK16(0xC000,p&0x38);
+       }
+       if (!o && !S && L)
+       {
+               ROM_BANK16(0x8000,p);
+               ROM_BANK16(0xC000,p|7);
+       }
+       if (!o && S && L )
+       {
+               ROM_BANK16(0x8000,p&0x3E);
+               ROM_BANK16(0xC000,p|7);
+       }
 
  rg[0]=A;
  rg[1]=A>>8;
 
  MIRROR_SET((A>>1)&1);
- if(A&1)        //32 KB
- {
-  ROM_BANK32(p);
- }
- else                //16 KB
- {
-  ROM_BANK16(0x8000,(p<<1)|((A&4)>>2));
-  ROM_BANK16(0xc000,(p<<1)|((A&4)>>2));
- }
- if(A&0x80)
- {
-  PPUCHRRAM=0;
- }
- else
- {
-  PPUCHRRAM=0xFF;
-  if(A&0x200)
-   ROM_BANK16(0xC000,(p<<1)|7);
-  else
-   ROM_BANK16(0xC000,(p<<1)&(~7));
- }
 }
 
 static DECLFW(Mapper227_write)
 {
- rg[A&1]=V;
  DoSync(A);
 }
 
 static void M227Reset(void)
 {
- rg[0]=rg[1]=0;
  DoSync(0);
 }
 
@@ -72,7 +87,7 @@ static void M227Restore(int version)
 
 void Mapper227_init(void)
 {
-  SetWriteHandler(0x6000,0xffff,Mapper227_write);
+  SetWriteHandler(0x8000,0xffff,Mapper227_write);
   MapperReset=M227Reset;
   GameStateRestore=M227Restore;
   M227Reset();