random warning fixes
[fceu.git] / cart.c
diff --git a/cart.c b/cart.c
index ff9aceb..909506a 100644 (file)
--- a/cart.c
+++ b/cart.c
 #include <stdlib.h>
 #include <stdio.h>
 
+#ifdef GP2X
+#include <unistd.h> // for sync()
+#endif
+
 #include "types.h"
 #include "fce.h"
 #include "ppu.h"
+#include "ppu098.h"
 
 #include "cart.h"
 #include "memory.h"
@@ -35,8 +40,6 @@
 #include "svga.h"
 #include "file.h"
 
-#define FCEUPPU_LineUpdate(...)
-
 /*
    This file contains all code for coordinating the mapping in of the
    address space external to the NES.
@@ -167,6 +170,7 @@ void FASTAPASS(3) setprg2r(int r, unsigned int A, unsigned int V)
 {
   V&=PRGmask2[r];
   setpageptr(2,A,PRGptr[r]?(&PRGptr[r][V<<11]):0,PRGram[r]);
+  X6502_Rebase();
 }
 
 void FASTAPASS(2) setprg2(uint32 A, uint32 V)
@@ -178,6 +182,7 @@ void FASTAPASS(3) setprg4r(int r, unsigned int A, unsigned int V)
 {
   V&=PRGmask4[r];
   setpageptr(4,A,PRGptr[r]?(&PRGptr[r][V<<12]):0,PRGram[r]);
+  X6502_Rebase();
 }
 
 void FASTAPASS(2) setprg4(uint32 A, uint32 V)
@@ -199,6 +204,7 @@ void FASTAPASS(3) setprg8r(int r, unsigned int A, unsigned int V)
    for(x=0;x<4;x++)
     setpageptr(2,A+(x<<11),PRGptr[r]?(&PRGptr[r][((VA+x)&PRGmask2[r])<<11]):0,PRGram[r]);
   }
+  X6502_Rebase();
 }
 
 void FASTAPASS(2) setprg8(uint32 A, uint32 V)
@@ -221,6 +227,7 @@ void FASTAPASS(3) setprg16r(int r, unsigned int A, unsigned int V)
    for(x=0;x<8;x++)
     setpageptr(2,A+(x<<11),PRGptr[r]?(&PRGptr[r][((VA+x)&PRGmask2[r])<<11]):0,PRGram[r]);
   }
+  X6502_Rebase();
 }
 
 void FASTAPASS(2) setprg16(uint32 A, uint32 V)
@@ -243,6 +250,7 @@ void FASTAPASS(3) setprg32r(int r,unsigned int A, unsigned int V)
    for(x=0;x<16;x++)
     setpageptr(2,A+(x<<11),PRGptr[r]?(&PRGptr[r][((VA+x)&PRGmask2[r])<<11]):0,PRGram[r]);
   }
+  X6502_Rebase();
 }
 
 void FASTAPASS(2) setprg32(uint32 A, uint32 V)
@@ -299,7 +307,7 @@ void FASTAPASS(2) setchr8r(int r, unsigned int V)
   if(CHRram[r])
    PPUCHRRAM|=(255);
   else
-   PPUCHRRAM&=~(255);
+   PPUCHRRAM&=0;
 }
 
 void FASTAPASS(2) setchr1(unsigned int A, unsigned int V)
@@ -637,6 +645,24 @@ void GeniePower(void)
   geniestage=2;
 }
 
+static uint8 *real_pages[16];
+
+void GenieSetPages(int restore)
+{
+ int page;
+ if (restore)
+ {
+  for (page=16; page<32; page++)
+   Page[page] = real_pages[page-16];
+ }
+ else
+ {
+  for (page=16; page<32; page++) {
+   real_pages[page-16] = Page[page];
+   Page[page]=GENIEROM - (page<<11) + ((page&1)<<11);
+  }
+ }
+}
 
 void FCEU_SaveGameSave(CartInfo *LocalHWInfo)
 {
@@ -660,6 +686,10 @@ void FCEU_SaveGameSave(CartInfo *LocalHWInfo)
      fwrite(LocalHWInfo->SaveGame[x],1,
       LocalHWInfo->SaveGameLen[x],sp);
     }
+   fclose(sp);
+#ifdef GP2X
+   sync();
+#endif
   }
   free(soot);
  }
@@ -683,9 +713,28 @@ void FCEU_LoadGameSave(CartInfo *LocalHWInfo)
    for(x=0;x<4;x++)
     if(LocalHWInfo->SaveGame[x])
      fread(LocalHWInfo->SaveGame[x],1,LocalHWInfo->SaveGameLen[x],sp);
+   fclose(sp);
   }
   free(soot);
  }
 }
 
+void DumpEmptyCartMapping(void)
+{
+ int x, st=0, end=-1;
+
+ for(x=8;x<32;x++)
+ {
+  if (Page[x] == (nothing-x*2048) || Page[x] == 0)
+  {
+   if (end != x) st=x;
+   end=x+1;
+  }
+  if (end == x)
+   printf("DumpEmptyCartMapping: %04x-%04x\n", st*2048, end*2048-1);
+ }
+ if (end==32)
+  printf("DumpEmptyCartMapping: %04x-%04x\n", st*2048, end*2048-1);
+}
+