embed romlist.bin
This commit is contained in:
parent
88823f66cb
commit
c45068da0e
|
@ -37,7 +37,3 @@ add_subdirectory(src)
|
||||||
if (BUILD_QT_SDL)
|
if (BUILD_QT_SDL)
|
||||||
add_subdirectory(src/frontend/qt_sdl)
|
add_subdirectory(src/frontend/qt_sdl)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
configure_file(
|
|
||||||
${CMAKE_SOURCE_DIR}/romlist.bin
|
|
||||||
${CMAKE_BINARY_DIR}/romlist.bin COPYONLY)
|
|
||||||
|
|
BIN
romlist.bin
BIN
romlist.bin
Binary file not shown.
|
@ -27,6 +27,7 @@ add_library(core STATIC
|
||||||
NDSCart.cpp
|
NDSCart.cpp
|
||||||
OpenGLSupport.cpp
|
OpenGLSupport.cpp
|
||||||
Platform.h
|
Platform.h
|
||||||
|
ROMList.h
|
||||||
RTC.cpp
|
RTC.cpp
|
||||||
Savestate.cpp
|
Savestate.cpp
|
||||||
SPI.cpp
|
SPI.cpp
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include "ARM.h"
|
#include "ARM.h"
|
||||||
#include "CRC32.h"
|
#include "CRC32.h"
|
||||||
#include "Platform.h"
|
#include "Platform.h"
|
||||||
|
#include "ROMList.h"
|
||||||
|
|
||||||
|
|
||||||
namespace NDSCart_SRAM
|
namespace NDSCart_SRAM
|
||||||
|
@ -808,34 +809,21 @@ void ApplyDLDIPatch()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool ReadROMParams(u32 gamecode, u32* params)
|
bool ReadROMParams(u32 gamecode, ROMListEntry* params)
|
||||||
{
|
{
|
||||||
// format for romlist.bin:
|
u32 len = sizeof(ROMList) / sizeof(ROMListEntry);
|
||||||
// [gamecode] [ROM size] [save type] [reserved]
|
|
||||||
// list must be sorted by gamecode
|
|
||||||
|
|
||||||
FILE* f = Platform::OpenDataFile("romlist.bin");
|
|
||||||
if (!f) return false;
|
|
||||||
|
|
||||||
fseek(f, 0, SEEK_END);
|
|
||||||
u32 len = (u32)ftell(f);
|
|
||||||
u32 maxlen = len;
|
|
||||||
len >>= 4; // 16 bytes per entry
|
|
||||||
|
|
||||||
u32 offset = 0;
|
u32 offset = 0;
|
||||||
u32 chk_size = len >> 1;
|
u32 chk_size = len >> 1;
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
u32 key = 0;
|
u32 key = 0;
|
||||||
fseek(f, offset + (chk_size << 4), SEEK_SET);
|
ROMListEntry* curentry = &ROMList[offset + chk_size];
|
||||||
fread(&key, 4, 1, f);
|
key = curentry->GameCode;
|
||||||
|
|
||||||
printf("chk_size=%d, key=%08X, wanted=%08X, offset=%08X\n", chk_size, key, gamecode, offset);
|
|
||||||
|
|
||||||
if (key == gamecode)
|
if (key == gamecode)
|
||||||
{
|
{
|
||||||
fread(params, 4, 3, f);
|
memcpy(params, curentry, sizeof(ROMListEntry));
|
||||||
fclose(f);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -843,22 +831,20 @@ bool ReadROMParams(u32 gamecode, u32* params)
|
||||||
if (key < gamecode)
|
if (key < gamecode)
|
||||||
{
|
{
|
||||||
if (chk_size == 0)
|
if (chk_size == 0)
|
||||||
offset += 0x10;
|
offset++;
|
||||||
else
|
else
|
||||||
offset += (chk_size << 4);
|
offset += chk_size;
|
||||||
}
|
}
|
||||||
else if (chk_size == 0)
|
else if (chk_size == 0)
|
||||||
{
|
{
|
||||||
fclose(f);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
chk_size >>= 1;
|
chk_size >>= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (offset >= maxlen)
|
if (offset >= len)
|
||||||
{
|
{
|
||||||
fclose(f);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -936,22 +922,23 @@ bool LoadROM(const char* path, const char* sram, bool direct)
|
||||||
CartCRC = CRC32(CartROM, CartROMSize);
|
CartCRC = CRC32(CartROM, CartROMSize);
|
||||||
printf("ROM CRC32: %08X\n", CartCRC);
|
printf("ROM CRC32: %08X\n", CartCRC);
|
||||||
|
|
||||||
u32 romparams[3];
|
ROMListEntry romparams;
|
||||||
if (!ReadROMParams(gamecode, romparams))
|
if (!ReadROMParams(gamecode, &romparams))
|
||||||
{
|
{
|
||||||
// set defaults
|
// set defaults
|
||||||
printf("ROM entry not found\n");
|
printf("ROM entry not found\n");
|
||||||
|
|
||||||
romparams[0] = CartROMSize;
|
romparams.GameCode = gamecode;
|
||||||
|
romparams.ROMSize = CartROMSize;
|
||||||
if (*(u32*)&CartROM[0x20] < 0x4000)
|
if (*(u32*)&CartROM[0x20] < 0x4000)
|
||||||
romparams[1] = 0; // no saveRAM for homebrew
|
romparams.SaveMemType = 0; // no saveRAM for homebrew
|
||||||
else
|
else
|
||||||
romparams[1] = 2; // assume EEPROM 64k (TODO FIXME)
|
romparams.SaveMemType = 2; // assume EEPROM 64k (TODO FIXME)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
printf("ROM entry: %08X %08X %08X\n", romparams[0], romparams[1], romparams[2]);
|
printf("ROM entry: %08X %08X\n", romparams.ROMSize, romparams.SaveMemType);
|
||||||
|
|
||||||
if (romparams[0] != len) printf("!! bad ROM size %d (expected %d) rounded to %d\n", len, romparams[0], CartROMSize);
|
if (romparams.ROMSize != len) printf("!! bad ROM size %d (expected %d) rounded to %d\n", len, romparams.ROMSize, CartROMSize);
|
||||||
|
|
||||||
// generate a ROM ID
|
// generate a ROM ID
|
||||||
// note: most games don't check the actual value
|
// note: most games don't check the actual value
|
||||||
|
@ -963,7 +950,7 @@ bool LoadROM(const char* path, const char* sram, bool direct)
|
||||||
else
|
else
|
||||||
CartID |= (0x100 - (CartROMSize >> 28)) << 8;
|
CartID |= (0x100 - (CartROMSize >> 28)) << 8;
|
||||||
|
|
||||||
if (romparams[1] == 8)
|
if (romparams.SaveMemType == 8)
|
||||||
CartID |= 0x08000000; // NAND flag
|
CartID |= 0x08000000; // NAND flag
|
||||||
|
|
||||||
printf("Cart ID: %08X\n", CartID);
|
printf("Cart ID: %08X\n", CartID);
|
||||||
|
@ -1018,7 +1005,7 @@ bool LoadROM(const char* path, const char* sram, bool direct)
|
||||||
|
|
||||||
// save
|
// save
|
||||||
printf("Save file: %s\n", sram);
|
printf("Save file: %s\n", sram);
|
||||||
NDSCart_SRAM::LoadSave(sram, romparams[1]);
|
NDSCart_SRAM::LoadSave(sram, romparams.SaveMemType);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1900,39 +1900,6 @@ int main(int argc, char** argv)
|
||||||
SANITIZE(Config::ScreenSizing, 0, 3);
|
SANITIZE(Config::ScreenSizing, 0, 3);
|
||||||
#undef SANITIZE
|
#undef SANITIZE
|
||||||
|
|
||||||
// TODO: this should be checked before running anything
|
|
||||||
#if 0
|
|
||||||
{
|
|
||||||
const char* romlist_missing = "Save memory type detection will not work correctly.\n\n"
|
|
||||||
"You should use the latest version of romlist.bin (provided in melonDS release packages).";
|
|
||||||
#if !defined(UNIX_PORTABLE) && !defined(__WIN32__)
|
|
||||||
std::string missingstr = std::string(romlist_missing) +
|
|
||||||
"\n\nThe ROM list should be placed in " + g_get_user_data_dir() + "/melonds/, otherwise "
|
|
||||||
"melonDS will search for it in the current working directory.";
|
|
||||||
const char* romlist_missing_text = missingstr.c_str();
|
|
||||||
#else
|
|
||||||
const char* romlist_missing_text = romlist_missing;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
FILE* f = Platform::OpenDataFile("romlist.bin");
|
|
||||||
if (f)
|
|
||||||
{
|
|
||||||
u32 data;
|
|
||||||
fread(&data, 4, 1, f);
|
|
||||||
fclose(f);
|
|
||||||
|
|
||||||
if ((data >> 24) == 0) // old CRC-based list
|
|
||||||
{
|
|
||||||
uiMsgBoxError(NULL, "Your version of romlist.bin is outdated.", romlist_missing_text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
uiMsgBoxError(NULL, "romlist.bin not found.", romlist_missing_text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
QSurfaceFormat format;
|
QSurfaceFormat format;
|
||||||
format.setDepthBufferSize(24);
|
format.setDepthBufferSize(24);
|
||||||
format.setStencilBufferSize(8);
|
format.setStencilBufferSize(8);
|
||||||
|
|
Loading…
Reference in New Issue