From 9346ced34cc13e47382e01da7b4e3ddbb37b4c2f Mon Sep 17 00:00:00 2001 From: zeromus Date: Mon, 15 Feb 2016 19:13:10 +0000 Subject: [PATCH] commit patch #170 "load gzip/zip compressed files" --- desmume/src/NDSSystem.cpp | 45 ++++++++++++++++++++++----------------- desmume/src/NDSSystem.h | 6 ++++-- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/desmume/src/NDSSystem.cpp b/desmume/src/NDSSystem.cpp index 1ebc8f9e4..89d934e36 100644 --- a/desmume/src/NDSSystem.cpp +++ b/desmume/src/NDSSystem.cpp @@ -1,6 +1,6 @@ /* Copyright (C) 2006 yopyop - Copyright (C) 2008-2015 DeSmuME team + Copyright (C) 2008-2016 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,7 +16,6 @@ along with the this software. If not, see . */ -#include "NDSSystem.h" #include #include @@ -34,7 +33,7 @@ #include "armcpu.h" #include "render3D.h" #include "MMU.h" -#include "ROMReader.h" +#include "NDSSystem.h" #include "gfx3d.h" #include "GPU.h" #include "cp15.h" @@ -424,15 +423,16 @@ bool GameInfo::loadROM(std::string fname, u32 type) closeROM(); - fROM = fopen(fname.c_str(), "rb"); + char *noext = strdup(fname.c_str()); + reader = ROMReaderInit(&noext); free(noext); + fROM = reader->Init(fname.c_str()); if (!fROM) return false; headerOffset = (type == ROM_DSGBA)?DSGBA_LOADER_SIZE:0; - fseek(fROM, 0, SEEK_END); - romsize = ftell(fROM) - headerOffset; - fseek(fROM, headerOffset, SEEK_SET); + romsize = reader->Size(fROM) - headerOffset; + reader->Seek(fROM, headerOffset, SEEK_SET); - bool res = (fread(&header, 1, sizeof(header), fROM) == sizeof(header)); + bool res = (reader->Read(fROM, &header, sizeof(header)) == sizeof(header)); if (res) { @@ -523,16 +523,16 @@ bool GameInfo::loadROM(std::string fname, u32 type) if (type == ROM_NDS) { - fseek(fROM, 0x4000 + headerOffset, SEEK_SET); - fread(&secureArea[0], 1, 0x4000, fROM); + reader->Seek(fROM, 0x4000 + headerOffset, SEEK_SET); + reader->Read(fROM, &secureArea[0], 0x4000); } if (CommonSettings.loadToMemory) { - fseek(fROM, headerOffset, SEEK_SET); + reader->Seek(fROM, headerOffset, SEEK_SET); romdata = new u8[romsize + 4]; - if (fread(romdata, 1, romsize, fROM) != romsize) + if (reader->Read(fROM, romdata, romsize) != romsize) { delete [] romdata; romdata = NULL; romsize = 0; @@ -554,14 +554,14 @@ bool GameInfo::loadROM(std::string fname, u32 type) } _isDSiEnhanced = (LE_TO_LOCAL_32(*(u32*)(romdata + 0x180) == 0x8D898581U) && LE_TO_LOCAL_32(*(u32*)(romdata + 0x184) == 0x8C888480U)); - fclose(fROM); fROM = NULL; + reader->DeInit(fROM); fROM = NULL; return true; } _isDSiEnhanced = ((readROM(0x180) == 0x8D898581U) && (readROM(0x184) == 0x8C888480U)); if (hasRomBanner()) { - fseek(fROM, header.IconOff + headerOffset, SEEK_SET); - fread(&banner, 1, sizeof(RomBanner), fROM); + reader->Seek(fROM, header.IconOff + headerOffset, SEEK_SET); + reader->Read(fROM, &banner, sizeof(RomBanner)); banner.version = LE_TO_LOCAL_16(banner.version); banner.crc16 = LE_TO_LOCAL_16(banner.crc16); @@ -571,20 +571,20 @@ bool GameInfo::loadROM(std::string fname, u32 type) banner.palette[i] = LE_TO_LOCAL_16(banner.palette[i]); } } - fseek(fROM, headerOffset, SEEK_SET); + reader->Seek(fROM, headerOffset, SEEK_SET); lastReadPos = 0; return true; } romsize = 0; - fclose(fROM); fROM = NULL; + reader->DeInit(fROM); fROM = NULL; return false; } void GameInfo::closeROM() { if (fROM) - fclose(fROM); + reader->DeInit(fROM); if (romdata) delete [] romdata; @@ -602,8 +602,8 @@ u32 GameInfo::readROM(u32 pos) if (!romdata) { if (lastReadPos != pos) - fseek(fROM, pos + headerOffset, SEEK_SET); - num = fread(&data, 1, 4, fROM); + reader->Seek(fROM, pos + headerOffset, SEEK_SET); + num = reader->Read(fROM, &data, 4); lastReadPos = (pos + num); } else @@ -658,6 +658,11 @@ static int rom_init_path(const char *filename, const char *physicalName, const c path.init(logicalFilename? logicalFilename : filename); + if (!strcasecmp(path.extension().c_str(),"zip") + || !strcasecmp(path.extension().c_str(),"gz")) { + type = ROM_NDS; + gameInfo.loadROM(path.path, type); + } else if ( path.isdsgba(path.path)) { type = ROM_DSGBA; gameInfo.loadROM(path.path, type); diff --git a/desmume/src/NDSSystem.h b/desmume/src/NDSSystem.h index 63ddd55af..53232c971 100644 --- a/desmume/src/NDSSystem.h +++ b/desmume/src/NDSSystem.h @@ -1,6 +1,6 @@ /* Copyright (C) 2006 yopyop - Copyright (C) 2008-2015 DeSmuME team + Copyright (C) 2008-2016 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,6 +23,7 @@ #include #include "types.h" +#include "ROMReader.h" class BaseDriver; class CFIRMWARE; @@ -312,7 +313,8 @@ struct RomBanner struct GameInfo { - FILE *fROM; + void *fROM; + ROMReader_struct *reader; u8 *romdata; u32 romsize; u32 cardSize;