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__

This commit is contained in:
teuf
2001-04-19 21:05:17 +00:00
parent 52f517873d
commit 3dce7e00d6
3 changed files with 134 additions and 51 deletions

View File

@@ -28,7 +28,11 @@ 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
%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

View File

@@ -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

View File

@@ -17,6 +17,11 @@
#include <stdio.h>
#ifdef __GZIP__
#include <zlib.h>
#endif
#ifdef __LINUX__
#include <sys/types.h>
#include <sys/stat.h>
@@ -37,7 +42,13 @@
#define STUB_FUNCTION fprintf(stderr,"STUB: %s at " __FILE__ ", line %d, thread %d\n",__FUNCTION__,__LINE__,getpid())
#endif
#include <errno.h>
#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,6 +108,11 @@ BYTE * ZFileDelFName;
DWORD ZFileSystemInit()
{
#ifdef __GZIP__
TextFile = 0;
#else
TextFile = 1;
#endif
CurrentHandle=0;
return(0);
}
@@ -105,7 +121,11 @@ DWORD ZOpenFile()
{
if(ZOpenMode==0)
{
if((FILEHANDLE[CurrentHandle]=fopen(ZOpenFileName,"rb"))!=NULL)
if (TextFile)
FILEHANDLE[CurrentHandle]=fopen(ZOpenFileName,"rb");
else
FILEHANDLE[CurrentHandle]=gzopen(ZOpenFileName,"rb");
if(FILEHANDLE[CurrentHandle]!=NULL)
{
CurrentHandle+=1;
return(CurrentHandle-1);
@@ -114,7 +134,11 @@ DWORD ZOpenFile()
}
if(ZOpenMode==1)
{
if((FILEHANDLE[CurrentHandle]=fopen(ZOpenFileName,"wb"))!=NULL)
if (TextFile)
FILEHANDLE[CurrentHandle]=fopen(ZOpenFileName,"wb");
else
FILEHANDLE[CurrentHandle]=gzopen(ZOpenFileName,"wb");
if(FILEHANDLE[CurrentHandle]!=NULL)
{
CurrentHandle+=1;
return(CurrentHandle-1);
@@ -123,7 +147,11 @@ DWORD ZOpenFile()
}
if(ZOpenMode==2)
{
if((FILEHANDLE[CurrentHandle]=fopen(ZOpenFileName,"r+b"))!=NULL)
if (TextFile)
FILEHANDLE[CurrentHandle]=fopen(ZOpenFileName,"r+b");
else
FILEHANDLE[CurrentHandle]=gzopen(ZOpenFileName,"r+b");
if(FILEHANDLE[CurrentHandle]!=NULL)
{
CurrentHandle+=1;
return(CurrentHandle-1);
@@ -135,41 +163,77 @@ DWORD ZOpenFile()
DWORD ZCloseFile()
{
if (TextFile)
fclose(FILEHANDLE[ZCloseFileHandle]);
else
gzclose(FILEHANDLE[ZCloseFileHandle]);
CurrentHandle-=1;
return(0);
}
DWORD ZFileSeek()
{
int res = 0;
int mode = 0;
if (ZFileSeekMode==0)
{
fseek(FILEHANDLE[ZFileSeekHandle],ZFileSeekPos,SEEK_SET);
return(0);
}
if(ZFileSeekMode==1)
{
fseek(FILEHANDLE[ZFileSeekHandle],ZFileSeekPos,SEEK_END);
return(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);
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()