X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=fceu.git;a=blobdiff_plain;f=state.c;h=106d5edb4e972b1a4ae16d6d1187c5255941e5f1;hp=ac4881875a6185e96fd0aa5ba80bcd50846ec98c;hb=4fdfab079f3f006ae215ab453072a25588aa951d;hpb=c62d28102c77e19c291c78bf6bf7f0a81abd54b9 diff --git a/state.c b/state.c index ac48818..106d5ed 100644 --- a/state.c +++ b/state.c @@ -24,6 +24,9 @@ #include #include #include +#ifdef GP2X +#include +#endif #include "types.h" #include "x6502.h" @@ -38,6 +41,7 @@ #include "general.h" #include "state.h" #include "memory.h" +#include "ppu.h" static SFORMAT SFMDATA[64]; static int SFEXINDEX; @@ -119,7 +123,7 @@ int WriteStateChunk(FILE *st, int type, SFORMAT *sf, int count) int x; fputc(type,st); - + for(x=bsize=0;x=0;z--) + for(z=(sf[x].s&(~RLSB))-1;z>=0;z--) *(uint8*)sf[x].v=fgetc(st); } else @@ -254,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 { @@ -298,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 @@ -316,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]; @@ -336,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; @@ -367,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]; @@ -378,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"); @@ -483,7 +505,7 @@ static int LoadStateOld(FILE *st) int32 nada; uint8 version; nada=0; - + StateBuffer=FCEU_malloc(59999); if(StateBuffer==NULL) return 0; @@ -522,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); @@ -548,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); @@ -576,16 +598,16 @@ static int LoadStateOld(FILE *st) { nada=0; afread(&nada,1,1); - PPUCHRRAM|=(nada?1:0)<