mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-06-28 01:49:42 -06:00
Polish up archive support (#930)
* Fix directory path when extracting from archive
* Don't create new dir in execution dir of melonds
* Create it beside the archive instead
Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
* ArchiveUtil : Use QT functions for I/O
* Make it more platform independent, cleaner
* Fixes permission related crash on linux
Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
* NDSCart : Abstract out common code in LoadROM()
Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
* Extract nds roms to memory
* Some stuff is still broken in the frontend
Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
* GBACart : Abstract out common code in LoadROM()
Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
* Extract gba roms to memory
Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
* Integrate archive support with recent files
Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
* onClickRecentFile : Pause emu thread conditionally
* Don't pause at start of the function
* If user opens an archive and hits cancel, it won't pause
Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
* Handle Resets when loading from archives
* Ask user to pick the rom(s) again (i.e. GBA & NDS)
when there are multiple files in the archive(s)
* Directly load if only 1 file
Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
* Archive support for drag-n-drop
* Also recent files support for drag-n-drop
Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
* main : Allocate rombuffer objects on stack
* Less messy, decreases chances of memory leaks
* Underlying implementation of qbytearray uses heap (hopefully?)
Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
* GetSavestateName : Archive support
* Construct ssname from srampath (since rompath has archive name)
NOTE: In general, archive name != rom file name !!!!!!!!!!
Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
* Add srl and dsi as "direct-load" formats
* Direct-load = anything not in an archive
Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
* Don't use static functions
Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
* Remove QT stuff from Util_ROM
* Also, during reset, directly load file from archive (no rom picker)
Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
* Remove QT includes from FrontendUtil.h
Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
* Util_ROM/LoadROM() : Use SetupDSiNAND()
Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
* Util_ROM/Reset() : Use strrchr()
Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
* Util_ROM : Put Archive stuff behind ifdefs
Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
* main: Set parent widget for archive dialog boxes
Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
* Revert "Util_ROM/Reset() : Use strrchr()"
This reverts commit c8af6f066f
.
This commit is contained in:
@ -885,46 +885,15 @@ void DecryptSecureArea(u8* out)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool LoadROM(const char* path, const char* sram, bool direct)
|
||||
bool LoadROMCommon(u32 filelength, const char *sram, bool direct)
|
||||
{
|
||||
// TODO: streaming mode? for really big ROMs or systems with limited RAM
|
||||
// for now we're lazy
|
||||
// also TODO: validate what we're loading!!
|
||||
|
||||
FILE* f = Platform::OpenFile(path, "rb");
|
||||
if (!f)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
NDS::Reset();
|
||||
|
||||
fseek(f, 0, SEEK_END);
|
||||
u32 len = (u32)ftell(f);
|
||||
|
||||
CartROMSize = 0x200;
|
||||
while (CartROMSize < len)
|
||||
CartROMSize <<= 1;
|
||||
|
||||
u32 gamecode;
|
||||
fseek(f, 0x0C, SEEK_SET);
|
||||
fread(&gamecode, 4, 1, f);
|
||||
memcpy(&gamecode, CartROM + 0x0C, 4);
|
||||
printf("Game code: %c%c%c%c\n", gamecode&0xFF, (gamecode>>8)&0xFF, (gamecode>>16)&0xFF, gamecode>>24);
|
||||
|
||||
u8 unitcode;
|
||||
fseek(f, 0x12, SEEK_SET);
|
||||
fread(&unitcode, 1, 1, f);
|
||||
u8 unitcode = CartROM[0x12];
|
||||
CartIsDSi = (unitcode & 0x02) != 0;
|
||||
|
||||
CartROM = new u8[CartROMSize];
|
||||
memset(CartROM, 0, CartROMSize);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
fread(CartROM, 1, len, f);
|
||||
|
||||
fclose(f);
|
||||
//CartROM = f;
|
||||
|
||||
ROMListEntry romparams;
|
||||
if (!ReadROMParams(gamecode, &romparams))
|
||||
{
|
||||
@ -941,7 +910,7 @@ bool LoadROM(const char* path, const char* sram, bool direct)
|
||||
else
|
||||
printf("ROM entry: %08X %08X\n", romparams.ROMSize, romparams.SaveMemType);
|
||||
|
||||
if (romparams.ROMSize != len) printf("!! bad ROM size %d (expected %d) rounded to %d\n", len, romparams.ROMSize, CartROMSize);
|
||||
if (romparams.ROMSize != filelength) printf("!! bad ROM size %d (expected %d) rounded to %d\n", filelength, romparams.ROMSize, CartROMSize);
|
||||
|
||||
// generate a ROM ID
|
||||
// note: most games don't check the actual value
|
||||
@ -1026,6 +995,53 @@ bool LoadROM(const char* path, const char* sram, bool direct)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool LoadROM(const char* path, const char* sram, bool direct)
|
||||
{
|
||||
// TODO: streaming mode? for really big ROMs or systems with limited RAM
|
||||
// for now we're lazy
|
||||
// also TODO: validate what we're loading!!
|
||||
|
||||
FILE* f = Platform::OpenFile(path, "rb");
|
||||
if (!f)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
NDS::Reset();
|
||||
|
||||
fseek(f, 0, SEEK_END);
|
||||
u32 len = (u32)ftell(f);
|
||||
|
||||
CartROMSize = 0x200;
|
||||
while (CartROMSize < len)
|
||||
CartROMSize <<= 1;
|
||||
|
||||
CartROM = new u8[CartROMSize];
|
||||
memset(CartROM, 0, CartROMSize);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
fread(CartROM, 1, len, f);
|
||||
|
||||
fclose(f);
|
||||
|
||||
return LoadROMCommon(len, sram, direct);
|
||||
}
|
||||
|
||||
bool LoadROM(const u8* romdata, u32 filelength, const char *sram, bool direct)
|
||||
{
|
||||
NDS::Reset();
|
||||
|
||||
u32 len = filelength;
|
||||
CartROMSize = 0x200;
|
||||
while (CartROMSize < len)
|
||||
CartROMSize <<= 1;
|
||||
|
||||
CartROM = new u8[CartROMSize];
|
||||
memset(CartROM, 0, CartROMSize);
|
||||
memcpy(CartROM, romdata, filelength);
|
||||
|
||||
return LoadROMCommon(filelength, sram, direct);
|
||||
}
|
||||
|
||||
void RelocateSave(const char* path, bool write)
|
||||
{
|
||||
// herp derp
|
||||
|
Reference in New Issue
Block a user