more 0.98.15-like timing, but sound glitches
[fceu.git] / state.c
diff --git a/state.c b/state.c
index 058b30c..106d5ed 100644 (file)
--- a/state.c
+++ b/state.c
@@ -24,6 +24,9 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#ifdef GP2X
+#include <unistd.h>
+#endif
 
 #include "types.h"
 #include "x6502.h"
@@ -120,7 +123,7 @@ int WriteStateChunk(FILE *st, int type, SFORMAT *sf, int count)
  int x;
 
  fputc(type,st);
+
  for(x=bsize=0;x<count;x++)
   bsize+=sf[x].s&(~RLSB);
  bsize+=count<<3;
@@ -195,7 +198,7 @@ int ReadStateChunk(FILE *st, SFORMAT *sf, int count, int size)
      if(sf[x].s&RLSB)
      {
       int z;
-       for(z=(sf[x].s&(~RLSB))-1;z>=0;z--)       
+       for(z=(sf[x].s&(~RLSB))-1;z>=0;z--)
         *(uint8*)sf[x].v=fgetc(st);
      }
      else
@@ -255,7 +258,11 @@ for(;;)
   if(!read32(&size,st)) break;
   switch(t)
   {
-   case 1:if(!ReadStateChunk(st,SFCPU,SFCPUELEMENTS,size)) ret=0;break;
+   case 1:if(!ReadStateChunk(st,SFCPU,SFCPUELEMENTS,size)) ret=0;
+#ifdef ASM_6502
+          asmcpu_unpack();
+#endif
+         break;
    case 2:if(!ReadStateChunk(st,SFCPUC,SFCPUCELEMENTS,size)) ret=0;
           else
          {
@@ -299,17 +306,23 @@ void SaveState(void)
          header[3]=VERSION_NUMERIC;
          fwrite(header,1,16,st);
 
+#ifdef ASM_6502
+          asmcpu_pack();
+#endif
          totalsize=WriteStateChunk(st,1,SFCPU,SFCPUELEMENTS);
          totalsize+=WriteStateChunk(st,2,SFCPUC,SFCPUCELEMENTS);
          totalsize+=WriteStateChunk(st,3,SFPPU,SFPPUELEMENTS);
        //  totalsize+=WriteStateChunk(st,4,SFCTLR,SFCTLRELEMENTS);
          totalsize+=WriteStateChunk(st,5,SFSND,SFSNDELEMENTS);
          totalsize+=WriteStateChunk(st,0x10,SFMDATA,SFEXINDEX);
-       
+
          fseek(st,4,SEEK_SET);
          write32(totalsize,st);
          SaveStateStatus[CurrentState]=1;
          fclose(st);
+#ifdef GP2X
+         sync();
+#endif
          FCEU_DispMessage("State %d saved.",CurrentState);
         }
         else
@@ -317,19 +330,9 @@ void SaveState(void)
 }
 
 static int LoadStateOld(FILE *st);
-void LoadState(void)
+int FCEUSS_LoadFP(FILE *st, int make_backup)
 {
        int x;
-       FILE *st=NULL;
-
-        if(geniestage==1)
-        {
-         FCEU_DispMessage("Cannot load FCS in GG screen.");
-         return;
-        }
-
-       st=fopen(FCEU_MakeFName(FCEUMKF_STATE,CurrentState,0),"rb");
-
        if(st!=NULL)
        {
         uint8 header[16];
@@ -337,7 +340,7 @@ void LoadState(void)
          fread(&header,1,16,st);
          if(memcmp(header,"FCS",3))
          {
-          fseek(st,0,SEEK_SET);    
+          fseek(st,0,SEEK_SET);
           if(!LoadStateOld(st))
            goto lerror;
           goto okload;
@@ -368,9 +371,27 @@ void LoadState(void)
         lerror:
         FCEU_DispMessage("State %d load error.",CurrentState);
         SaveStateStatus[CurrentState]=0;
-        return;
+        return 0;
+       }
+       return 1;
+}
+
+void LoadState(void)
+{
+       FILE *st=NULL;
+
+        if(geniestage==1)
+        {
+         FCEU_DispMessage("Cannot load FCS in GG screen.");
+         return;
+        }
+
+       st=fopen(FCEU_MakeFName(FCEUMKF_STATE,CurrentState,0),"rb");
+       if (st)
+       {
+        FCEUSS_LoadFP(st, 0);
+        fclose(st);
        }
-       fclose(st);
 }
 
 char SaveStateStatus[10];
@@ -379,7 +400,7 @@ void CheckStates(void)
        FILE *st=NULL;
        int ssel;
 
-       if(SaveStateStatus[0]==-1)
+       if(SaveStateStatus[0]==(char)-1)
         for(ssel=0;ssel<10;ssel++)
         {
          st=fopen(FCEU_MakeFName(FCEUMKF_STATE,ssel,0),"rb");
@@ -484,7 +505,7 @@ static int LoadStateOld(FILE *st)
        int32 nada;
         uint8 version;
        nada=0;
-       
+
        StateBuffer=FCEU_malloc(59999);
        if(StateBuffer==NULL)
          return 0;
@@ -523,7 +544,7 @@ static int LoadStateOld(FILE *st)
        afread(&nada,1,1);
        afread(&nada,1,1);
        afread(&nada,1,1);
-       
+
        for(x=0;x<8;x++)
                areadupper8of16((int8 *)&CHRBankList[x]);
        afread(PRGBankList,4,1);
@@ -549,7 +570,7 @@ static int LoadStateOld(FILE *st)
        aread16((int8 *)&scanline);
        aread16((int8 *)&RefreshAddr);
        afread(&VRAMBuffer,1,1);
-       
+
        afread(&IRQa,1,1);
        aread32((int8 *)&IRQCount);
        aread32((int8 *)&IRQLatch);
@@ -577,16 +598,16 @@ static int LoadStateOld(FILE *st)
         {
          nada=0;
          afread(&nada,1,1);
-         PPUCHRRAM|=(nada?1:0)<<x;         
+         PPUCHRRAM|=(nada?1:0)<<x;
         }
-                       
+
          afread(mapbyte1,1,8);
          afread(mapbyte2,1,8);
          afread(mapbyte3,1,8);
          afread(mapbyte4,1,8);
          for(x=0;x<4;x++)
           aread16((int8 *)&nada);
-                
+
          PPUNTARAM=0;
          for(x=0;x<4;x++)
          {
@@ -598,7 +619,7 @@ static int LoadStateOld(FILE *st)
          afread(&vtoggle,1,1);
          aread16((int8 *)&TempAddrT);
          aread16((int8 *)&RefreshAddrT);
-                               
+
          if(GameStateRestore) GameStateRestore(version);
          free(StateBuffer);
         FixOldSaveStateSFreq();