merge PCM code from FCEUX
[fceu.git] / mappers / 227.c
index a006ce3..e88649b 100644 (file)
@@ -1,7 +1,7 @@
 /* FCE Ultra - NES/Famicom Emulator
  *
  * Copyright notice for this file:
- *  Copyright (C) 2002 Ben Parnell
+ *  Copyright (C) 2002 Xodnizel
  *
  * 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
 
 static void DoSync(uint32 A)
 {
- int32 p=((A>>3)&0xF) | ((A>>4)&0x10);
+       uint32 S = A & 1;
+       uint32 p = (A >> 2) & 0x1F;
+       p += (A&0x100) ? 0x20 : 0;
+       uint32 o = (A>>7)&1;
+       uint32 L = (A>>9)&1;
 
- rg[0]=A;
- rg[1]=A>>8;
+       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);
+       }
 
- 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));
- }
+    rg[0]=A;
+    rg[1]=A>>8;
+
+    MIRROR_SET((A>>1)&1);
 }
 
 static DECLFW(Mapper227_write)
 {
- rg[A&1]=V;
- DoSync(A);
+    DoSync(A);
 }
 
 static void M227Reset(void)
 {
- rg[0]=rg[1]=0;
- DoSync(0);
+    DoSync(0);
 }
 
 static void M227Restore(int version)
 {
- DoSync(rg[0]|(rg[1]<<8));
   DoSync(rg[0]|(rg[1]<<8));
 }
 
 void Mapper227_init(void)
 {
-  SetWriteHandler(0x8000,0xffff,Mapper227_write);
-  MapperReset=M227Reset;
-  GameStateRestore=M227Restore;
-  M227Reset();
+    SetWriteHandler(0x8000,0xffff,Mapper227_write);
+    MapperReset=M227Reset;
+    GameStateRestore=M227Restore;
+    M227Reset();
 }