#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#ifdef GP2X
+#include <unistd.h>
+#endif
#include "types.h"
#include "x6502.h"
#include "general.h"
#include "state.h"
#include "memory.h"
+#include "ppu.h"
static SFORMAT SFMDATA[64];
static int SFEXINDEX;
int x;
fputc(type,st);
-
+
for(x=bsize=0;x<count;x++)
bsize+=sf[x].s&(~RLSB);
bsize+=count<<3;
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
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
{
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
}
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];
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;
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];
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");
int32 nada;
uint8 version;
nada=0;
-
+
StateBuffer=FCEU_malloc(59999);
if(StateBuffer==NULL)
return 0;
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);
aread16((int8 *)&scanline);
aread16((int8 *)&RefreshAddr);
afread(&VRAMBuffer,1,1);
-
+
afread(&IRQa,1,1);
aread32((int8 *)&IRQCount);
aread32((int8 *)&IRQLatch);
{
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++)
{
afread(&vtoggle,1,1);
aread16((int8 *)&TempAddrT);
aread16((int8 *)&RefreshAddrT);
-
+
if(GameStateRestore) GameStateRestore(version);
free(StateBuffer);
FixOldSaveStateSFreq();