From 9986261b35cef809d3bd63b3f3a860a0912748f7 Mon Sep 17 00:00:00 2001 From: n-a-c-h <> Date: Sun, 11 Jan 2004 12:56:42 +0000 Subject: [PATCH] BIOS/Base carts now use paths. --- zsnes/src/init.asm | 17 +++++++++++++ zsnes/src/initc.c | 62 ++++++++++++++++++++++++++++++++-------------- 2 files changed, 60 insertions(+), 19 deletions(-) diff --git a/zsnes/src/init.asm b/zsnes/src/init.asm index f9735493..04003fab 100644 --- a/zsnes/src/init.asm +++ b/zsnes/src/init.asm @@ -126,6 +126,7 @@ EXTSYM SplittedROM EXTSYM addOnStart EXTSYM addOnSize +EXTSYM STPath, ST_Path, GNextPath, GNext_Path, SGPath, SG_Path EXTSYM SetaCmdEnable,setaramdata EXTSYM setaaccessbankr8,setaaccessbankw8,setaaccessbankr8a,setaaccessbankw8a @@ -3407,6 +3408,22 @@ NEWSYM loadfileGUI mov edx,fname+1 mov dword[ZOpenFileName],edx + + ;This is to get the C stuff to see these variables + xor ecx,ecx +.pathcopy + mov edx,dword[STPath+ecx] + mov dword[ST_Path+ecx],edx + mov edx,dword[GNextPath+ecx] + mov dword[GNext_Path+ecx],edx + mov edx,dword[SGPath+ecx] + mov dword[SG_Path+ecx],edx + add ecx,4 + cmp ecx,1024 + je .donepathcopy + jmp .pathcopy + +.donepathcopy pushad call loadROM popad diff --git a/zsnes/src/initc.c b/zsnes/src/initc.c index acde8354..55344957 100755 --- a/zsnes/src/initc.c +++ b/zsnes/src/initc.c @@ -381,15 +381,15 @@ void MirrorROM() extern char *ZOpenFileName; bool Header512; -void loadFile() +void loadFile(char *filename) { bool multifile = false; char *incrementer = 0; unsigned char *ROM = (unsigned char *)romdata; - if (strlen(ZOpenFileName) >= 3) //Char + ".1" + if (strlen(filename) >= 3) //Char + ".1" { - char *ext = ZOpenFileName+strlen(ZOpenFileName)-2; + char *ext = filename+strlen(filename)-2; if (!strcmp(ext, ".1") || !strcasecmp(ext, ".A")) { incrementer = ext + 1; @@ -400,12 +400,12 @@ void loadFile() for (;;) { struct stat stat_results; - stat(ZOpenFileName, &stat_results); + stat(filename, &stat_results); if ((unsigned int)stat_results.st_size <= maxromspace+512-curromspace) { FILE *fp = 0; - fp = fopen(ZOpenFileName, "rb"); + fp = fopen(filename, "rb"); if (!fp) { return; } @@ -431,12 +431,12 @@ void loadFile() } } -void loadGZipFile() +void loadGZipFile(char *filename) { int size, err; gzFile GZipFile; FILE *fp = 0; - fp = fopen(ZOpenFileName, "rb"); + fp = fopen(filename, "rb"); if (!fp) { return; } fseek(fp, -4, SEEK_END); //Size is read like this due to VC screwing up with optimizations @@ -449,7 +449,7 @@ void loadGZipFile() if ((unsigned int)size > maxromspace+512) { return; } //Open GZip file for decompression - GZipFile = gzopen(ZOpenFileName, "rb"); + GZipFile = gzopen(filename, "rb"); //Decompress file into memory err = gzread(GZipFile, romdata, size); @@ -468,14 +468,14 @@ void loadGZipFile() // "call _Output_Text \n"); //system("pause"); -void loadZipFile() +void loadZipFile(char *filename) { int err, fileSize; unsigned char *ROM = (unsigned char *)romdata; bool multifile = false, NSS = false; char *incrementer = 0; - unzFile zipfile = unzOpen(ZOpenFileName); //Open zip file + unzFile zipfile = unzOpen(filename); //Open zip file int cFile = unzGoToFirstFile(zipfile); //Set cFile to first compressed file unz_file_info cFileInfo; //Create variable to hold info for a compressed file @@ -609,15 +609,36 @@ void loadZipFile() } } -void SplitSetup(const char *basefile, unsigned int MirrorSystem) +void SplitSetup(char *basepath, char *basefile, unsigned int MirrorSystem) { unsigned char *ROM = (unsigned char *)romdata; curromspace = 0; if (maxromspace < addOnStart+addOnSize) { return; } memcpy(ROM+addOnStart, ROM, addOnSize); - strcpy(ZOpenFileName, basefile); - loadZipFile(); + + if (*basepath == 0) + { + loadZipFile(basefile); + } + else + { + unsigned int pathlen = strlen(basepath); + char *ext = basepath+pathlen-4; + if (pathlen >= 5 && !strcasecmp(ext, ".zip")) + { + loadZipFile(basepath); + } + else if (pathlen >= 4 && !strcasecmp(ext+1, ".gz")) + { + loadGZipFile(basepath); + } + else + { + loadFile(basepath); + } + } + if ((curromspace & 0x7FFF) == 512) { memmove(ROM, ROM+512, addOnStart); @@ -647,6 +668,9 @@ void SplitSetup(const char *basefile, unsigned int MirrorSystem) SplittedROM = true; } +char ST_Path[1024]; +char GNext_Path[1024]; +char SG_Path[1024]; void SplitSupport() { unsigned char *ROM = (unsigned char *)romdata; @@ -658,7 +682,7 @@ void SplitSupport() { addOnStart = 0x200000; addOnSize = 0x80000; - SplitSetup("SAMEGAME.ZIP", 1); + SplitSetup(SG_Path, "SAMEGAME.ZIP", 1); } //SD Gundam G-Next add on @@ -667,7 +691,7 @@ void SplitSupport() { addOnStart = 0x400000; addOnSize = 0x80000; - SplitSetup("G-NEXT.ZIP", 2); + SplitSetup(GNext_Path, "G-NEXT.ZIP", 2); addOnStart = 0x200000; } @@ -676,7 +700,7 @@ void SplitSupport() { addOnStart = 0x100000; addOnSize = curromspace; - SplitSetup("STBIOS.ZIP", 3); + SplitSetup(ST_Path, "STBIOS.ZIP", 3); } } @@ -700,7 +724,7 @@ void loadROM() { isCompressed = true; isZip = true; - loadZipFile(); + loadZipFile(ZOpenFileName); } } @@ -710,11 +734,11 @@ void loadROM() if (!strcasecmp(ext, ".gz")) { isCompressed = true; - loadGZipFile(); + loadGZipFile(ZOpenFileName); } } - if (!isCompressed) { loadFile(); } + if (!isCompressed) { loadFile(ZOpenFileName); } Header512 = false;