From 3dce7e00d63765aa886747eaf348dcb7a0699900 Mon Sep 17 00:00:00 2001 From: teuf <> Date: Thu, 19 Apr 2001 21:05:17 +0000 Subject: [PATCH] Added support for gzipped roms. save states and srm files are also automatically compressed. For the moment, this is only available in the linux version, and you must enable it by defining __GZIP__ --- zsnes/src/cfgload.asm | 14 +++- zsnes/src/gui/guiload.inc | 9 +++ zsnes/src/linux/zfilew.c | 162 ++++++++++++++++++++++++++------------ 3 files changed, 134 insertions(+), 51 deletions(-) diff --git a/zsnes/src/cfgload.asm b/zsnes/src/cfgload.asm index b4d348fb..e8775e17 100644 --- a/zsnes/src/cfgload.asm +++ b/zsnes/src/cfgload.asm @@ -27,8 +27,12 @@ EXTSYM StereoSound,antienab,cvidmode,enterpress,frameskip,guioff EXTSYM newengen,per2exec,pl1Ak,pl1Bk,pl1Lk,pl1Rk,pl1Xk,pl1Yk EXTSYM pl1contrl,pl1downk,pl1leftk,pl1rightk,scanlines,soundon EXTSYM spcon,vsyncon,Open_File,Read_File - EXTSYM Create_File,Write_File,Close_File - +EXTSYM Create_File,Write_File,Close_File +%ifdef __LINUX__ +; if TextFile==0, zlib functions aren't used +; useful to save the config file +EXTSYM TextFile +%endif NEWSYM CfgLoadAsmStart @@ -272,6 +276,9 @@ NEWSYM DOScreatenewcfg push ecx ; Save .CFG file mov edx,CMDLineStr +%ifdef _GZIP__ + mov byte[TextFile], 1 +%endif call Create_File pop ecx jc .failed @@ -280,6 +287,9 @@ NEWSYM DOScreatenewcfg mov edx,mode7tab call Write_File call Close_File +%ifdef __GZIP__ + mov byte[TextFile], 0 +%endif .failed ret diff --git a/zsnes/src/gui/guiload.inc b/zsnes/src/gui/guiload.inc index 15be3a09..a8c97e01 100644 --- a/zsnes/src/gui/guiload.inc +++ b/zsnes/src/gui/guiload.inc @@ -566,6 +566,9 @@ GetNormalEntries2: GUIGetEntry2 GUIsfcfind GUIGetEntry2 GUIswcfind GUIGetEntry2 GUIfigfind +%ifdef __GZIP__ + GUIGetEntry2 GUIfindGZIP +%endif GUIGetEntry2 GUIfind058 GUIGetEntry2 GUIfind078 GUIGetEntry2 GUIfindUSA @@ -589,6 +592,9 @@ GetNormalEntries: GUIGetEntry GUIsfcfind GUIGetEntry GUIswcfind GUIGetEntry GUIfigfind +%ifdef __GZIP__ + GUIGetEntry GUIfindGZIP +%endif GUIGetEntry GUIfind058 GUIGetEntry GUIfind078 GUIGetEntry GUIfindUSA @@ -750,6 +756,9 @@ GetLoadLfn: GUIGetEntryLFN GUIsfcfind GUIGetEntryLFN GUIswcfind GUIGetEntryLFN GUIfigfind +%ifdef __GZIP__ + GUIGetEntryLFN GUIfindGZIP +%endif GUIGetEntryLFN GUIfind058 GUIGetEntryLFN GUIfind078 GUIGetEntryLFN GUIfindUSA diff --git a/zsnes/src/linux/zfilew.c b/zsnes/src/linux/zfilew.c index ebbeb520..0ac743b0 100644 --- a/zsnes/src/linux/zfilew.c +++ b/zsnes/src/linux/zfilew.c @@ -17,6 +17,11 @@ #include + +#ifdef __GZIP__ +#include +#endif + #ifdef __LINUX__ #include #include @@ -37,7 +42,13 @@ #define STUB_FUNCTION fprintf(stderr,"STUB: %s at " __FILE__ ", line %d, thread %d\n",__FUNCTION__,__LINE__,getpid()) #endif #include + +#ifdef __GZIP__ +gzFile *FILEHANDLE[16]; +#else FILE *FILEHANDLE[16]; +#endif + DWORD CurrentHandle=0; @@ -86,7 +97,7 @@ DWORD ZFTime; BYTE * MKPath; BYTE * CHPath; BYTE * RMPath; - +BYTE TextFile; // GetDir BYTE * DirName; DWORD DriveNumber; @@ -97,79 +108,132 @@ BYTE * ZFileDelFName; DWORD ZFileSystemInit() { - CurrentHandle=0; - return(0); +#ifdef __GZIP__ + TextFile = 0; +#else + TextFile = 1; +#endif + CurrentHandle=0; + return(0); } DWORD ZOpenFile() { - if(ZOpenMode==0) - { - if((FILEHANDLE[CurrentHandle]=fopen(ZOpenFileName,"rb"))!=NULL) - { - CurrentHandle+=1; - return(CurrentHandle-1); - } - return(0xFFFFFFFF); - } - if(ZOpenMode==1) - { - if((FILEHANDLE[CurrentHandle]=fopen(ZOpenFileName,"wb"))!=NULL) - { - CurrentHandle+=1; - return(CurrentHandle-1); - } - return(0xFFFFFFFF); - } - if(ZOpenMode==2) - { - if((FILEHANDLE[CurrentHandle]=fopen(ZOpenFileName,"r+b"))!=NULL) - { - CurrentHandle+=1; - return(CurrentHandle-1); - } - return(0xFFFFFFFF); - } - return(0xFFFFFFFF); + if(ZOpenMode==0) + { + if (TextFile) + FILEHANDLE[CurrentHandle]=fopen(ZOpenFileName,"rb"); + else + FILEHANDLE[CurrentHandle]=gzopen(ZOpenFileName,"rb"); + if(FILEHANDLE[CurrentHandle]!=NULL) + { + CurrentHandle+=1; + return(CurrentHandle-1); + } + return(0xFFFFFFFF); + } + if(ZOpenMode==1) + { + if (TextFile) + FILEHANDLE[CurrentHandle]=fopen(ZOpenFileName,"wb"); + else + FILEHANDLE[CurrentHandle]=gzopen(ZOpenFileName,"wb"); + if(FILEHANDLE[CurrentHandle]!=NULL) + { + CurrentHandle+=1; + return(CurrentHandle-1); + } + return(0xFFFFFFFF); + } + if(ZOpenMode==2) + { + if (TextFile) + FILEHANDLE[CurrentHandle]=fopen(ZOpenFileName,"r+b"); + else + FILEHANDLE[CurrentHandle]=gzopen(ZOpenFileName,"r+b"); + if(FILEHANDLE[CurrentHandle]!=NULL) + { + CurrentHandle+=1; + return(CurrentHandle-1); + } + return(0xFFFFFFFF); + } + return(0xFFFFFFFF); } DWORD ZCloseFile() { - fclose(FILEHANDLE[ZCloseFileHandle]); - CurrentHandle-=1; - return(0); + if (TextFile) + fclose(FILEHANDLE[ZCloseFileHandle]); + else + gzclose(FILEHANDLE[ZCloseFileHandle]); + CurrentHandle-=1; + return(0); } DWORD ZFileSeek() { - if(ZFileSeekMode==0) - { - fseek(FILEHANDLE[ZFileSeekHandle],ZFileSeekPos,SEEK_SET); - return(0); - } - if(ZFileSeekMode==1) - { - fseek(FILEHANDLE[ZFileSeekHandle],ZFileSeekPos,SEEK_END); - return(0); - } - return(0xFFFFFFFF); + int res = 0; + int mode = 0; + if (ZFileSeekMode==0) + mode = SEEK_SET; + else if (ZFileSeekMode==1) { + mode = SEEK_END; + if (TextFile==0) + printf("Warning : gzseek(SEEK_END) not supported"); + } else return (0xFFFFFFFF); + + if (TextFile) { + fseek(FILEHANDLE[ZFileSeekHandle], ZFileSeekPos, mode); + return 0; + } else { + gzseek(FILEHANDLE[ZFileSeekHandle], ZFileSeekPos, mode); + return 0; + } + return(0xFFFFFFFF); } DWORD ZFileRead() { - return(fread(ZFileReadBlock,1,ZFileReadSize,FILEHANDLE[ZFileReadHandle])); + if (TextFile) + return(fread(ZFileReadBlock, + 1, + ZFileReadSize, + FILEHANDLE[ZFileReadHandle])); + else + return(gzread(FILEHANDLE[ZFileReadHandle], + ZFileReadBlock, + ZFileReadSize)); } DWORD ZFileWrite() { - if((fwrite(ZFileWriteBlock,1,ZFileWriteSize,FILEHANDLE[ZFileWriteHandle]))!=ZFileWriteSize) return(0xFFFFFFFF); - return(0); + int res=0; + if (TextFile) + res = fwrite(ZFileWriteBlock, + 1, + ZFileWriteSize, + FILEHANDLE[ZFileWriteHandle]); + else + res = gzwrite(FILEHANDLE[ZFileWriteHandle], + ZFileWriteBlock, + ZFileWriteSize); + + if (res!=ZFileWriteSize) + return(0xFFFFFFFF); + + return(0); } DWORD ZFileTell() { - return(ftell(FILEHANDLE[ZFileTellHandle])); + int res = 0; + if (TextFile) { + res = gztell(FILEHANDLE[ZFileTellHandle]); + if (res == -1) fprintf(stderr, "Oups!! gzTell\n"); + return(res); + } else return gztell(FILEHANDLE[ZFileTellHandle]); } DWORD ZFileDelete()