Revert "RomData: add core, runtime drivers & refactor"

This reverts commit 65d0ecfd12.
This commit is contained in:
taoenwen committed 2026-08-30 08:38:14 +08:00
1 parent 3e8a4f18f3
commit fdfd516238
43 files changed
+3673 -4052

No files matched your search

+1 -1
View File
@@ -6,7 +6,7 @@ depobj += about.o bzip.o choose_monitor.o cona.o debugger.o drv.o d3dkmt_sync.o
inpc.o inpcheat.o inpd.o inpdipsw.o inps.o ips_manager.o localise.o localise_download.o localise_gamelist.o main.o \
media.o memcard.o menu.o misc_win32.o cdlist.o cdlistcache.o neocdsel.o numdial.o paletteviewer.o placeholder.o popup_win32.o \
progress.o replay.o res.o roms.o run.o scrn.o sel.o sfactd.o splash.o stated.o support_paths.o systeminfo.o wave.o \
romdata_core.o mbtwc.o zip.o \
romdata.o mbtwc.o zip.o \
\
conc.o cong.o dat.o inputbuf.o gamc.o gami.o image.o ioapi.o misc.o nvram.o sshot.o state.o statec.o unzip.o zipfn.o \
luaconsole.o luaengine.o luasav.o \
+2 -2
View File
@@ -51,7 +51,7 @@ alldir += burner burner/pi burner/sdl dep/libs/libspng dep/libs/lib7z \
depobj += cdlist.o \
\
conc.o cong.o dat.o gamc.o gami.o image.o ioapi.o misc.o romdata_core.o \
conc.o cong.o dat.o gamc.o gami.o image.o ioapi.o misc.o \
sshot.o state.o statec.o unzip.o zipfn.o \
\
adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o \
@@ -69,7 +69,7 @@ depobj += cdlist.o \
inp_pi.o aud_sdl.o support_paths.o \
ips_manager.o scrn.o config.o \
main_pi.o run_pi.o stringset.o bzip.o drv.o media.o inpdipsw.o \
matrix.o vid_pi.o inputbuf.o replay.o cd_img.o crt.o
matrix.o vid_pi.o inputbuf.o replay.o cd_img.o romdata.o crt.o
ifdef BUILD_DRM
depobj += pigl_drm.o
+1 -1
View File
@@ -68,7 +68,7 @@ depobj += cdlist.o \
2xpm.o 2xsai.o crt.o ddt3x.o epx.o hq2xs.o hq2xs_16.o xbr.o xbr32.o \
\
inp_sdl.o aud_sdl.o support_paths.o ips_manager.o scrn.o localise_gamelist.o \
cd_img.o config.o main.o run.o stringset.o bzip.o drv.o media.o romdata_core.o \
cd_img.o config.o main.o run.o stringset.o bzip.o drv.o media.o romdata.o \
inpdipsw.o vid_sdlfx.o inputbuf.o replay.o vid_sdlopengl.o input_sdl.o stated.o
ifdef INCLUDE_7Z_SUPPORT
+1 -1
View File
@@ -66,7 +66,7 @@ depobj += cdlist.o \
aud_dsp.o aud_interface.o cd_interface.o cd_chd.o inp_interface.o interface.o lowpass2.o vid_interface.o \
vid_support.o \
\
inp_sdl2.o aud_sdl.o support_paths.o ips_manager.o scrn.o localise_gamelist.o romdata_core.o \
inp_sdl2.o aud_sdl.o support_paths.o ips_manager.o scrn.o localise_gamelist.o romdata.o \
cd_img.o config.o main.o run.o stringset.o bzip.o drv.o media.o sdl2_gui_ingame.o sdl2_gui_common.o \
inpdipsw.o vid_sdl2opengl.o vid_sdl2.o inputbuf.o replay.o sdl2_gui.o sdl2_inprint.o input_sdl2.o stated.o
@@ -34,7 +34,7 @@
<ClCompile Include="..\..\src\burner\luasav.cpp" />
<ClCompile Include="..\..\src\burner\misc.cpp" />
<ClCompile Include="..\..\src\burner\nvram.cpp" />
<ClCompile Include="..\..\src\burner\romdata_core.cpp" />
<ClCompile Include="..\..\src\burner\win32\romdata.cpp" />
<ClCompile Include="..\..\src\burner\sshot.cpp" />
<ClCompile Include="..\..\src\burner\state.cpp" />
<ClCompile Include="..\..\src\burner\statec.cpp" />
@@ -3394,8 +3394,8 @@
<ClCompile Include="..\..\src\burner\nvram.cpp">
<Filter>burner</Filter>
</ClCompile>
<ClCompile Include="..\..\src\burner\romdata_core.cpp">
<Filter>burner</Filter>
<ClCompile Include="..\..\src\burner\win32\romdata.cpp">
<Filter>burner\win32</Filter>
</ClCompile>
<ClCompile Include="..\..\src\burner\win32\luaconsole.cpp">
<Filter>burner\win32</Filter>
@@ -34,7 +34,7 @@
<ClCompile Include="..\..\src\burner\luasav.cpp" />
<ClCompile Include="..\..\src\burner\misc.cpp" />
<ClCompile Include="..\..\src\burner\nvram.cpp" />
<ClCompile Include="..\..\src\burner\romdata_core.cpp" />
<ClCompile Include="..\..\src\burner\win32\romdata.cpp" />
<ClCompile Include="..\..\src\burner\sshot.cpp" />
<ClCompile Include="..\..\src\burner\state.cpp" />
<ClCompile Include="..\..\src\burner\statec.cpp" />
@@ -3394,8 +3394,8 @@
<ClCompile Include="..\..\src\burner\nvram.cpp">
<Filter>burner</Filter>
</ClCompile>
<ClCompile Include="..\..\src\burner\romdata_core.cpp">
<Filter>burner</Filter>
<ClCompile Include="..\..\src\burner\win32\romdata.cpp">
<Filter>burner\win32</Filter>
</ClCompile>
<ClCompile Include="..\..\src\burner\win32\luaconsole.cpp">
<Filter>burner\win32</Filter>
@@ -34,7 +34,7 @@
<ClCompile Include="..\..\src\burner\luasav.cpp" />
<ClCompile Include="..\..\src\burner\misc.cpp" />
<ClCompile Include="..\..\src\burner\nvram.cpp" />
<ClCompile Include="..\..\src\burner\romdata_core.cpp" />
<ClCompile Include="..\..\src\burner\win32\romdata.cpp" />
<ClCompile Include="..\..\src\burner\sshot.cpp" />
<ClCompile Include="..\..\src\burner\state.cpp" />
<ClCompile Include="..\..\src\burner\statec.cpp" />
@@ -3394,8 +3394,8 @@
<ClCompile Include="..\..\src\burner\nvram.cpp">
<Filter>burner</Filter>
</ClCompile>
<ClCompile Include="..\..\src\burner\romdata_core.cpp">
<Filter>burner</Filter>
<ClCompile Include="..\..\src\burner\win32\romdata.cpp">
<Filter>burner\win32</Filter>
</ClCompile>
<ClCompile Include="..\..\src\burner\win32\luaconsole.cpp">
<Filter>burner\win32</Filter>
@@ -1037,7 +1037,7 @@
<ClCompile Include="..\..\src\burner\luasav.cpp" />
<ClCompile Include="..\..\src\burner\misc.cpp" />
<ClCompile Include="..\..\src\burner\nvram.cpp" />
<ClCompile Include="..\..\src\burner\romdata_core.cpp" />
<ClCompile Include="..\..\src\burner\win32\romdata.cpp" />
<ClCompile Include="..\..\src\burner\sshot.cpp" />
<ClCompile Include="..\..\src\burner\state.cpp" />
<ClCompile Include="..\..\src\burner\statec.cpp" />
@@ -3010,8 +3010,8 @@
<ClCompile Include="..\..\src\burner\nvram.cpp">
<Filter>burner</Filter>
</ClCompile>
<ClCompile Include="..\..\src\burner\romdata_core.cpp">
<Filter>burner</Filter>
<ClCompile Include="..\..\src\burner\win32\romdata.cpp">
<Filter>burner\win32</Filter>
</ClCompile>
<ClCompile Include="..\..\src\burner\sshot.cpp">
<Filter>burner</Filter>
+134 -270
View File
@@ -21,8 +21,7 @@ INT32 (__cdecl *bprintf)(INT32 nStatus, TCHAR* szFormat, ...) = BurnbprintfFille
INT32 nBurnVer = BURN_VERSION; // Version number of the library
UINT32 nIntlDrvCount = 0; // Count of built-in game drivers
UINT32 nBurnDrvCount = 0; // Count of game drivers (Built-in Games and RomData Games)
UINT32 nBurnDrvCount = 0; // Count of game drivers
UINT32 nBurnDrvActive = ~0U; // Which game driver is selected
INT32 nBurnDrvSubActive = -1; // Which sub-game driver is selected
UINT32 nBurnDrvSelect[8] = { ~0U, ~0U, ~0U, ~0U, ~0U, ~0U, ~0U, ~0U }; // Which games are selected (i.e. loaded but not necessarily active)
@@ -94,13 +93,6 @@ UINT32 *pBurnDrvPalette;
static char** pszShortName = NULL, ** pszFullNameA = NULL;
static wchar_t** pszFullNameW = NULL;
// Dynamic driver list: takes over the static pDriver[] instances, plus every
// dynamically created RomData driver appended at runtime via LinkExtlDrivers().
// All runtime driver access goes through pDriverEx; the static pDriver[] is only
// used as the compile-time source of the built-in drivers.
static struct BurnDriver** pDriverEx = NULL;
static UINT32 nDriverExCapacity = 0;
bool BurnCheckMMXSupport()
{
#if defined BUILD_X86_ASM
@@ -116,40 +108,35 @@ bool BurnCheckMMXSupport()
static void BurnGameListInit()
{ // Avoid broken references, RomData requires separate string storage
if (0 == nIntlDrvCount) return;
pszShortName = (char** )malloc(nIntlDrvCount * sizeof(char*));
pszFullNameA = (char** )malloc(nIntlDrvCount * sizeof(char*));
pszFullNameW = (wchar_t**)malloc(nIntlDrvCount * sizeof(wchar_t*));
if (0 == nBurnDrvCount) return;
pszShortName = (char** )malloc(nBurnDrvCount * sizeof(char*));
pszFullNameA = (char** )malloc(nBurnDrvCount * sizeof(char*));
pszFullNameW = (wchar_t**)malloc(nBurnDrvCount * sizeof(wchar_t*));
if ((NULL != pszShortName) && (NULL != pszFullNameA) && (NULL != pszFullNameW)) {
for (UINT32 i = 0; i < nIntlDrvCount; i++) {
for (UINT32 i = 0; i < nBurnDrvCount; i++) {
pszShortName[i] = (char* )malloc(100 * sizeof(char));
pszFullNameA[i] = (char* )malloc(MAX_PATH * sizeof(char));
pszFullNameW[i] = (wchar_t*)malloc(MAX_PATH * sizeof(wchar_t));
if (pszShortName[i] != NULL) {
memset(pszShortName[i], '\0', 100 * sizeof(char));
strncpy(pszShortName[i], pDriver[i]->szShortName, 100 - 1);
memset(pszShortName[i], '\0', 100 * sizeof(char));
memset(pszFullNameA[i], '\0', MAX_PATH * sizeof(char));
memset(pszFullNameW[i], '\0', MAX_PATH * sizeof(wchar_t));
if (NULL != pszShortName[i]) {
strcpy(pszShortName[i], pDriver[i]->szShortName);
pDriver[i]->szShortName = pszShortName[i];
}
if (pszFullNameA[i] != NULL) {
memset(pszFullNameA[i], '\0', MAX_PATH * sizeof(char));
strncpy(pszFullNameA[i], pDriver[i]->szFullNameA, MAX_PATH - 1);
if (NULL != pszFullNameA[i]) {
strcpy(pszFullNameA[i], pDriver[i]->szFullNameA);
pDriver[i]->szFullNameA = pszFullNameA[i];
}
#if defined (_UNICODE)
if (pszFullNameW[i] != NULL) {
memset(pszFullNameW[i], '\0', MAX_PATH * sizeof(wchar_t));
if (pDriver[i]->szFullNameW != NULL) {
wmemcpy(pszFullNameW[i], pDriver[i]->szFullNameW, MAX_PATH); // Include '\0'
}
pDriver[i]->szFullNameW = pszFullNameW[i];
}
#else
if (pszFullNameW[i] != NULL) {
memset(pszFullNameW[i], '\0', MAX_PATH * sizeof(wchar_t));
if (NULL != pDriver[i]->szFullNameW) {
wmemcpy(pszFullNameW[i], pDriver[i]->szFullNameW, MAX_PATH); // Include '\0'
}
pDriver[i]->szFullNameW = pszFullNameW[i];
#endif
}
}
@@ -159,121 +146,21 @@ static void BurnGameListInit()
static void BurnGameListExit()
{
// Release of storage space
for (UINT32 i = 0; i < nIntlDrvCount; i++) {
if ((pszShortName != NULL) && (pszShortName[i] != NULL)) free_s((void**)&pszShortName[i]);
if ((pszFullNameA != NULL) && (pszFullNameA[i] != NULL)) free_s((void**)&pszFullNameA[i]);
if ((pszFullNameW != NULL) && (pszFullNameW[i] != NULL)) free_s((void**)&pszFullNameW[i]);
for (UINT32 i = 0; i < nBurnDrvCount; i++) {
if ((NULL != pszShortName) && (NULL != pszShortName[i])) free(pszShortName[i]);
if ((NULL != pszFullNameA) && (NULL != pszFullNameA[i])) free(pszFullNameA[i]);
if ((NULL != pszFullNameW) && (NULL != pszFullNameW[i])) free(pszFullNameW[i]);
}
if (pszShortName != NULL) free_s((void**)&pszShortName);
if (pszFullNameA != NULL) free_s((void**)&pszFullNameA);
if (pszFullNameW != NULL) free_s((void**)&pszFullNameW);
}
// A dynamically created `pDriverEx` will directly reference the static `pDriver`
static struct BurnDriver** LinkBurnDrivers(const UINT32 intlCount)
{
if (intlCount <= 0)
return NULL;
struct BurnDriver** arr = (struct BurnDriver**)malloc(intlCount * sizeof(struct BurnDriver*));
if (!arr)
return NULL;
for (UINT32 i = 0; i < intlCount; i++)
arr[i] = pDriver[i];
return arr;
}
extern "C" INT32 BurnReserveExtlDrivers(UINT32 nAdditional)
{
if (nAdditional > ~0U - nBurnDrvCount)
return 1;
UINT32 nRequired = nBurnDrvCount + nAdditional;
if (nRequired <= nDriverExCapacity)
return 0;
UINT32 nCapacity = nDriverExCapacity ? nDriverExCapacity : 32;
while (nCapacity < nRequired) {
if (nCapacity > ~0U / 2) {
nCapacity = nRequired;
break;
}
nCapacity *= 2;
}
if ((size_t)nCapacity > (size_t)-1 / sizeof(struct BurnDriver*))
return 1;
struct BurnDriver** arr = (struct BurnDriver**)realloc(pDriverEx, (size_t)nCapacity * sizeof(struct BurnDriver*));
if (!arr)
return 1;
memset(arr + nDriverExCapacity, 0, (size_t)(nCapacity - nDriverExCapacity) * sizeof(struct BurnDriver*));
pDriverEx = arr;
nDriverExCapacity = nCapacity;
return 0;
}
// In addition to taking over static pDriver instances, pDriverEx also takes over
// every dynamically created RomData driver appended at the end of the list.
extern "C" UINT32 LinkExtlDrivers(struct BurnDriver* drv, UINT32* pallCount)
{
if (!drv || !pallCount || *pallCount != nBurnDrvCount || BurnReserveExtlDrivers(1))
return ~0U;
UINT32 i = *pallCount;
pDriverEx[i] = drv;
*pallCount = i + 1;
return *pallCount;
}
// Remove one runtime-added driver and close the gap, so the remaining indices stay valid.
extern "C" INT32 UnlinkExtlDriver(struct BurnDriver* drv)
{
if (drv == NULL || pDriverEx == NULL)
return 1;
for (UINT32 i = nIntlDrvCount; i < nBurnDrvCount; i++) {
if (pDriverEx[i] != drv)
continue;
if (i + 1 < nBurnDrvCount) {
memmove(pDriverEx + i, pDriverEx + i + 1, (nBurnDrvCount - i - 1) * sizeof(struct BurnDriver*));
}
nBurnDrvCount--;
pDriverEx[nBurnDrvCount] = NULL;
if (nBurnDrvActive > i && nBurnDrvActive < ~0U)
nBurnDrvActive--;
else if (nBurnDrvActive == i)
nBurnDrvActive = ~0U;
for (INT32 nSlot = 0; nSlot < 8; nSlot++) {
if (nBurnDrvSelect[nSlot] > i && nBurnDrvSelect[nSlot] < ~0U)
nBurnDrvSelect[nSlot]--;
else if (nBurnDrvSelect[nSlot] == i)
nBurnDrvSelect[nSlot] = ~0U;
}
return 0;
}
return 1;
}
static void UnlinkDrivers()
{
free_s((void**)&pDriverEx);
nDriverExCapacity = 0;
if (NULL != pszShortName) free(pszShortName);
if (NULL != pszFullNameA) free(pszFullNameA);
if (NULL != pszFullNameW) free(pszFullNameW);
}
extern "C" INT32 BurnLibInit()
{
BurnLibExit();
nIntlDrvCount = nBurnDrvCount = ARRAY_SIZE(pDriver); // count available drivers
pDriverEx = LinkBurnDrivers(nIntlDrvCount); // Link the static driver list into the extended driver list
nDriverExCapacity = pDriverEx ? nIntlDrvCount : 0;
nBurnDrvCount = sizeof(pDriver) / sizeof(pDriver[0]); // count available drivers
BurnGameListInit();
@@ -284,18 +171,10 @@ extern "C" INT32 BurnLibInit()
return 0;
}
// Teardown hook for runtime-linked driver modules; romdata_core installs
// RomDataFree here, so no frontend has to remember the release order.
void (*BurnLibExitHook)(void) = NULL;
extern "C" INT32 BurnLibExit()
{
if (BurnLibExitHook) BurnLibExitHook(); // release runtime drivers while pDriverEx is still alive
BurnGameListExit();
UnlinkDrivers();
nIntlDrvCount = 0;
nBurnDrvCount = 0;
return 0;
@@ -311,20 +190,20 @@ INT32 BurnGetZipName(char** pszName, UINT32 i)
}
if (i == 0) {
pszGameName = pDriverEx[nBurnDrvActive]->szShortName;
pszGameName = pDriver[nBurnDrvActive]->szShortName;
} else {
INT32 nOldBurnDrvSelect = nBurnDrvActive;
UINT32 j = pDriverEx[nBurnDrvActive]->szBoardROM ? 1 : 0;
UINT32 j = pDriver[nBurnDrvActive]->szBoardROM ? 1 : 0;
// Try BIOS/board ROMs first
if (i == 1 && j == 1) { // There is a BIOS/board ROM
pszGameName = pDriverEx[nBurnDrvActive]->szBoardROM;
pszGameName = pDriver[nBurnDrvActive]->szBoardROM;
}
if (pszGameName == NULL) {
// Go through the list to seek out the parent
while (j < i) {
char* pszParent = pDriverEx[nBurnDrvActive]->szParent;
char* pszParent = pDriver[nBurnDrvActive]->szParent;
pszGameName = NULL;
if (pszParent == NULL) { // No parent
@@ -332,8 +211,8 @@ INT32 BurnGetZipName(char** pszName, UINT32 i)
}
for (nBurnDrvActive = 0; nBurnDrvActive < nBurnDrvCount; nBurnDrvActive++) {
if (strcmp(pszParent, pDriverEx[nBurnDrvActive]->szShortName) == 0) { // Found parent
pszGameName = pDriverEx[nBurnDrvActive]->szShortName;
if (strcmp(pszParent, pDriver[nBurnDrvActive]->szShortName) == 0) { // Found parent
pszGameName = pDriver[nBurnDrvActive]->szShortName;
break;
}
}
@@ -402,10 +281,10 @@ extern "C" TCHAR* BurnDrvGetText(UINT32 i)
switch (i & 0xFF) {
#if !defined(__LIBRETRO__) && !defined(BUILD_SDL) && !defined(BUILD_SDL2) && !defined(BUILD_MACOS)
case DRV_FULLNAME:
pszStringW = pDriverEx[nBurnDrvActive]->szFullNameW;
pszStringW = pDriver[nBurnDrvActive]->szFullNameW;
if (i & DRV_NEXTNAME) {
if (pszCurrentNameW && pDriverEx[nBurnDrvActive]->szFullNameW) {
if (pszCurrentNameW && pDriver[nBurnDrvActive]->szFullNameW) {
pszCurrentNameW += wcslen(pszCurrentNameW) + 1;
if (!pszCurrentNameW[0]) {
return NULL;
@@ -417,7 +296,7 @@ extern "C" TCHAR* BurnDrvGetText(UINT32 i)
#if !defined (_UNICODE)
// Ensure all of the Unicode titles are printable in the current locale
pszCurrentNameW = pDriverEx[nBurnDrvActive]->szFullNameW;
pszCurrentNameW = pDriver[nBurnDrvActive]->szFullNameW;
if (pszCurrentNameW && pszCurrentNameW[0]) {
INT32 nRet;
@@ -428,13 +307,13 @@ extern "C" TCHAR* BurnDrvGetText(UINT32 i)
// If all titles can be printed, we can use the Unicode versions
if (nRet >= 0) {
pszStringW = pszCurrentNameW = pDriverEx[nBurnDrvActive]->szFullNameW;
pszStringW = pszCurrentNameW = pDriver[nBurnDrvActive]->szFullNameW;
}
}
#else
pszStringW = pszCurrentNameW = pDriverEx[nBurnDrvActive]->szFullNameW;
pszStringW = pszCurrentNameW = pDriver[nBurnDrvActive]->szFullNameW;
#endif
@@ -442,13 +321,13 @@ extern "C" TCHAR* BurnDrvGetText(UINT32 i)
break;
#endif // !defined(__LIBRETRO__) && !defined(BUILD_SDL)
case DRV_COMMENT:
pszStringW = pDriverEx[nBurnDrvActive]->szCommentW;
pszStringW = pDriver[nBurnDrvActive]->szCommentW;
break;
case DRV_MANUFACTURER:
pszStringW = pDriverEx[nBurnDrvActive]->szManufacturerW;
pszStringW = pDriver[nBurnDrvActive]->szManufacturerW;
break;
case DRV_SYSTEM:
pszStringW = pDriverEx[nBurnDrvActive]->szSystemW;
pszStringW = pDriver[nBurnDrvActive]->szSystemW;
}
#if defined (_UNICODE)
@@ -508,16 +387,16 @@ extern "C" TCHAR* BurnDrvGetText(UINT32 i)
switch (i & 0xFF) {
case DRV_NAME:
pszStringA = pDriverEx[nBurnDrvActive]->szShortName;
pszStringA = pDriver[nBurnDrvActive]->szShortName;
break;
case DRV_DATE:
pszStringA = pDriverEx[nBurnDrvActive]->szDate;
pszStringA = pDriver[nBurnDrvActive]->szDate;
break;
case DRV_FULLNAME:
pszStringA = pDriverEx[nBurnDrvActive]->szFullNameA;
pszStringA = pDriver[nBurnDrvActive]->szFullNameA;
if (i & DRV_NEXTNAME) {
if (!pszCurrentNameW && pDriverEx[nBurnDrvActive]->szFullNameA) {
if (!pszCurrentNameW && pDriver[nBurnDrvActive]->szFullNameA) {
pszCurrentNameA += strlen(pszCurrentNameA) + 1;
if (!pszCurrentNameA[0]) {
return NULL;
@@ -525,27 +404,27 @@ extern "C" TCHAR* BurnDrvGetText(UINT32 i)
pszStringA = pszCurrentNameA;
}
} else {
pszStringA = pszCurrentNameA = pDriverEx[nBurnDrvActive]->szFullNameA;
pszStringA = pszCurrentNameA = pDriver[nBurnDrvActive]->szFullNameA;
pszCurrentNameW = NULL;
}
break;
case DRV_COMMENT:
pszStringA = pDriverEx[nBurnDrvActive]->szCommentA;
pszStringA = pDriver[nBurnDrvActive]->szCommentA;
break;
case DRV_MANUFACTURER:
pszStringA = pDriverEx[nBurnDrvActive]->szManufacturerA;
pszStringA = pDriver[nBurnDrvActive]->szManufacturerA;
break;
case DRV_SYSTEM:
pszStringA = pDriverEx[nBurnDrvActive]->szSystemA;
pszStringA = pDriver[nBurnDrvActive]->szSystemA;
break;
case DRV_PARENT:
pszStringA = pDriverEx[nBurnDrvActive]->szParent;
pszStringA = pDriver[nBurnDrvActive]->szParent;
break;
case DRV_BOARDROM:
pszStringA = pDriverEx[nBurnDrvActive]->szBoardROM;
pszStringA = pDriver[nBurnDrvActive]->szBoardROM;
break;
case DRV_SAMPLENAME:
pszStringA = pDriverEx[nBurnDrvActive]->szSampleName;
pszStringA = pDriver[nBurnDrvActive]->szSampleName;
}
#if defined (_UNICODE)
@@ -614,23 +493,23 @@ extern "C" char* BurnDrvGetTextA(UINT32 i)
{
switch (i) {
case DRV_NAME:
return pDriverEx[nBurnDrvActive]->szShortName;
return pDriver[nBurnDrvActive]->szShortName;
case DRV_DATE:
return pDriverEx[nBurnDrvActive]->szDate;
return pDriver[nBurnDrvActive]->szDate;
case DRV_FULLNAME:
return pDriverEx[nBurnDrvActive]->szFullNameA;
return pDriver[nBurnDrvActive]->szFullNameA;
case DRV_COMMENT:
return pDriverEx[nBurnDrvActive]->szCommentA;
return pDriver[nBurnDrvActive]->szCommentA;
case DRV_MANUFACTURER:
return pDriverEx[nBurnDrvActive]->szManufacturerA;
return pDriver[nBurnDrvActive]->szManufacturerA;
case DRV_SYSTEM:
return pDriverEx[nBurnDrvActive]->szSystemA;
return pDriver[nBurnDrvActive]->szSystemA;
case DRV_PARENT:
return pDriverEx[nBurnDrvActive]->szParent;
return pDriver[nBurnDrvActive]->szParent;
case DRV_BOARDROM:
return pDriverEx[nBurnDrvActive]->szBoardROM;
return pDriver[nBurnDrvActive]->szBoardROM;
case DRV_SAMPLENAME:
return pDriverEx[nBurnDrvActive]->szSampleName;
return pDriver[nBurnDrvActive]->szSampleName;
default:
return NULL;
}
@@ -638,23 +517,25 @@ extern "C" char* BurnDrvGetTextA(UINT32 i)
static INT32 BurnDrvSetFullNameA(char* szName, UINT32 i = nBurnDrvActive)
{
// Only internal drivers own storage here; RomData drivers carry their own
// strings, so anything at or past nIntlDrvCount is out of this array.
if ((szName == NULL) || (pszFullNameA == NULL) || (i >= nIntlDrvCount) || (pszFullNameA[i] == NULL)) return -1;
// Preventing the emergence of ~0U
// If not NULL, then FullNameA is customized
if ((i >= 0) && (NULL != szName)) {
memset(pszFullNameA[i], '\0', MAX_PATH * sizeof(char));
strcpy(pszFullNameA[i], szName);
memset(pszFullNameA[i], '\0', MAX_PATH * sizeof(char));
strncpy(pszFullNameA[i], szName, MAX_PATH - 1);
return 0;
}
return 0;
return -1;
}
INT32 BurnDrvSetFullNameW(TCHAR* szName, INT32 i = nBurnDrvActive)
{
if ((i < 0) || (szName == NULL) || (pszFullNameW == NULL) || ((UINT32)i >= nIntlDrvCount) || (pszFullNameW[i] == NULL)) return -1;
if ((-1 == i) || (NULL == szName)) return -1;
#if defined (_UNICODE)
memset(pszFullNameW[i], '\0', MAX_PATH * sizeof(wchar_t));
wcsncpy(pszFullNameW[i], szName, MAX_PATH - 1);
wcscpy(pszFullNameW[i], szName);
#endif
return 0;
@@ -663,12 +544,10 @@ INT32 BurnDrvSetFullNameW(TCHAR* szName, INT32 i = nBurnDrvActive)
#if defined (_UNICODE)
void BurnLocalisationSetName(char* szName, TCHAR* szLongName)
{
// RomData has its own game name storage; this only handles built-in drivers,
// which is also the range covered by the pszFullNameW[] array.
for (UINT32 i = 0; i < nIntlDrvCount; i++) {
for (UINT32 i = 0; i < nBurnDrvCount; i++) {
nBurnDrvActive = i;
if (!strcmp(szName, pDriverEx[i]->szShortName)) {
// pDriverEx[i]->szFullNameW = szLongName;
if (!strcmp(szName, pDriver[i]->szShortName)) {
// pDriver[i]->szFullNameW = szLongName;
memset(pszFullNameW[i], '\0', MAX_PATH * sizeof(wchar_t));
_tcscpy(pszFullNameW[i], szLongName);
}
@@ -695,7 +574,7 @@ static void BurnLocalisationSetNameEx()
char szShortNames[100] = { '\0'};
sprintf(szShortNames, "%s[0x%02x]", pDriverEx[nBurnDrvActive]->szShortName, nBurnDrvSubActive);
sprintf(szShortNames, "%s[0x%02x]", pDriver[nBurnDrvActive]->szShortName, nBurnDrvSubActive);
for (INT32 nIndex = 0; nIndex < nNamesExArray; nIndex++) {
if (0 == strcmp(szShortNamesExArray[nIndex], szShortNames)) {
@@ -711,9 +590,7 @@ extern "C" INT32 BurnDrvGetIndex(char* szName)
if (NULL == szName) return -1;
for (UINT32 i = 0; i < nBurnDrvCount; i++) {
if (!pDriverEx || !pDriverEx[i] || !pDriverEx[i]->szShortName)
continue;
if (0 == strcmp(szName, pDriverEx[i]->szShortName)) {
if (0 == strcmp(szName, pDriver[i]->szShortName)) {
// nBurnDrvActive = i;
return i;
}
@@ -724,60 +601,47 @@ extern "C" INT32 BurnDrvGetIndex(char* szName)
extern "C" wchar_t* BurnDrvGetFullNameW(UINT32 i)
{
return pDriverEx[i]->szFullNameW;
}
// The selected driver, or NULL when nothing valid is selected
extern "C" struct BurnDriver* BurnGetActiveDriver()
{
if (!pDriverEx || nBurnDrvActive >= nBurnDrvCount) return NULL;
return pDriverEx[nBurnDrvActive];
}
// Look up a driver pointer by its short name (used by RomData to clone a base driver)
extern "C" struct BurnDriver* BurnGetDriver(const char* szName)
{
if (!szName) return NULL;
for (UINT32 i = 0; i < nBurnDrvCount; i++) {
if (!pDriverEx || !pDriverEx[i] || !pDriverEx[i]->szShortName)
continue;
if (0 == strcmp(szName, pDriverEx[i]->szShortName))
return pDriverEx[i];
}
return NULL;
return pDriver[i]->szFullNameW;
}
// Get the zip names for the driver
extern "C" INT32 BurnDrvGetZipName(char** pszName, UINT32 i)
{
if (pDriverEx[nBurnDrvActive]->GetZipName) { // Forward to drivers function
return pDriverEx[nBurnDrvActive]->GetZipName(pszName, i);
if (pDriver[nBurnDrvActive]->GetZipName) { // Forward to drivers function
return pDriver[nBurnDrvActive]->GetZipName(pszName, i);
}
return BurnGetZipName(pszName, i); // Forward to general function
}
extern "C" INT32 BurnDrvSetZipName(char* szName, INT32 i)
{
if ((NULL == szName) || (-1 == i)) return -1;
strcpy(pszShortName[i], szName);
return 0;
}
extern "C" INT32 BurnDrvGetRomInfo(struct BurnRomInfo* pri, UINT32 i) // Forward to drivers function
{
return pDriverEx[nBurnDrvActive]->GetRomInfo(pri, i);
return pDriver[nBurnDrvActive]->GetRomInfo(pri, i);
}
extern "C" INT32 BurnDrvGetRomName(char** pszName, UINT32 i, INT32 nAka) // Forward to drivers function
{
return pDriverEx[nBurnDrvActive]->GetRomName(pszName, i, nAka);
return pDriver[nBurnDrvActive]->GetRomName(pszName, i, nAka);
}
extern "C" INT32 BurnDrvGetInputInfo(struct BurnInputInfo* pii, UINT32 i) // Forward to drivers function
{
return pDriverEx[nBurnDrvActive]->GetInputInfo(pii, i);
return pDriver[nBurnDrvActive]->GetInputInfo(pii, i);
}
extern "C" INT32 BurnDrvGetDIPInfo(struct BurnDIPInfo* pdi, UINT32 i)
{
if (pDriverEx[nBurnDrvActive]->GetDIPInfo) { // Forward to drivers function
return pDriverEx[nBurnDrvActive]->GetDIPInfo(pdi, i);
if (pDriver[nBurnDrvActive]->GetDIPInfo) { // Forward to drivers function
return pDriver[nBurnDrvActive]->GetDIPInfo(pdi, i);
}
return 1; // Fail automatically
@@ -785,18 +649,18 @@ extern "C" INT32 BurnDrvGetDIPInfo(struct BurnDIPInfo* pdi, UINT32 i)
extern "C" INT32 BurnDrvGetSampleInfo(struct BurnSampleInfo* pri, UINT32 i) // Forward to drivers function
{
return pDriverEx[nBurnDrvActive]->GetSampleInfo(pri, i);
return pDriver[nBurnDrvActive]->GetSampleInfo(pri, i);
}
extern "C" INT32 BurnDrvGetSampleName(char** pszName, UINT32 i, INT32 nAka) // Forward to drivers function
{
return pDriverEx[nBurnDrvActive]->GetSampleName(pszName, i, nAka);
return pDriver[nBurnDrvActive]->GetSampleName(pszName, i, nAka);
}
extern "C" INT32 BurnDrvGetHDDInfo(struct BurnHDDInfo* pri, UINT32 i) // Forward to drivers function
{
if (pDriverEx[nBurnDrvActive]->GetHDDInfo) {
return pDriverEx[nBurnDrvActive]->GetHDDInfo(pri, i);
if (pDriver[nBurnDrvActive]->GetHDDInfo) {
return pDriver[nBurnDrvActive]->GetHDDInfo(pri, i);
} else {
return 0;
}
@@ -804,8 +668,8 @@ extern "C" INT32 BurnDrvGetHDDInfo(struct BurnHDDInfo* pri, UINT32 i) // Forwar
extern "C" INT32 BurnDrvGetHDDName(char** pszName, UINT32 i, INT32 nAka) // Forward to drivers function
{
if (pDriverEx[nBurnDrvActive]->GetHDDName) {
return pDriverEx[nBurnDrvActive]->GetHDDName(pszName, i, nAka);
if (pDriver[nBurnDrvActive]->GetHDDName) {
return pDriver[nBurnDrvActive]->GetHDDName(pszName, i, nAka);
} else {
return 0;
}
@@ -814,8 +678,8 @@ extern "C" INT32 BurnDrvGetHDDName(char** pszName, UINT32 i, INT32 nAka) // For
// Get the screen size
extern "C" INT32 BurnDrvGetVisibleSize(INT32* pnWidth, INT32* pnHeight)
{
*pnWidth =pDriverEx[nBurnDrvActive]->nWidth;
*pnHeight=pDriverEx[nBurnDrvActive]->nHeight;
*pnWidth =pDriver[nBurnDrvActive]->nWidth;
*pnHeight=pDriver[nBurnDrvActive]->nHeight;
return 0;
}
@@ -830,12 +694,12 @@ extern "C" INT32 BurnDrvGetVisibleOffs(INT32* pnLeft, INT32* pnTop)
extern "C" INT32 BurnDrvGetFullSize(INT32* pnWidth, INT32* pnHeight)
{
if (pDriverEx[nBurnDrvActive]->Flags & BDF_ORIENTATION_VERTICAL) {
*pnWidth =pDriverEx[nBurnDrvActive]->nHeight;
*pnHeight=pDriverEx[nBurnDrvActive]->nWidth;
if (pDriver[nBurnDrvActive]->Flags & BDF_ORIENTATION_VERTICAL) {
*pnWidth =pDriver[nBurnDrvActive]->nHeight;
*pnHeight=pDriver[nBurnDrvActive]->nWidth;
} else {
*pnWidth =pDriverEx[nBurnDrvActive]->nWidth;
*pnHeight=pDriverEx[nBurnDrvActive]->nHeight;
*pnWidth =pDriver[nBurnDrvActive]->nWidth;
*pnHeight=pDriver[nBurnDrvActive]->nHeight;
}
return 0;
@@ -844,20 +708,20 @@ extern "C" INT32 BurnDrvGetFullSize(INT32* pnWidth, INT32* pnHeight)
// Get screen aspect ratio
extern "C" INT32 BurnDrvGetAspect(INT32* pnXAspect, INT32* pnYAspect)
{
*pnXAspect = pDriverEx[nBurnDrvActive]->nXAspect;
*pnYAspect = pDriverEx[nBurnDrvActive]->nYAspect;
*pnXAspect = pDriver[nBurnDrvActive]->nXAspect;
*pnYAspect = pDriver[nBurnDrvActive]->nYAspect;
return 0;
}
extern "C" INT32 BurnDrvSetVisibleSize(INT32 pnWidth, INT32 pnHeight)
{
if (pDriverEx[nBurnDrvActive]->Flags & BDF_ORIENTATION_VERTICAL) {
pDriverEx[nBurnDrvActive]->nHeight = pnWidth;
pDriverEx[nBurnDrvActive]->nWidth = pnHeight;
if (pDriver[nBurnDrvActive]->Flags & BDF_ORIENTATION_VERTICAL) {
pDriver[nBurnDrvActive]->nHeight = pnWidth;
pDriver[nBurnDrvActive]->nWidth = pnHeight;
} else {
pDriverEx[nBurnDrvActive]->nWidth = pnWidth;
pDriverEx[nBurnDrvActive]->nHeight = pnHeight;
pDriver[nBurnDrvActive]->nWidth = pnWidth;
pDriver[nBurnDrvActive]->nHeight = pnHeight;
}
return 0;
@@ -865,8 +729,8 @@ extern "C" INT32 BurnDrvSetVisibleSize(INT32 pnWidth, INT32 pnHeight)
extern "C" INT32 BurnDrvSetAspect(INT32 pnXAspect,INT32 pnYAspect)
{
pDriverEx[nBurnDrvActive]->nXAspect = pnXAspect;
pDriverEx[nBurnDrvActive]->nYAspect = pnYAspect;
pDriver[nBurnDrvActive]->nXAspect = pnXAspect;
pDriver[nBurnDrvActive]->nYAspect = pnYAspect;
return 0;
}
@@ -874,43 +738,43 @@ extern "C" INT32 BurnDrvSetAspect(INT32 pnXAspect,INT32 pnYAspect)
// Get the hardware code
extern "C" INT32 BurnDrvGetHardwareCode()
{
return pDriverEx[nBurnDrvActive]->Hardware;
return pDriver[nBurnDrvActive]->Hardware;
}
// Get flags, including BDF_GAME_WORKING flag
extern "C" INT32 BurnDrvGetFlags()
{
return pDriverEx[nBurnDrvActive]->Flags;
return pDriver[nBurnDrvActive]->Flags;
}
// Return BDF_WORKING flag
extern "C" bool BurnDrvIsWorking()
{
return pDriverEx[nBurnDrvActive]->Flags & BDF_GAME_WORKING;
return pDriver[nBurnDrvActive]->Flags & BDF_GAME_WORKING;
}
// Return max. number of players
extern "C" INT32 BurnDrvGetMaxPlayers()
{
return pDriverEx[nBurnDrvActive]->Players;
return pDriver[nBurnDrvActive]->Players;
}
// Return genre flags
extern "C" INT32 BurnDrvGetGenreFlags()
{
return pDriverEx[nBurnDrvActive]->Genre;
return pDriver[nBurnDrvActive]->Genre;
}
// Return family flags
extern "C" INT32 BurnDrvGetFamilyFlags()
{
return pDriverEx[nBurnDrvActive]->Family;
return pDriver[nBurnDrvActive]->Family;
}
// Return sourcefile
extern "C" char* BurnDrvGetSourcefile()
{
char* szShortName = pDriverEx[nBurnDrvActive]->szShortName;
char* szShortName = pDriver[nBurnDrvActive]->szShortName;
for (INT32 i = 0; sourcefile_table[i].game_name[0] != '\0'; i++) {
if (!strcmp(sourcefile_table[i].game_name, szShortName)) {
return sourcefile_table[i].sourcefile;
@@ -1022,13 +886,13 @@ extern "C" INT32 BurnDrvInit()
BurnSoundDCFilterReset();
BurnTimerPreInit();
nReturnValue = pDriverEx[nBurnDrvActive]->Init(); // Forward to drivers function
nReturnValue = pDriver[nBurnDrvActive]->Init(); // Forward to drivers function
if (-1 != nBurnDrvSubActive) {
BurnLocalisationSetNameEx();
}
nMaxPlayers = pDriverEx[nBurnDrvActive]->Players;
nMaxPlayers = pDriver[nBurnDrvActive]->Players;
nCurrentFrame = 0;
@@ -1091,7 +955,7 @@ extern "C" INT32 BurnDrvExit()
#endif
}
INT32 nRet = pDriverEx[nBurnDrvActive]->Exit(); // Forward to drivers function
INT32 nRet = pDriver[nBurnDrvActive]->Exit(); // Forward to drivers function
nBurnDrvSubActive = -1; // Rest to -1;
@@ -1114,7 +978,7 @@ INT32 BurnDrvCartridgeSetup(BurnCartrigeCommand nCommand)
}
if (nCommand == CART_EXIT) {
return pDriverEx[nBurnDrvActive]->Exit();
return pDriver[nBurnDrvActive]->Exit();
}
if (nCommand != CART_INIT_END && nCommand != CART_INIT_START) {
@@ -1132,7 +996,7 @@ INT32 BurnDrvCartridgeSetup(BurnCartrigeCommand nCommand)
}
if (nCommand == CART_INIT_START) {
return pDriverEx[nBurnDrvActive]->Init();
return pDriver[nBurnDrvActive]->Init();
}
return 0;
@@ -1143,14 +1007,14 @@ extern "C" INT32 BurnDrvFrame()
{
CheatApply(); // Apply cheats (if any)
HiscoreApply();
return pDriverEx[nBurnDrvActive]->Frame(); // Forward to drivers function
return pDriver[nBurnDrvActive]->Frame(); // Forward to drivers function
}
// Force redraw of the screen
extern "C" INT32 BurnDrvRedraw()
{
if (pDriverEx[nBurnDrvActive]->Redraw) {
return pDriverEx[nBurnDrvActive]->Redraw(); // Forward to drivers function
if (pDriver[nBurnDrvActive]->Redraw) {
return pDriver[nBurnDrvActive]->Redraw(); // Forward to drivers function
}
return 1; // No funtion provide, so simply return
@@ -1160,7 +1024,7 @@ extern "C" INT32 BurnDrvRedraw()
extern "C" INT32 BurnRecalcPal()
{
if (nBurnDrvActive < nBurnDrvCount) {
UINT8* pr = pDriverEx[nBurnDrvActive]->pRecalcPal;
UINT8* pr = pDriver[nBurnDrvActive]->pRecalcPal;
if (pr == NULL) return 1;
*pr = 1; // Signal for the driver to refresh it's palette
}
@@ -1170,7 +1034,7 @@ extern "C" INT32 BurnRecalcPal()
extern "C" INT32 BurnDrvGetPaletteEntries()
{
return pDriverEx[nBurnDrvActive]->nPaletteEntries;
return pDriver[nBurnDrvActive]->nPaletteEntries;
}
// ----------------------------------------------------------------------------
@@ -1260,7 +1124,7 @@ inline static INT32 BurnClearSize(INT32 w, INT32 h)
INT32 BurnClearScreen()
{
struct BurnDriver* pbd = pDriverEx[nBurnDrvActive];
struct BurnDriver* pbd = pDriver[nBurnDrvActive];
if (pbd->Flags & BDF_ORIENTATION_VERTICAL) {
BurnClearSize(pbd->nHeight, pbd->nWidth);
@@ -1344,8 +1208,8 @@ INT32 BurnAreaScan(INT32 nAction, INT32* pnMin)
}
// Forward to the driver
if (pDriverEx[nBurnDrvActive]->AreaScan) {
nRet |= pDriverEx[nBurnDrvActive]->AreaScan(nAction, pnMin);
if (pDriver[nBurnDrvActive]->AreaScan) {
nRet |= pDriver[nBurnDrvActive]->AreaScan(nAction, pnMin);
}
#ifdef __LIBRETRO__
+19 -14
View File
@@ -213,11 +213,23 @@ static inline bool IsStrEmptyA(const char* s)
return (!s || '\0' == *s);
}
// RomData drivers are cloned from a base driver at runtime; see burner/romdata_core.cpp.
bool IsRomDataDrv();
char* RomDataDrvGetDrvName();
struct BurnRomInfo* RomDataDrvGetRomInfo(UINT32* pRomCount);
const char* RomDataDrvGetExtName();
struct RomDataInfo {
char szZipName[MAX_PATH];
char szDrvName[MAX_PATH];
char szExtraRom[MAX_PATH];
wchar_t szOldName[MAX_PATH];
wchar_t szFullName[MAX_PATH];
INT32 nDriverId;
INT32 nDescCount;
};
extern RomDataInfo* pRDI;
extern BurnRomInfo* pDataRomDesc;
char* RomdataGetDrvName();
void RomDataSetFullName();
void RomDataInit();
void RomDataExit();
// ---------------------------------------------------------------------------
@@ -331,8 +343,7 @@ extern bool bBurnUseBlend;
extern INT32 nBurnFPS;
extern INT32 nBurnCPUSpeedAdjust;
extern UINT32 nIntlDrvCount; // Count of built-in game drivers (excludes RomData drivers)
extern UINT32 nBurnDrvCount; // Count of game drivers (built-in + RomData drivers)
extern UINT32 nBurnDrvCount; // Count of game drivers
extern UINT32 nBurnDrvActive; // Which game driver is selected
extern INT32 nBurnDrvSubActive; // Which sub-game driver is selected
extern UINT32 nBurnDrvSelect[8]; // Which games are selected (i.e. loaded but not necessarily active)
@@ -465,13 +476,8 @@ char* BurnDrvGetTextA(UINT32 i);
wchar_t* BurnDrvGetFullNameW(UINT32 i);
INT32 BurnDrvGetIndex(char* szName);
struct BurnDriver* BurnGetDriver(const char* szName);
struct BurnDriver* BurnGetActiveDriver();
INT32 BurnReserveExtlDrivers(UINT32 nAdditional);
UINT32 LinkExtlDrivers(struct BurnDriver* drv, UINT32* pallCount);
INT32 UnlinkExtlDriver(struct BurnDriver* drv);
extern void (*BurnLibExitHook)(void); // called first in BurnLibExit(); runtime driver modules install their teardown here
INT32 BurnDrvGetZipName(char** pszName, UINT32 i);
INT32 BurnDrvSetZipName(char* szName, INT32 i);
INT32 BurnDrvGetRomInfo(struct BurnRomInfo *pri, UINT32 i);
INT32 BurnDrvGetRomName(char** pszName, UINT32 i, INT32 nAka);
INT32 BurnDrvGetInputInfo(struct BurnInputInfo* pii, UINT32 i);
@@ -551,7 +557,6 @@ int BurnComputeSHA1(const UINT8 *buffer, int buffer_size, char *hash_str);
#define BDF_HISCORE_SUPPORTED (1 << 12)
#define BDF_RUNAHEAD_DRAWSYNC (1 << 13)
#define BDF_RUNAHEAD_DISABLED (1 << 14)
#define BDF_ROMDATA_DRIVER (1 << 15) // Driver injected at runtime from a user RomData (.dat)
// Flags for the hardware member
// Format: 0xDDEEFFFF, where DD: Manufacturer, EE: Hardware platform, FFFF: Flags (used by driver)
+1 -4
View File
@@ -17957,10 +17957,7 @@ static char* szGameName = NULL;
static void SetGameConfig()
{
// A RomData driver keeps its own short name, so match the config table on the base driver.
const char* GameName = szGameName;
if (GameName == NULL && IsRomDataDrv()) GameName = RomDataDrvGetDrvName();
if (GameName == NULL) GameName = BurnDrvGetTextA(DRV_NAME);
const char* GameName = (NULL != szGameName) ? szGameName : (((NULL != pDataRomDesc) && (-1 != pRDI->nDescCount)) ? pRDI->szDrvName : BurnDrvGetTextA(DRV_NAME));
const struct GameConfig *k = &ConfigTable[0];
while (k->DriverName) {
+17 -30
View File
@@ -3905,34 +3905,6 @@ static void SwitchToMusashi()
}
#endif
static void NeoProcessExtraRom(UINT8* rom)
{
if (!IsRomDataDrv())
return;
const char* pszExtName = RomDataDrvGetExtName();
if (!pszExtName || !pszExtName[0])
return;
UINT32 nRomCount = 0;
struct BurnRomInfo* pRomInfo = RomDataDrvGetRomInfo(&nRomCount);
if (!pRomInfo)
return;
UINT32 romLen = 0, exromLen = 0;
for (UINT32 i = 0; i < nRomCount; i++) {
const struct BurnRomInfo* pRom = &pRomInfo[i];
if (pRom->szName && 0 == strcmp(pRom->szName, pszExtName))
exromLen = pRom->nLen;
if (1 == (pRom->nType & 7)) // Neo Geo P-ROMs
romLen += pRom->nLen;
}
if (0 == exromLen || romLen <= exromLen)
return;
SekMapMemory(rom + (romLen - exromLen), 0x900000, 0x900000 + (exromLen - 1), MAP_ROM);
}
static INT32 NeoInitCommon()
{
BurnSetRefreshRate((nNeoSystemType & NEO_SYS_CD) ? NEO_CDVREFRESH : NEO_VREFRESH);
@@ -4102,7 +4074,22 @@ static INT32 NeoInitCommon()
SekMapMemory(Neo68KROMActive + (nAllCodeSize - nIpsMemExpLen[EXTR_ROM]), 0x900000, 0x900000 + (nIpsMemExpLen[EXTR_ROM] - 1), MAP_ROM);
}
// For romdata
NeoProcessExtraRom(Neo68KROMActive);
if ((NULL != pDataRomDesc) && (NULL != pRDI->szExtraRom))
{
UINT32 nRomLen = 0, nExtraRomLen = 0;
for (INT32 i = 0; i < pRDI->nDescCount; i++) {
if (1 == (pDataRomDesc[i].nType & 7)) { // P Roms
nRomLen += pDataRomDesc[i].nLen;
if (0 == strcmp(pDataRomDesc[i].szName, pRDI->szExtraRom)) { // Extra rom
nExtraRomLen = pDataRomDesc[i].nLen;
}
}
}
if ((nExtraRomLen > 0) && (nExtraRomLen < nRomLen)) {
SekMapMemory(Neo68KROMActive + (nRomLen - nExtraRomLen), 0x900000, 0x900000 + (nExtraRomLen - 1), MAP_ROM);
}
}
ZetClose();
SekClose();
@@ -4233,7 +4220,7 @@ static bool recursing = false;
INT32 NeoInit()
{
nNeo68KRAMLen = ((nNeo68KRAMHack > 0) || (nIpsDrvDefine & IPS_NEO_RAMHACK) || IsRomDataDrv()) ? 0x100000 : 0x010000;
nNeo68KRAMLen = ((nNeo68KRAMHack > 0) || (nIpsDrvDefine & IPS_NEO_RAMHACK) || (NULL != pDataRomDesc)) ? 0x100000 : 0x010000;
if (recursing) {
if (LoadRoms()) {
+1 -1
View File
@@ -847,7 +847,7 @@ INT32 pgmInit()
BurnSetRefreshRate(59.185606);
nEnableArm7 = (BurnDrvGetHardwareCode() / HARDWARE_IGS_USE_ARM_CPU) & 1;
OldCodeMode = ((HackCodeDip & 1) || (bDoIpsPatch) || IsRomDataDrv()) ? 1 : 0;
OldCodeMode = ((HackCodeDip & 1) || (bDoIpsPatch) || (NULL != pDataRomDesc)) ? 1 : 0;
if (0 == nPGMSpriteBufferHack) {
nPGMSpriteBufferHack = (nIpsDrvDefine & IPS_PGM_SPRHACK) ? 1 : 0;
+55 -48
View File
@@ -19,22 +19,6 @@
#include "dr_wav.h"
extern "C" int stb_vorbis_decode_memory(const unsigned char* mem, int len, int* channels, int* sample_rate, short** output);
// The CRT has no _t-prefixed opendir/readdir/closedir, so map them here.
#ifdef _UNICODE
#define MSU1_DIR _WDIR
#define MSU1_dirent _wdirent
#define msu1_opendir _wopendir
#define msu1_readdir _wreaddir
#define msu1_closedir _wclosedir
#else
#define MSU1_DIR DIR
#define MSU1_dirent dirent
#define msu1_opendir opendir
#define msu1_readdir readdir
#define msu1_closedir closedir
#endif
#define msu1_name(de) ((de)->d_name) // native width: narrowing mangles non-ASCII names
#if defined(BUILD_WIN32) || defined(__LIBRETRO__) || defined(__x86_64__) || defined(__i386__)
#define MSU1_USE_R8B_RESAMPLE
#endif
@@ -43,6 +27,30 @@ extern "C" int stb_vorbis_decode_memory(const unsigned char* mem, int len, int*
#include "CDSPResampler.h"
#endif
// TCHAR-aware dir ops (no _t-prefix macros exist for opendir/readdir/closedir)
#ifdef _UNICODE
#define MSU1_DIR _WDIR
#define MSU1_dirent _wdirent
#define msu1_opendir _wopendir
#define msu1_readdir _wreaddir
#define msu1_closedir _wclosedir
static void msu1_dname(const struct _wdirent* de, char* out, int outSize)
{
int i;
for (i = 0; i < outSize - 1 && de->d_name[i]; i++)
out[i] = (char)de->d_name[i];
out[i] = 0;
}
#define _T_NARROW_FMT _T("%hs") // narrow string in wide printf (MSVC only)
#else
#define MSU1_DIR DIR
#define MSU1_dirent dirent
#define msu1_opendir opendir
#define msu1_readdir readdir
#define msu1_closedir closedir
#define msu1_dname(de, out, outSize) snprintf(out, outSize, "%s", (de)->d_name)
#define _T_NARROW_FMT _T("%s")
#endif
// game short name
static TCHAR s_gameName[128] = { 0 };
@@ -96,17 +104,13 @@ static void msu1_buildDir(TCHAR* dst, INT32 dstLen)
static const char* const kAudioExts[] = { "pcm", "flac", "mp3", "wav", "ogg" };
static const INT32 kAudioExtCount = 5;
// The name stays TCHAR; only the extension is narrowed, and that is always ASCII.
static void lowerExt(const TCHAR* name, char* ext, INT32 extLen)
static void lowerExt(const char* name, char* ext, INT32 extLen)
{
ext[0] = 0;
const TCHAR* dot = _tcsrchr(name, _T('.'));
const char* dot = strrchr(name, '.');
if (dot == NULL || dot[1] == 0) return;
INT32 j = 0;
for (const TCHAR* p = dot + 1; *p && j < extLen - 1; p++) {
if (*p > 0x7f) { ext[0] = 0; return; } // not an ASCII extension
ext[j++] = (char)tolower((INT32)*p);
}
for (const char* p = dot + 1; *p && j < extLen - 1; p++) ext[j++] = (char)tolower((unsigned char)*p);
ext[j] = 0;
}
@@ -116,24 +120,24 @@ static INT32 audioExtIndex(const char* ext)
return -1;
}
static INT32 looseTrackMatch(const TCHAR* name, UINT16 track, char* extOut, INT32 extLen)
static INT32 looseTrackMatch(const char* name, UINT16 track, char* extOut, INT32 extLen)
{
char ext[16];
lowerExt(name, ext, sizeof(ext));
if (audioExtIndex(ext) < 0) return 0;
const TCHAR* dot = _tcsrchr(name, _T('.'));
const TCHAR* p = dot;
const char* dot = strrchr(name, '.');
const char* p = dot;
if (p == name) return 0;
const TCHAR* digitsEnd = dot;
const TCHAR* d = dot;
while (d > name && d[-1] >= _T('0') && d[-1] <= _T('9')) d--;
const char* digitsEnd = dot;
const char* d = dot;
while (d > name && isdigit((unsigned char)d[-1])) d--;
if (d == digitsEnd) return 0;
if (d == name || d[-1] != _T('-')) return 0;
if (d == name || d[-1] != '-') return 0;
UINT32 n = 0;
for (const TCHAR* q = d; q < digitsEnd; q++) n = n * 10u + (UINT32)(*q - _T('0'));
if (n != (UINT32)track) return 0;
unsigned long n = 0;
for (const char* q = d; q < digitsEnd; q++) n = n * 10u + (unsigned long)(*q - '0');
if (n != (unsigned long)track) return 0;
snprintf(extOut, extLen, "%s", ext);
return 1;
@@ -154,15 +158,16 @@ static INT32 resolveDataPath(TCHAR* path, INT32 pathLen)
MSU1_DIR* dp = msu1_opendir(dir);
if (dp != NULL) {
struct MSU1_dirent* de;
TCHAR found[256]; found[0] = 0;
char found[256]; found[0] = 0;
while ((de = msu1_readdir(dp)) != NULL) {
const TCHAR* dname = msu1_name(de);
char dname[256];
msu1_dname(de, dname, sizeof(dname));
char ext[16];
lowerExt(dname, ext, sizeof(ext));
if (strcmp(ext, "msu") == 0) { _sntprintf(found, ARRAY_SIZE(found), _T("%s"), dname); break; }
if (strcmp(ext, "msu") == 0) { snprintf(found, sizeof(found), "%s", dname); break; }
}
msu1_closedir(dp);
if (found[0]) { _sntprintf(path, pathLen, _T("%s/%s"), dir, found); return 1; }
if (found[0]) { _sntprintf(path, pathLen, _T("%s/") _T_NARROW_FMT, dir, found); return 1; }
}
return 0;
@@ -562,15 +567,16 @@ static INT32 backend_audioOpen(UINT16 track, MsuFile* out)
MSU1_DIR* dp = msu1_opendir(dir);
if (dp == NULL) return 0;
TCHAR foundName[256]; foundName[0] = 0;
char foundExt[16]; foundExt[0] = 0;
char foundName[256]; foundName[0] = 0;
char foundExt[16]; foundExt[0] = 0;
struct MSU1_dirent* de;
while ((de = msu1_readdir(dp)) != NULL) {
const TCHAR* dname = msu1_name(de);
char dname[256];
msu1_dname(de, dname, sizeof(dname));
char ext[16];
if (looseTrackMatch(dname, track, ext, sizeof(ext))) {
_sntprintf(foundName, ARRAY_SIZE(foundName), _T("%s"), dname);
snprintf(foundExt, sizeof(foundExt), "%s", ext);
snprintf(foundName, sizeof(foundName), "%s", dname);
snprintf(foundExt, sizeof(foundExt), "%s", ext);
break;
}
}
@@ -578,7 +584,7 @@ static INT32 backend_audioOpen(UINT16 track, MsuFile* out)
if (foundName[0]) {
TCHAR path[MAX_PATH];
_sntprintf(path, MAX_PATH, _T("%s/%s"), dir, foundName);
_sntprintf(path, MAX_PATH, _T("%s/") _T_NARROW_FMT, dir, foundName);
if (strcmp(foundExt, "pcm") == 0) {
if (stream_openInto(path, &s_pcmCtx, out)) { mem_close(&s_memCtx); return 1; }
} else {
@@ -626,14 +632,15 @@ INT32 snes_msu1_backend_detect(const TCHAR* shortName)
if (dp != NULL) {
struct MSU1_dirent* de;
while (!found && (de = msu1_readdir(dp)) != NULL) {
const TCHAR* dname = msu1_name(de);
char dname[256];
msu1_dname(de, dname, sizeof(dname));
char ext[16];
lowerExt(dname, ext, sizeof(ext));
if (audioExtIndex(ext) < 0) continue;
const TCHAR* dot = _tcsrchr(dname, _T('.'));
const TCHAR* d = dot;
while (d > dname && d[-1] >= _T('0') && d[-1] <= _T('9')) d--;
if (d != dot && d > dname && d[-1] == _T('-')) found = 1;
const char* dot = strrchr(dname, '.');
const char* d = dot;
while (d > dname && isdigit((unsigned char)d[-1])) d--;
if (d != dot && d > dname && d[-1] == '-') found = 1;
}
msu1_closedir(dp);
}
+59 -41
View File
@@ -12,29 +12,47 @@
#define STD_ROM_PICK(Name) \
static struct BurnRomInfo* Name##PickRom(UINT32 i) \
{ \
if (i >= ARRAY_SIZE(Name##RomDesc)) { \
return NULL; \
} \
return Name##RomDesc + i; \
}
#define STDROMPICKEXT(Name, Info1, Info2) \
static struct BurnRomInfo* Name##PickRom(UINT32 i) \
{ \
if (i >= 0x80) { \
i &= 0x7F; \
if (i >= ARRAY_SIZE(Info2##RomDesc)) { \
if ((NULL != pDataRomDesc) && (-1 != pRDI->nDescCount)) { \
/* Replace with the contents of Romdata */ \
/* Differences in array pointers */ \
if (i > pRDI->nDescCount) { \
return NULL; \
} \
return Info2##RomDesc + i; \
return pDataRomDesc + i; \
} else { \
if (i >= ARRAY_SIZE(Info1##RomDesc)) { \
return emptyRomDesc + 0; \
if (i >= sizeof(Name##RomDesc) / sizeof(Name##RomDesc[0])) { \
return NULL; \
} \
return Info1##RomDesc + i; \
return Name##RomDesc + i; \
} \
}
#define STDROMPICKEXT(Name, Info1, Info2) \
static struct BurnRomInfo* Name##PickRom(UINT32 i) \
{ \
if (i >= 0x80) { \
i &= 0x7F; \
if (i >= sizeof(Info2##RomDesc) / sizeof(Info2##RomDesc[0])) { \
return NULL; \
} \
return Info2##RomDesc + i; \
} else { \
if ((NULL != pDataRomDesc) && (-1 != pRDI->nDescCount)) { \
/* Replace with the contents of Romdata */ \
/* Differences in array pointers */ \
if (i > pRDI->nDescCount) { \
return emptyRomDesc + 0; \
} \
return pDataRomDesc + i; \
} else { \
if (i >= sizeof(Info1##RomDesc) / sizeof(Info1##RomDesc[0])) { \
return emptyRomDesc + 0; \
} \
return Info1##RomDesc + i; \
} \
} \
}
// Standard rom functions for returning Length, Crc, Type and one one Name
#define STD_ROM_FN(Name) \
static INT32 Name##RomInfo(struct BurnRomInfo* pri, UINT32 i) \
@@ -67,7 +85,7 @@ static INT32 Name##RomName(char** pszName, UINT32 i, INT32 nAka) \
#define STDINPUTINFO(Name) \
static INT32 Name##InputInfo(struct BurnInputInfo* pii, UINT32 i) \
{ \
if (i >= ARRAY_SIZE(Name##InputList)) { \
if (i >= sizeof(Name##InputList) / sizeof(Name##InputList[0])) { \
return 1; \
} \
if (pii) { \
@@ -79,7 +97,7 @@ static INT32 Name##InputInfo(struct BurnInputInfo* pii, UINT32 i) \
#define STDINPUTINFOSPEC(Name, Info1) \
static INT32 Name##InputInfo(struct BurnInputInfo* pii, UINT32 i) \
{ \
if (i >= ARRAY_SIZE(Info1)) { \
if (i >= sizeof(Info1) / sizeof(Info1[0])) { \
return 1; \
} \
if (pii) { \
@@ -88,29 +106,29 @@ static INT32 Name##InputInfo(struct BurnInputInfo* pii, UINT32 i) \
return 0; \
}
#define STDINPUTINFOEXT(Name, Info1, Info2) \
static INT32 Name##InputInfo(struct BurnInputInfo* pii, UINT32 i) \
{ \
if (i >= ARRAY_SIZE(Info1##InputList)) { \
i -= ARRAY_SIZE(Info1##InputList); \
if (i >= ARRAY_SIZE(Info2##InputList)) { \
return 1; \
} \
if (pii) { \
*pii = Info2##InputList[i]; \
} \
return 0; \
} \
if (pii) { \
*pii = Info1##InputList[i]; \
} \
return 0; \
#define STDINPUTINFOEXT(Name, Info1, Info2) \
static INT32 Name##InputInfo(struct BurnInputInfo* pii, UINT32 i) \
{ \
if (i >= sizeof(Info1##InputList) / sizeof(Info1##InputList[0])) { \
i -= sizeof(Info1##InputList) / sizeof(Info1##InputList[0]); \
if (i >= sizeof(Info2##InputList) / sizeof(Info2##InputList[0])) { \
return 1; \
} \
if (pii) { \
*pii = Info2##InputList[i]; \
} \
return 0; \
} \
if (pii) { \
*pii = Info1##InputList[i]; \
} \
return 0; \
}
#define STDDIPINFO(Name) \
static INT32 Name##DIPInfo(struct BurnDIPInfo* pdi, UINT32 i) \
{ \
if (i >= ARRAY_SIZE(Name##DIPList)) { \
if (i >= sizeof(Name##DIPList) / sizeof(Name##DIPList[0])) { \
return 1; \
} \
if (pdi) { \
@@ -122,9 +140,9 @@ static INT32 Name##DIPInfo(struct BurnDIPInfo* pdi, UINT32 i) \
#define STDDIPINFOEXT(Name, Info1, Info2) \
static INT32 Name##DIPInfo(struct BurnDIPInfo* pdi, UINT32 i) \
{ \
if (i >= ARRAY_SIZE(Info1##DIPList)) { \
i -= ARRAY_SIZE(Info1##DIPList); \
if (i >= ARRAY_SIZE(Info2##DIPList)) { \
if (i >= sizeof(Info1##DIPList) / sizeof(Info1##DIPList[0])) { \
i -= sizeof(Info1##DIPList) / sizeof(Info1##DIPList[0]); \
if (i >= sizeof(Info2##DIPList) / sizeof(Info2##DIPList[0])) { \
return 1; \
} \
if (pdi) { \
@@ -142,7 +160,7 @@ static INT32 Name##DIPInfo(struct BurnDIPInfo* pdi, UINT32 i) \
#define STD_SAMPLE_PICK(Name) \
static struct BurnSampleInfo* Name##PickSample(UINT32 i) \
{ \
if (i >= ARRAY_SIZE(Name##SampleDesc)) { \
if (i >= sizeof(Name##SampleDesc) / sizeof(Name##SampleDesc[0])) { \
return NULL; \
} \
return Name##SampleDesc + i; \
@@ -178,7 +196,7 @@ static INT32 Name##SampleName(char** pszName, UINT32 i, INT32 nAka) \
#define STD_HDD_PICK(Name) \
static struct BurnHDDInfo* Name##PickHDD(UINT32 i) \
{ \
if (i >= ARRAY_SIZE(Name##HDDDesc)) { \
if (i >= sizeof(Name##HDDDesc) / sizeof(Name##HDDDesc[0])) { \
return NULL; \
} \
return Name##HDDDesc + i; \
+7 -2
View File
@@ -26,7 +26,6 @@
#include "title.h"
#include "burn.h"
#include "joyprocess.h"
#include "romdata_core.h" // platform-independent RomData (.dat) core: RomDataScan/Free/LoadOne
// ---------------------------------------------------------------------------
// OS dependent functionality
@@ -265,7 +264,13 @@ INT32 ZipGetList(struct ZipEntry** pList, INT32* pnListCount);
INT32 ZipLoadFile(UINT8* Dest, INT32 nLen, INT32* pnWrote, INT32 nEntry);
INT32 __cdecl ZipLoadOneFile(char* arcName, const char* fileName, void** Dest, INT32* pnWrote);
// ips_manager.cpp
// romdata.cpp
extern TCHAR szRomdataName[MAX_PATH];
TCHAR* AdaptiveEncodingReads(const TCHAR* pszFileName);
// ips_manager.cpp
void IpsPatchInit();
void IpsPatchExit();
+93 -350
View File
@@ -2,266 +2,6 @@
#include "burner.h"
#include "neocdlist.h"
// New-style text loading: read entire file into memory, auto-detect encoding,
// convert to TCHAR text in-memory (no CRT ccs mode, no in-place disk rewriting).
enum ConcEncoding {
CONC_ENC_ANSI = 0,
CONC_ENC_UTF8,
CONC_ENC_UTF8_BOM,
CONC_ENC_UTF16_LE,
CONC_ENC_UTF16_BE,
CONC_ENC_UTF16_LE_NOBOM,
};
static bool conc_is_valid_utf8(const UINT8* buf, size_t len)
{
size_t p = 0;
while (p < len) {
UINT8 c = buf[p];
if (c == 0x00)
return false;
if (c < 0x80) {
p++;
continue;
}
INT32 nExtra;
if (c >= 0xc2 && c <= 0xdf)
nExtra = 1;
else if (c >= 0xe0 && c <= 0xef)
nExtra = 2;
else if (c >= 0xf0 && c <= 0xf4)
nExtra = 3;
else
return false;
for (INT32 i = 1; i <= nExtra; i++) {
if (p + (size_t)i >= len || (buf[p + i] & 0xc0) != 0x80)
return false;
}
p += nExtra + 1;
}
return true;
}
static UINT8* conc_read_all(FILE* fp, size_t* pLen)
{
if (!fp || !pLen)
return NULL;
*pLen = 0;
#ifdef BUILD_WIN32
if (_fseeki64(fp, 0, SEEK_END) != 0)
return NULL;
INT64 nSize = _ftelli64(fp);
if (nSize < 0 || (UINT64)nSize > (UINT64)SIZE_MAX - 1 || _fseeki64(fp, 0, SEEK_SET) != 0)
return NULL;
#else
if (fseeko(fp, 0, SEEK_END) != 0)
return NULL;
INT64 nSize = (INT64)ftello(fp);
if (nSize < 0 || (UINT64)nSize > (UINT64)SIZE_MAX - 1 || fseeko(fp, 0, SEEK_SET) != 0)
return NULL;
#endif
UINT8* buf = (UINT8*)malloc((size_t)nSize + 1);
if (!buf)
return NULL;
size_t got = fread(buf, 1, (size_t)nSize, fp);
if (got != (size_t)nSize || ferror(fp)) {
free(buf);
return NULL;
}
buf[got] = 0;
*pLen = got;
return buf;
}
static bool conc_is_utf16le_nobom(const UINT8* buf, size_t len)
{
if (!buf || len < 2 || (len & 1) || buf[0] == 0 || buf[1] != 0)
return false;
#ifdef BUILD_WIN32
INT32 nFlags = IS_TEXT_UNICODE_STATISTICS;
return IsTextUnicode(buf, (INT32)(len > INT_MAX ? INT_MAX : len), &nFlags) != 0;
#else
size_t units = len / 2;
size_t zeroHigh = 0;
for (size_t i = 0; i < units; i++) {
if (buf[i * 2 + 1] == 0)
zeroHigh++;
}
return zeroHigh * 4 >= units * 3;
#endif
}
static ConcEncoding conc_detect_encoding(const UINT8* buf, size_t len)
{
if (len >= 2 && buf[0] == 0xfe && buf[1] == 0xff)
return CONC_ENC_UTF16_BE;
if (len >= 2 && buf[0] == 0xff && buf[1] == 0xfe)
return CONC_ENC_UTF16_LE;
if (len >= 3 && buf[0] == 0xef && buf[1] == 0xbb && buf[2] == 0xbf)
return CONC_ENC_UTF8_BOM;
if (conc_is_utf16le_nobom(buf, len))
return CONC_ENC_UTF16_LE_NOBOM;
return conc_is_valid_utf8(buf, len) ? CONC_ENC_UTF8 : CONC_ENC_ANSI;
}
// Read entire file into a malloc'd TCHAR buffer (UTF-8→TCHAR on non-Win32;
// UTF-8→UTF-16 wchar_t on Win32 _UNICODE). Caller must free().
static TCHAR* conc_load_text(const TCHAR* pszFileName)
{
FILE* fp = _tfopen(pszFileName, _T("rb"));
if (!fp)
return NULL;
size_t len = 0;
UINT8* raw = conc_read_all(fp, &len);
fclose(fp);
if (!raw)
return NULL;
ConcEncoding enc = conc_detect_encoding(raw, len);
#if defined(BUILD_WIN32) && defined(_UNICODE)
if (enc == CONC_ENC_ANSI) {
if (len > INT_MAX) {
free(raw);
return NULL;
}
INT32 wn = MultiByteToWideChar(CP_ACP, 0, (char*)raw, (INT32)len, NULL, 0);
if (wn <= 0) {
free(raw);
return NULL;
}
wchar_t* w = (wchar_t*)malloc((size_t)(wn + 1) * sizeof(wchar_t));
if (!w) {
free(raw);
return NULL;
}
MultiByteToWideChar(CP_ACP, 0, (char*)raw, (INT32)len, w, wn);
w[wn] = 0;
free(raw);
return (TCHAR*)w;
}
#else
if (enc == CONC_ENC_ANSI)
return (TCHAR*)raw;
#endif
char* u8;
if (enc == CONC_ENC_UTF8) {
u8 = (char*)raw;
} else if (enc == CONC_ENC_UTF8_BOM) {
memmove(raw, raw + 3, len - 3 + 1);
u8 = (char*)raw;
} else {
size_t start = (enc == CONC_ENC_UTF16_LE_NOBOM) ? 0 : 2;
if (len < start || ((len - start) & 1)) {
free(raw);
return NULL;
}
size_t units = (len - start) / 2;
if (units > (SIZE_MAX - 1) / 3) {
free(raw);
return NULL;
}
u8 = (char*)malloc(units * 3 + 1);
if (!u8) {
free(raw);
return NULL;
}
size_t o = 0;
for (size_t i = 0; i < units; i++) {
UINT8 b0 = raw[start + i * 2 + 0];
UINT8 b1 = raw[start + i * 2 + 1];
UINT32 cp = (enc == CONC_ENC_UTF16_BE) ? (UINT32)(b1 | (b0 << 8)) : (UINT32)(b0 | (b1 << 8));
if (cp >= 0xd800 && cp < 0xdc00) {
if (++i >= units) {
free(u8);
free(raw);
return NULL;
}
b0 = raw[start + i * 2 + 0];
b1 = raw[start + i * 2 + 1];
UINT32 low = (enc == CONC_ENC_UTF16_BE) ? (UINT32)(b1 | (b0 << 8)) : (UINT32)(b0 | (b1 << 8));
if (low < 0xdc00 || low >= 0xe000) {
free(u8);
free(raw);
return NULL;
}
cp = 0x10000 + ((cp & 0x3ff) << 10) + (low & 0x3ff);
} else if (cp >= 0xdc00 && cp < 0xe000) {
free(u8);
free(raw);
return NULL;
}
if (cp < 0x80) {
u8[o++] = (char)cp;
} else if (cp < 0x800) {
u8[o++] = (char)(0xc0 | (cp >> 6));
u8[o++] = (char)(0x80 | (cp & 0x3f));
} else if (cp < 0x10000) {
u8[o++] = (char)(0xe0 | (cp >> 12));
u8[o++] = (char)(0x80 | ((cp >> 6) & 0x3f));
u8[o++] = (char)(0x80 | (cp & 0x3f));
} else {
u8[o++] = (char)(0xf0 | (cp >> 18));
u8[o++] = (char)(0x80 | ((cp >> 12) & 0x3f));
u8[o++] = (char)(0x80 | ((cp >> 6) & 0x3f));
u8[o++] = (char)(0x80 | (cp & 0x3f));
}
}
u8[o] = 0;
free(raw);
}
#ifdef _UNICODE
INT32 wn = MultiByteToWideChar(CP_UTF8, 0, u8, -1, NULL, 0);
if (wn <= 0) {
free(u8);
return NULL;
}
wchar_t* w = (wchar_t*)malloc((size_t)wn * sizeof(wchar_t));
if (!w) {
free(u8);
return NULL;
}
MultiByteToWideChar(CP_UTF8, 0, u8, -1, w, wn);
free(u8);
return (TCHAR*)w;
#else
// Non-Win32 TCHAR = char: UTF-8 is directly usable
return (TCHAR*)u8;
#endif
}
// In-memory replacement for _fgetts: copies next line (up to \n inclusive)
// into szLine, null-terminates. *ppSave is advanced. Returns szLine or NULL at EOF.
static TCHAR* conc_gets(TCHAR* szLine, INT32 nMaxLen, const TCHAR* pText, TCHAR** ppSave)
{
TCHAR* p = *ppSave ? *ppSave : (TCHAR*)pText;
if (!p || *p == _T('\0'))
return NULL;
INT32 i = 0;
while (i < nMaxLen - 1 && *p && *p != _T('\n')) {
szLine[i++] = *p++;
}
if (*p == _T('\n') && i < nMaxLen - 1) {
szLine[i++] = *p++;
}
szLine[i] = _T('\0');
*ppSave = p;
return szLine;
}
// GameGenie stuff is handled a little differently..
#define HW_NES ( ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_NES) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_FDS) )
#define HW_SNES ( ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SNES) )
@@ -329,14 +69,14 @@ static TCHAR* getFilenameFromPath(TCHAR* path) {
return NULL;
}
TCHAR* filename = path;
TCHAR* filename = path;
for (TCHAR* p = path; *p != '\0'; p++) {
if (*p == '/' || *p == '\\') {
filename = p + 1;
}
}
return filename;
for (TCHAR* p = path; *p != '\0'; p++) {
if (*p == '/' || *p == '\\') {
filename = p + 1;
}
}
return filename;
}
static void CheatLinkNewNode(TCHAR *szDerp)
@@ -366,7 +106,7 @@ static void CheatLinkNewNode(TCHAR *szDerp)
static INT32 ConfigParseFile(TCHAR* pszFilename)
{
#define INSIDE_NOTHING (0xffff & (1 << ((sizeof(TCHAR) * 8) - 1)))
#define INSIDE_NOTHING (0xFFFF & (1 << ((sizeof(TCHAR) * 8) - 1)))
TCHAR szLine[8192];
TCHAR* s;
@@ -377,31 +117,38 @@ static INT32 ConfigParseFile(TCHAR* pszFilename)
INT32 nLine = 0;
TCHAR nInside = INSIDE_NOTHING;
TCHAR* text = conc_load_text(pszFilename);
TCHAR* pszReadMode = AdaptiveEncodingReads(pszFilename);
if (NULL == pszReadMode) pszReadMode = _T("rt");
FILE* h = _tfopen(pszFilename, pszReadMode);
TCHAR* pszFileHeading = getFilenameFromPath(pszFilename);
if (text == NULL) {
if (h == NULL) {
if ((BurnDrvGetFlags() & BDF_CLONE) && BurnDrvGetText(DRV_PARENT)) {
TCHAR szAlternative[MAX_PATH] = { 0 };
_stprintf(szAlternative, _T("%s%s.ini"), szAppCheatsPath, BurnDrvGetText(DRV_PARENT));
text = conc_load_text(szAlternative);
if (text == NULL)
pszReadMode = AdaptiveEncodingReads(szAlternative);
if (NULL == pszReadMode) pszReadMode = _T("rt");
if (NULL == (h = _tfopen(szAlternative, pszReadMode)))
return 1;
pszFileHeading = getFilenameFromPath(szAlternative);
} else {
return 1;
return 1; // Parent driver
}
}
TCHAR* save = NULL;
while (conc_gets(szLine, 8192, text, &save) != NULL) {
while (1) {
if (_fgetts(szLine, 8192, h) == NULL) {
break;
}
nLine++;
nLen = _tcslen(szLine);
// Get rid of the linefeed at the end
while ((nLen > 0) && (szLine[nLen - 1] == 0x0a || szLine[nLen - 1] == 0x0d)) {
while ((nLen > 0) && (szLine[nLen - 1] == 0x0A || szLine[nLen - 1] == 0x0D)) {
szLine[nLen - 1] = 0;
nLen--;
}
@@ -627,7 +374,9 @@ static INT32 ConfigParseFile(TCHAR* pszFilename)
}
free(text);
if (h) {
fclose(h);
}
return 0;
}
@@ -636,19 +385,24 @@ static INT32 ConfigParseFile(TCHAR* pszFilename)
//TODO: make cross platform
static INT32 ConfigParseNebulaFile(TCHAR* pszFilename)
{
TCHAR* text = conc_load_text(pszFilename);
TCHAR* pszReadMode = AdaptiveEncodingReads(pszFilename);
if (NULL == pszReadMode) pszReadMode = _T("rt");
FILE *fp = _tfopen(pszFilename, pszReadMode);
TCHAR* pszFileHeading = getFilenameFromPath(pszFilename);
if (text == NULL) {
if (fp == NULL) {
if ((BurnDrvGetFlags() & BDF_CLONE) && BurnDrvGetText(DRV_PARENT)) {
TCHAR szAlternative[MAX_PATH] = { 0 };
_stprintf(szAlternative, _T("%s%s.dat"), szAppCheatsPath, BurnDrvGetText(DRV_PARENT));
text = conc_load_text(szAlternative);
if (text == NULL)
pszReadMode = AdaptiveEncodingReads(szAlternative);
if (NULL == pszReadMode) pszReadMode = _T("rt");
if (NULL == (fp = _tfopen(szAlternative, pszReadMode)))
return 1;
pszFileHeading = getFilenameFromPath(szAlternative);
} else {
return 1;
return 1; // Parent driver
}
}
@@ -658,18 +412,14 @@ static INT32 ConfigParseNebulaFile(TCHAR* pszFilename)
TCHAR szLine[1024];
bool bFirst = true;
TCHAR* save = NULL;
while (conc_gets(szLine, 1024, text, &save) != NULL)
while (1)
{
if (_fgetts(szLine, 1024, fp) == NULL)
break;
nLen = _tcslen(szLine);
while ((nLen > 0) && (szLine[nLen - 1] == 0x0a || szLine[nLen - 1] == 0x0d)) {
szLine[nLen - 1] = 0;
nLen--;
}
if (nLen < 3 || szLine[0] == '[')
continue;
if (nLen < 3 || szLine[0] == '[') continue;
if (!_tcsncmp (_T("Name="), szLine, 5))
{
@@ -766,14 +516,14 @@ static INT32 ConfigParseNebulaFile(TCHAR* pszFilename)
n++;
}
free(text);
fclose (fp);
return 0;
}
#define IS_MIDWAY ((BurnDrvGetHardwareCode() & HARDWARE_PREFIX_MIDWAY) == HARDWARE_PREFIX_MIDWAY)
static INT32 ConfigParseMAMEFile_internal(const TCHAR *pText, const TCHAR *pszFileHeading, const TCHAR *name)
static INT32 ConfigParseMAMEFile_internal(FILE *fz, const TCHAR *pszFileHeading, const TCHAR *name)
{
#define AddressInfo() \
INT32 k = (flags >> 20) & 3; \
@@ -832,17 +582,18 @@ static INT32 ConfigParseMAMEFile_internal(const TCHAR *pText, const TCHAR *pszFi
_stprintf(gName, _T(":%s:"), name);
TCHAR* save = NULL;
while (conc_gets(szLine, 1024, pText, &save) != NULL)
while (1)
{
if (_fgetts(szLine, 1024, fz) == NULL)
break;
nLen = _tcslen (szLine);
if (szLine[0] == ';')
continue;
if (szLine[0] == ';') continue;
/*
// find the cheat flags & 0x80000000 cheats (for debugging) -dink
INT32 derpy = 0;
int derpy = 0;
for (INT32 i = 0; i < nLen; i++) {
if (szLine[i] == ':') {
derpy++;
@@ -858,10 +609,8 @@ static INT32 ConfigParseMAMEFile_internal(const TCHAR *pText, const TCHAR *pszFi
#else
if (_tcsncmp (szLine, gName, strlen(gName))) {
#endif
if (nFound)
break;
else
continue;
if (nFound) break;
else continue;
}
if (_tcsstr(szLine, _T("----:REASON"))) {
@@ -910,8 +659,7 @@ static INT32 ConfigParseMAMEFile_internal(const TCHAR *pText, const TCHAR *pszFi
// & 0x4000 = don't add to list
// & 0x0800 = BCD
if (flags & 0x00004800)
continue; // skip various cheats (unhandled methods at this time)
if (flags & 0x00004800) continue; // skip various cheats (unhandled methods at this time)
if ((flags & 0xff000000) == 0x39000000 && IS_MIDWAY) {
nAddress |= 0xff800000 >> 3; // 0x39 = address is relative to system's ROM block, only midway uses this kinda cheats
@@ -988,8 +736,7 @@ static INT32 ConfigParseMAMEFile_internal(const TCHAR *pText, const TCHAR *pszFi
INT32 nStartValue = (flags & 0x400) ? 1 : 0; // starting value
//bprintf(0, _T("adding .. %X. options\n"), nTotal);
if (nTotal > 0xff)
continue; // bad entry (roughrac has this)
if (nTotal > 0xff) continue; // bad entry (roughrac has this)
for (nValue = nStartValue; nValue < nTotal; nValue++) {
#if defined(UNICODE)
swprintf(tmp2, L"# %d.", nValue + nPlus1);
@@ -1059,19 +806,17 @@ static INT32 ConfigParseMAMEFile_internal(const TCHAR *pText, const TCHAR *pszFi
}
// if no cheat was found, don't return success code
if (pCurrentCheat == NULL)
return 1;
if (pCurrentCheat == NULL) return 1;
return 0;
}
static INT32 ConfigParseMAMEFile(INT32 is_wayder)
static INT32 ConfigParseMAMEFile(int is_wayder)
{
TCHAR szFileName[MAX_PATH] = _T("");
if (is_wayder) {
if (HW_NES || HW_SNES)
return 1;
if (HW_NES || HW_SNES) return 1;
_stprintf(szFileName, _T("%swayder_cheat.dat"), szAppCheatsPath);
} else {
if (HW_NES) {
@@ -1083,32 +828,35 @@ static INT32 ConfigParseMAMEFile(INT32 is_wayder)
}
}
TCHAR* text = conc_load_text(szFileName);
TCHAR* pszReadMode = AdaptiveEncodingReads(szFileName);
if (NULL == pszReadMode) pszReadMode = _T("rt");
FILE *fz = _tfopen(szFileName, pszReadMode);
TCHAR* pszFileHeading = getFilenameFromPath(szFileName);
INT32 ret = 1;
if (text) {
ret = ConfigParseMAMEFile_internal(text, pszFileHeading, BurnDrvGetText(DRV_NAME));
// try parent entry as fallback
if (fz) {
ret = ConfigParseMAMEFile_internal(fz, pszFileHeading, BurnDrvGetText(DRV_NAME));
// let's try using parent entry as a fallback if no cheat was found for this romset
if (ret && (BurnDrvGetFlags() & BDF_CLONE) && BurnDrvGetText(DRV_PARENT)) {
ret = ConfigParseMAMEFile_internal(text, pszFileHeading, BurnDrvGetText(DRV_PARENT));
fseek(fz, 0, SEEK_SET);
ret = ConfigParseMAMEFile_internal(fz, pszFileHeading, BurnDrvGetText(DRV_PARENT));
}
free(text);
fclose(fz);
}
return ret;
}
static INT32 encodeNES(INT32 address, INT32 value, INT32 compare, char *result)
{
static int encodeNES(int address, int value, int compare, char *result) {
const char ALPHABET_NES[2][16+1] = { { "APZLGITYEOXUKSVN" }, { "apzlgityeoxuksvn" } };
bool address_lower = !(address & 0x8000);
UINT32 genie = ((value & 0x80) >> 4) | (value & 0x7);
UINT32 temp = ((address & 0x80) >> 4) | ((value & 0x70) >> 4);
unsigned int genie = ((value & 0x80) >> 4) | (value & 0x7);
unsigned int temp = ((address & 0x80) >> 4) | ((value & 0x70) >> 4);
genie <<= 4;
genie |= temp;
@@ -1150,8 +898,8 @@ static INT32 encodeNES(INT32 address, INT32 value, INT32 compare, char *result)
result[6] = result[7] = result[8] = 0;
for (INT32 i = 0; i < ((compare != -1) ? 8 : 6); i++) {
result[((compare != -1) ? 8 : 6) - 1 - i] = ALPHABET_NES[address_lower][(genie >> (i * 4)) & 0x0f];
for (int i = 0; i < ((compare != -1) ? 8 : 6); i++) {
result[((compare != -1) ? 8 : 6) - 1 - i] = ALPHABET_NES[address_lower][(genie >> (i * 4)) & 0xF];
}
return 0;
@@ -1188,34 +936,36 @@ static INT32 ConfigParseVCT(TCHAR* pszFilename)
bool bFirst = true;
TCHAR* text = conc_load_text(pszFilename);
TCHAR* pszReadMode = AdaptiveEncodingReads(pszFilename);
if (NULL == pszReadMode) pszReadMode = _T("rt");
FILE* h = _tfopen(pszFilename, pszReadMode);
TCHAR* pszFileHeading = getFilenameFromPath(pszFilename);
if (text == NULL) {
if (h == NULL) {
if ((BurnDrvGetFlags() & BDF_CLONE) && BurnDrvGetText(DRV_PARENT)) {
TCHAR szAlternative[MAX_PATH] = { 0 };
_stprintf(szAlternative, _T("%s%s.vct"), szAppCheatsPath, BurnDrvGetText(DRV_PARENT));
text = conc_load_text(szAlternative);
if (text == NULL)
pszReadMode = AdaptiveEncodingReads(szAlternative);
if (NULL == pszReadMode) pszReadMode = _T("rt");
if (NULL == (h = _tfopen(szAlternative, pszReadMode)))
return 1;
pszFileHeading = getFilenameFromPath(szAlternative);
} else {
return 1;
return 1; // Parent driver
}
}
TCHAR* save = NULL;
while (conc_gets(szLine, 1024, text, &save) != NULL)
while (1)
{
if (_fgetts(szLine, 1024, h) == NULL)
break;
nLen = _tcslen (szLine);
while ((nLen > 0) && (szLine[nLen - 1] == 0x0a || szLine[nLen - 1] == 0x0d)) {
szLine[nLen - 1] = 0;
nLen--;
}
if (szLine[0] == ';')
continue;
if (szLine[0] == ';') continue;
INT32 c0[16], c1 = 0, cprev = 0; // find columns / break
for (INT32 i = 0; i < nLen; i++)
@@ -1242,22 +992,18 @@ static INT32 ConfigParseVCT(TCHAR* pszFilename)
// split up "0077-01-FF" format: "address-[attribute][bytecount]-bytes_to_program"
char *tok = strtok(temp2, "-");
if (!tok)
continue;
if (!tok) continue;
sscanf(tok, "%x", &fAddr);
tok = strtok(NULL, "-");
if (!tok)
continue;
if (!tok) continue;
sscanf(tok, "%x", &fCount);
fAttr = (fCount & 0x30) >> 4;
fCount &= 0x07;
if (fCount < 1 || fCount > 4)
fCount = 1;
if (fCount < 1 || fCount > 4) fCount = 1;
tok = strtok(NULL, "-");
if (!tok)
continue;
if (!tok) continue;
sscanf(tok, "%x", &fBytes);
//bprintf(0, _T(".vct: addr[%x] count[%x] bytes[%x]\n"), fAddr, fCount, fBytes);
@@ -1285,7 +1031,7 @@ static INT32 ConfigParseVCT(TCHAR* pszFilename)
n++;
OptionName(_T("Enabled"));
for (INT32 i = 0; i < fCount; i++) {
for (int i = 0; i < fCount; i++) {
memset(szGGenie, 0, sizeof(szGGenie));
encodeNES(fAddr + i, fBytes >> (i*8), -1, szGGenie);
INT32 cLen = strlen(szGGenie);
@@ -1297,11 +1043,8 @@ static INT32 ConfigParseVCT(TCHAR* pszFilename)
continue;
}
free(text);
// if no cheat was found, don't return success code
if (pCurrentCheat == NULL)
return 1;
if (pCurrentCheat == NULL) return 1;
return 0;
}
+5
View File
@@ -114,3 +114,8 @@ void SDL_Delay(unsigned int ms)
now = SDL_GetTicks();
} while (stop > now);
}
TCHAR* AdaptiveEncodingReads(const TCHAR* pszFileName)
{
return NULL;
}
-1
View File
@@ -8,7 +8,6 @@ fbneo_burner_sources = [
'inputbuf.cpp',
'ioapi.c',
'misc.cpp',
'romdata_core.cpp',
'sshot.cpp',
'state.cpp',
'statec.cpp',
+5
View File
@@ -2,6 +2,11 @@
#include <sys/stat.h>
#include <unistd.h>
TCHAR* AdaptiveEncodingReads(const TCHAR* pszFileName)
{
return NULL;
}
extern int nExitEmulator;
extern int nEnableFreeplayHack;
+1
View File
@@ -9,6 +9,7 @@ frontend_sources = files(
'../sdl/ips_manager.cpp',
'../sdl/media.cpp',
'../sdl/replay.cpp',
'../sdl/romdata.cpp',
'../sdl/scrn.cpp',
'../sdl/stated.cpp',
'../sdl/stringset.cpp',
File diff suppressed because it is too large. Load diff
-32
View File
@@ -1,32 +0,0 @@
// =============================================================================
// FBNeo - RomData core (platform-independent)
// =============================================================================
#pragma once
#ifndef ROMDATA_CORE_H
#define ROMDATA_CORE_H
#ifdef __cplusplus
extern "C" {
#endif
void RomDataScan(const TCHAR* szDir, const TCHAR* szCachePath);
void RomDataScanAppend(const TCHAR* szDir, const TCHAR* szCachePath);
void RomDataFree(void);
INT32 RomDataIdentify(const TCHAR* szDatPath, char* szShortName, INT32 nShortNameLen);
INT32 RomDataLoadOne(const TCHAR* szDatPath);
INT32 RomDataCopyOne(const TCHAR* szDatPath, const TCHAR* szDestDir);
INT32 RomDataImportOne(const TCHAR* szDatPath, const TCHAR* szDestDir);
void RomDataImportDirectory(const TCHAR* szDir, const TCHAR* szDestDir);
bool IsRomDataDrv(void);
char* RomDataDrvGetDrvName(void);
struct BurnRomInfo* RomDataDrvGetRomInfo(UINT32* pRomCount);
const char* RomDataDrvGetExtName(void);
#ifdef __cplusplus
}
#endif
#endif // ROMDATA_CORE_H
+5
View File
@@ -275,6 +275,11 @@ void bye(void)
SDL_Quit();
}
TCHAR* AdaptiveEncodingReads(const TCHAR* pszFileName)
{
return NULL;
}
static int __cdecl AppDebugPrintf(int nStatus, TCHAR* pszFormat, ...)
{
+1
View File
@@ -10,6 +10,7 @@ frontend_sources = files(
'media.cpp',
'../cdlist.cpp',
'replay.cpp',
'romdata.cpp',
'run.cpp',
'scrn.cpp',
'sdl2_gui.cpp',
+45 -10
View File
@@ -248,7 +248,7 @@ BEGIN
CONTROL BMP_ABOUT,IDC_STATIC,"Static",SS_BITMAP | SS_REALSIZEIMAGE | SS_SUNKEN,3,3,100,50
CONTROL "version",IDC_FBA_VER,"Static",SS_OWNERDRAW | WS_GROUP,83,65,269,10
CONTROL "specialbuild",IDC_SPECIALSTRING,"Static",SS_OWNERDRAW | WS_GROUP,83,73,269,10
LTEXT "FB Neo contains parts of MAME && Final Burn.\n� 2004-2026, Team FBNeo.",IDC_STATIC,6,88,235,16,WS_DISABLED
LTEXT "FB Neo contains parts of MAME && Final Burn.\n© 2004-2026, Team FBNeo.",IDC_STATIC,6,88,235,16,WS_DISABLED
DEFPUSHBUTTON "OK",IDOK,305,90,50,14
PUSHBUTTON "License",IDC_SHOWLICENSE,251,90,50,14
CONTROL "",IDC_LICENSE,"RICHEDIT20A",ES_MULTILINE | ES_READONLY | WS_VSCROLL | ES_NOIME,3,109,353,77, WS_EX_STATICEDGE | ES_EX_NOCALLOLEINIT
@@ -1043,6 +1043,43 @@ BEGIN
PUSHBUTTON "Edit",IDC_BUTTON_LUAEDIT,58,31,46,16
END
IDD_ROMDATA_MANAGER DIALOGEX 0, 0, 520, 291
STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "ROMDATA Manager"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
CONTROL "",IDC_ROMDATA_LIST,"SysListView32",LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,11,348,223
DEFPUSHBUTTON "Play",IDC_ROMDATA_PLAY_BUTTON,445,272,71,14
PUSHBUTTON "Cancel",IDC_ROMDATA_CANCEL_BUTTON,370,272,71,14
PUSHBUTTON "Scan Dats",IDC_ROMDATA_SCAN_BUTTON,366,236,71,14
PUSHBUTTON "Directories...",IDC_ROMDATA_SELDIR_BUTTON,441,236,71,14
CONTROL "Scan sub-dirs",IDC_ROMDATA_SUBDIR_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,367,255,120,10
GROUPBOX "Select Game",IDC_STATIC1,3,1,356,285
GROUPBOX "Title",IDC_STATIC2,362,1,155,111
GROUPBOX "Preview",IDC_STATIC3,362,115,155,111
CONTROL "",IDC_STATIC_INFOBOX,"Static",SS_WHITERECT | SS_SUNKEN,7,236,348,45
GROUPBOX "Options",IDC_STATIC,362,226,155,43
CONTROL "",IDC_ROMDATA_TITLE,"Static",SS_BITMAP | SS_NOTIFY,368,10,22,19,WS_EX_CLIENTEDGE
CONTROL "",IDC_ROMDATA_PREVIEW,"Static",SS_BITMAP | SS_NOTIFY,368,124,22,15,WS_EX_CLIENTEDGE
CONTROL "",IDC_ROMDATA_TITLE_FRAME,"Static",SS_BITMAP | NOT WS_VISIBLE,368,10,22,19,WS_EX_CLIENTEDGE
CONTROL "",IDC_ROMDATA_PREVIEW_FRAME,"Static",SS_BITMAP | NOT WS_VISIBLE,368,124,22,15,WS_EX_CLIENTEDGE
LTEXT "Dat path:",IDC_ROMDATA_LABELDAT,13,240,64,8,NOT WS_GROUP
LTEXT "Driver:",IDC_ROMDATA_LABELDRIVER,13,254,64,8,NOT WS_GROUP
LTEXT "Hardware:",IDC_ROMDATA_LABELHARDWARE,13,268,64,8,NOT WS_GROUP
EDITTEXT IDC_ROMDATA_TEXTDATPATH,64,240,286,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
EDITTEXT IDC_ROMDATA_TEXTDRIVER,64,254,286,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
EDITTEXT IDC_ROMDATA_TEXTHARDWARE,64,268,286,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
END
IDD_ROMDATA_COVER_DLG DIALOGEX 0, 0, 397, 262
STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_TOOLWINDOW
CAPTION "Cover Image"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
CONTROL "",IDC_ROMDATA_COVER_PREVIEW_PIC,"Static",SS_BITMAP,3,2,312,179,WS_EX_CLIENTEDGE
END
/////////////////////////////////////////////////////////////////////////////
//
// Menu
@@ -1068,6 +1105,8 @@ BEGIN
END
POPUP "Quick load game"
BEGIN
MENUITEM "Select RomData dat...", MENU_LOAD_ROMDATA, GRAYED
MENUITEM SEPARATOR
MENUITEM "Select IPS patch dat...", MENU_LOAD_IPSPATCH, GRAYED
MENUITEM SEPARATOR
MENUITEM "Load CD image...", MENU_LOAD_CDIMAGE, GRAYED
@@ -1075,13 +1114,7 @@ BEGIN
MENUITEM "Select Archive file...", MENU_LOAD_ARCHIVE, GRAYED
END
MENUITEM SEPARATOR
POPUP "RomData"
BEGIN
MENUITEM "Import Files...\tCtrl+F", MENU_ROMDATA_OPENFILES, GRAYED
MENUITEM "Import from Folder...\tCtrl+D", MENU_ROMDATA_DIRSEARCH, GRAYED
MENUITEM SEPARATOR
MENUITEM "Scan RomData Folder", MENU_ROMDATA_RESEARCH, GRAYED
END
MENUITEM "Open RomData manager\tCtrl+R", MENU_ROMDATA_MANAGER, GRAYED
MENUITEM SEPARATOR
MENUITEM "Play via Kaillera...", MENU_STARTNET
MENUITEM SEPARATOR
@@ -1881,6 +1914,8 @@ BEGIN
MENUITEM "View in Arcade Database", GAMESEL_MENU_VIEWEMMA
MENUITEM SEPARATOR
MENUITEM "Favorite", GAMESEL_MENU_FAVORITE
MENUITEM SEPARATOR
MENUITEM "Export to RomData template", GAMESEL_MENU_ROMDATA
END
END
@@ -1911,8 +1946,6 @@ IDR_ACCELERATOR ACCELERATORS DISCARDABLE
BEGIN
VK_F1, MENU_ENABLECHEAT, CONTROL, VIRTKEY, NOINVERT
VK_F1, MENU_DEBUG, CONTROL, SHIFT, VIRTKEY, NOINVERT
"D", MENU_ROMDATA_DIRSEARCH, CONTROL, VIRTKEY, NOINVERT
"F", MENU_ROMDATA_OPENFILES, CONTROL, VIRTKEY, NOINVERT
VK_F4, MENU_QUIT, CONTROL, VIRTKEY, NOINVERT
VK_F5, MENU_INPUT, VIRTKEY, NOINVERT
VK_F5, MENU_DIPSW, CONTROL, VIRTKEY, NOINVERT
@@ -1944,6 +1977,7 @@ BEGIN
VK_SUBTRACT, MENU_CHEATSEARCH_DECREASE, CONTROL, VIRTKEY, NOINVERT
VK_ADD, MENU_CHEATSEARCH_INCREASE, CONTROL, VIRTKEY, NOINVERT
"W", MENU_QUIT, CONTROL, VIRTKEY, NOINVERT
"R", MENU_ROMDATA_MANAGER, CONTROL, VIRTKEY, NOINVERT
END
/////////////////////////////////////////////////////////////////////////////
@@ -1959,6 +1993,7 @@ IDI_TV_MINUS ICON DISCARDABLE "resource/TV Minus.ico"
IDI_TV_NOTWORKING ICON DISCARDABLE "resource/TV Not Working.ico"
IDI_TV_NOTFOUND_ESS ICON DISCARDABLE "resource/TV Not Found.ico"
IDI_TV_NOTFOUND_NON ICON DISCARDABLE "resource/TV Not Found Non Essential.ico"
IDI_TV_ROMDATA_DRV ICON DISCARDABLE "resource/TV RomData Driver.ico"
IDI_LV_CDIMAGE_CUE ICON DISCARDABLE "resource/LV Cue Image.ico"
IDI_LV_CDIMAGE_CHD ICON DISCARDABLE "resource/LV Chd Image.ico"
IDI_INPD_DETECT_GAMEPADS ICON DISCARDABLE "resource/detect gamepads.ico"
+16 -1
View File
@@ -300,6 +300,7 @@ void ScrnInitLua();
void ScrnExitLua();
char* DecorateKailleraGameName(UINT32 nBurnDrv);
INT32 CreateAllDatfilesWindows(bool bSilent = false, const TCHAR* pszSpecDir = NULL);
INT32 RomDataLoadDriver(const TCHAR* pszSelDat);
INT32 BurnerQuickLoad(const INT32 nMode, const TCHAR* pszSelect);
// bzip.cpp
@@ -385,7 +386,6 @@ extern HICON* pIconsCache;
void CreateDrvIconsCache();
void DestroyDrvIconsCache();
void RomDataScanDefault();
void LoadDrvIcons();
void UnloadDrvIcons();
@@ -405,6 +405,21 @@ HBITMAP LoadBitmap(HWND hWnd, FILE* fp, int nWidth, int nHeight, int nPreset);
int NeoCDList_CheckISO(TCHAR* pszFile, void (*pfEntryCallBack)(INT32, TCHAR*));
#include "cd_img.h"
// romdata.cpp
extern bool bRDListScanSub;
TCHAR* _strqtoken(TCHAR* s, const TCHAR* delims);
INT32 RomdataGetDrvIndex(const TCHAR* pszDrvName);
TCHAR* RomdataGetZipName(const TCHAR* pszFileName);
TCHAR* RomdataGetDrvName(const TCHAR* pszFileName);
TCHAR* RomdataGetFullName(const TCHAR* pszFileName);
bool FindZipNameFromDats(const TCHAR* dirPath, const char* pszZipName, TCHAR* pszFindDat);
INT32 RomDataManagerInit();
bool RomDataSetQuickPath(const TCHAR* pszSelDat);
INT32 RomDataCheck(const TCHAR* pszDatFile);
void RomDataStateBackup();
void RomDataStateRestore();
bool RomDataExportTemplate(HWND hWnd, const INT32 nDrvSelect);
// cona.cpp
struct SubDirInfo {
TCHAR BaseDir[MAX_PATH];
+40 -3
View File
@@ -504,8 +504,10 @@ INT32 BzipOpen(bool bootApp)
SubDirsListFree();
const char* pszDrvName = (NULL != pDataRomDesc) ? pRDI->szDrvName : NULL; // romdata mode, let's pick up the forgotten DrvName ROMs again.
const INT32 nAppRomPaths = (nQuickOpen > 0) ? DIRS_MAX + 1 : DIRS_MAX;
// Locate each zip file
for (INT32 y = 0, z = 0; y < BZIP_MAX && z < BZIP_MAX; y++) {
char* szName = NULL;
bool bFound = false;
@@ -514,15 +516,19 @@ INT32 BzipOpen(bool bootApp)
break;
}
for (INT32 d = 0; d < nAppRomPaths; d++) {
TCHAR szFullName[MAX_PATH] = { 0 };
for (INT32 d = 0; d < nAppRomPaths; d++) { // Traverse the user-configured rom paths
TCHAR szFullName[MAX_PATH] = { 0 }, szDrvName[MAX_PATH] = { 0 };
const TCHAR* pszAppRomPaths = (d < DIRS_MAX) ? szAppRomPaths[d] : szAppQuickPath;
if (nLoadMenuShowY & (1 << 26)) {
for (UINT32 nCount = 0; nCount < _SubDirInfo[d].nCount; nCount++) {
// like: c:\1st_dir\2nd_dir\1 + ".zip" + '\0' = 5 chars
if ((_tcslen(_SubDirInfo[d].SubDirs[nCount]) + strlen(szName)) > (MAX_PATH - 5))
continue;
_stprintf(szFullName, _T("%s%hs"), _SubDirInfo[d].SubDirs[nCount], szName);
if (NULL != pszDrvName) {
_stprintf(szDrvName, _T("%s%hs"), _SubDirInfo[d].SubDirs[nCount], pszDrvName);
}
if (RomArchiveExists(szFullName)) {
bFound = true;
@@ -537,14 +543,32 @@ INT32 BzipOpen(bool bootApp)
FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_FOUND), szName, _SubDirsZip.pszZipName[_SubDirsZip.nCount]);
}
_SubDirsZip.nCount++;
}
if (RomArchiveExists(szDrvName)) {
bFound = true;
TCHAR** newArray = (TCHAR**)realloc(_SubDirsZip.pszZipName, (_SubDirsZip.nCount + 1) * sizeof(TCHAR*));
_SubDirsZip.pszZipName = newArray;
_SubDirsZip.pszZipName[_SubDirsZip.nCount] = (TCHAR*)malloc(MAX_PATH * sizeof(TCHAR));
_tcscpy(_SubDirsZip.pszZipName[_SubDirsZip.nCount], szDrvName);
if (!bootApp) {
FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_FOUND), szName, _SubDirsZip.pszZipName[_SubDirsZip.nCount]);
}
_SubDirsZip.nCount++;
}
}
}
_stprintf(szFullName, _T("%s%hs"), pszAppRomPaths, szName);
if (NULL != pszDrvName) {
_stprintf(szDrvName, _T("%s%hs"), pszAppRomPaths, pszDrvName);
}
if (RomArchiveExists(szFullName)) {
if (RomArchiveExists(szFullName)) { // Check existence of the rom zip/7z archive file
bFound = true;
szBzipName[z] = (TCHAR*)malloc(MAX_PATH * sizeof(TCHAR));
@@ -554,6 +578,19 @@ INT32 BzipOpen(bool bootApp)
FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_FOUND), szName, szBzipName[z]);
}
z++;
if (z >= BZIP_MAX) break;
}
if (RomArchiveExists(szDrvName)) { // Append DrvName ROMs
bFound = true;
szBzipName[z] = (TCHAR*)malloc(MAX_PATH * sizeof(TCHAR));
_tcscpy(szBzipName[z], szDrvName);
if (!bootApp) {
FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_FOUND), szName, szBzipName[z]);
}
z++;
if (z >= BZIP_MAX) break;
}
+5
View File
@@ -511,6 +511,8 @@ int ConfigAppLoad()
DRV(nBurnDrvSelect[5]);
VAR(bNeoCDListScanSub);
VAR(bRDListScanSub);
// Default Controls
VAR(nPlayerDefaultControls[0]);
@@ -925,6 +927,9 @@ int ConfigAppSave()
_ftprintf(h, _T("\n// Neo Geo CD Load Game Dialog options\n"));
VAR(bNeoCDListScanSub);
_ftprintf(h, _T("\n// RomData Load Game Dialog options\n"));
VAR(bRDListScanSub);
_ftprintf(h, _T("\n\n\n"));
_ftprintf(h, _T("// --- miscellaneous ---------------------------------------------------------\n"));
+12
View File
@@ -74,7 +74,10 @@ static int DoLibInit() // Do Init of Burn library driver
{
int nRet = 0;
RomDataInit();
if (DrvBzipOpen()) {
RomDataExit();
return 1;
}
@@ -89,6 +92,8 @@ static int DoLibInit() // Do Init of Burn library driver
nRet = BurnDrvInit();
RomDataSetFullName();
BzipClose();
if (!bQuietLoading) ProgressDestroy();
@@ -245,6 +250,12 @@ int DrvInit(int nDrvNum, bool bRestore)
FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_BURN_INIT), BurnDrvGetText(DRV_FULLNAME));
FBAPopupDisplay(PUF_TYPE_WARNING);
// When romdata loading fails, the data within the structure must be emptied to restore the original data content.
// The time to quit must be after the correct name of the game corresponding to Romdata has been displayed.
if (NULL != pDataRomDesc) {
RomDataExit();
}
}
NeoCDZRateChangeback();
@@ -348,6 +359,7 @@ int DrvExit()
}
CDEmuExit();
RomDataExit();
BurnExtCartridgeSetupCallback = NULL;
nBurnDrvActive = ~0U; // no driver selected
File diff suppressed because it is too large. Load diff
+75 -82
View File
@@ -719,106 +719,62 @@ bool SetNumLock(bool bState)
return keyState[VK_NUMLOCK] & 1;
}
static TCHAR* _strqtoken(TCHAR* s, const TCHAR* delims)
static INT32 ParseExportPath(const TCHAR* pszCmdLine, TCHAR* pszDirPath, INT32* nPathLen)
{
static TCHAR* prev_str = NULL;
TCHAR* token;
if (!delims)
return NULL;
if (!s) {
s = prev_str;
if (!s)
return NULL;
}
s += _tcsspn(s, delims);
if (*s == _T('\0')) {
prev_str = NULL;
return NULL;
}
if (*s == _T('"')) {
token = ++s;
TCHAR* endquote = _tcschr(s, _T('"'));
if (endquote) {
*endquote = _T('\0');
s = endquote + 1;
} else {
s = _tcschr(s, _T('\0'));
}
} else {
token = s;
s = _tcspbrk(s, delims);
}
if (s && *s != _T('\0')) {
*s = _T('\0');
prev_str = s + 1;
} else {
prev_str = NULL;
}
return token;
}
static INT32 ParseExportPath(const TCHAR* pszCmdLine, TCHAR* pszOutDir, INT32* pnPathLen)
{
TCHAR szBuffer[1024] = { 0 };
_tcsncpy(szBuffer, pszCmdLine, sizeof(szBuffer) / sizeof(szBuffer[0]) - 1);
const TCHAR* pszDelims = _T(" \t\r\n");
TCHAR* pszArg = _strqtoken(szBuffer, pszDelims);
if (!pszArg)
TCHAR* pszArgA = NULL, * pszArgN = NULL;
TCHAR szBuffer[1024] = { 0 };
_tcscpy(szBuffer, pszCmdLine);
pszArgA = _strqtoken(szBuffer, pszDelims); // -listxmlall or -listinfoall
if (NULL == pszArgA) return -1;
if ((0 != _tcsicmp(_T("-listxmlall"), pszArgA)) && (0 != _tcsicmp(_T("-listinfoall"), pszArgA)))
return -1;
if (_tcsicmp(pszArg, _T("-listxmlall")) != 0 && _tcsicmp(pszArg, _T("-listinfoall")) != 0)
return -1;
INT32 nMarker = 0;
bool bSilent = false;
while ((pszArg = _strqtoken(NULL, pszDelims)) != NULL) {
if (_tcsicmp(pszArg, _T("-s")) == 0) {
bSilent = true;
while (NULL != (pszArgN = _strqtoken(NULL, pszDelims))) {
if (0 == _tcsicmp(_T("-s"), pszArgN)) {
nMarker = 1;
continue;
}
// A parameter specifying the directory is entered
UINT32 nLen = _tcslen(pszArgN), nLimit = MAX_PATH;
if ((_T('/') != pszArgN[nLen - 1]) && (_T('\\') != pszArgN[nLen - 1]))
nLimit--;
UINT32 nLen;
TCHAR szPath[MAX_PATH] = { 0 };
_tcsncpy(szPath, pszArg, MAX_PATH - 2);
nLen = _tcslen(szPath);
DWORD dwAttrib = GetFileAttributes(szPath);
if (dwAttrib == INVALID_FILE_ATTRIBUTES || !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY))
if (nLen >= nLimit)
return -1;
TCHAR cLast = szPath[nLen - 1];
if (cLast != _T('/') && cLast != _T('\\')) {
szPath[nLen++] = _T('\\');
szPath[nLen] = _T('\0');
TCHAR szDirPath[MAX_PATH] = { 0 };
_tcscpy(szDirPath, pszArgN);
DWORD dwAttrib = GetFileAttributes(szDirPath);
if ((INVALID_FILE_ATTRIBUTES == dwAttrib) || (!(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)))
return -1; // Input directory error
if ((_T('/') != szDirPath[nLen - 1]) && (_T('\\') != szDirPath[nLen - 1])) {
szDirPath[nLen + 0] = _T('\\');
szDirPath[nLen + 1] = _T('\0');
nLen++;
}
if (pszOutDir) _tcscpy(pszOutDir, szPath);
if (pnPathLen) *pnPathLen = nLen;
if (NULL != pszDirPath) _tcscpy(pszDirPath, szDirPath);
if (NULL != nPathLen) *nPathLen = nLen;
return 2;
}
if (pszOutDir) _tcscpy(pszOutDir, _T(""));
if (pnPathLen) *pnPathLen = 1;
if (NULL != pszDirPath) _tcscpy(pszDirPath, _T(""));
if (NULL != nPathLen) *nPathLen = 1;
return bSilent ? 1 : 0;
return nMarker; // 1 Silent, 0 Not
}
#include <wininet.h>
void RomDataScanDefault()
{
TCHAR szCachePath[MAX_PATH];
INT32 nLength = _sntprintf(szCachePath, MAX_PATH, _T("config/%s.romdata.dat"), szAppExeName);
RomDataScan(szAppRomdataPath, (nLength >= 0 && nLength < MAX_PATH) ? szCachePath : NULL);
}
static int AppInit()
{
#if defined (_MSC_VER) && defined (_DEBUG)
@@ -837,8 +793,6 @@ static int AppInit()
ConfigAppLoad();
LookupSubDirThreads();
RomDataScanDefault();
#if defined (FBNEO_DEBUG)
OpenDebugLog();
#endif
@@ -938,7 +892,7 @@ static int AppExit()
FreeROMInfo();
DestroySubDir();
MediaExit();
BurnLibExit(); // Exit the Burn library (releases RomData drivers via BurnLibExitHook)
BurnLibExit(); // Exit the Burn library
DisableHighResolutionTiming();
@@ -1312,6 +1266,45 @@ int ProcessCmdLine()
// Command: lua file
FBA_LoadLuaCode(TCHARToANSI(szName, NULL, 0));
//bVidAutoSwitchFullDisable = true;
} else if (_tcscmp(szName, _T("-romdata")) == 0) { // cmdline for romdata
TCHAR* szPoint = NULL;
if (NULL != (szPoint = _tcsstr(szCmdLine, _T("-romdata")))) {
szPoint += _tcslen(_T("-romdata"));
while (szPoint[0] != _T('\0')) {
if (szPoint[0] == _T(' ')) {
szPoint++;
} else { break; }
}
TCHAR* szExt = _tcsstr(szCmdLine, _T(".dat"));
if (NULL != szExt) {
szExt[0] = _T('\0');
}
szExt = NULL;
TCHAR* szDatName = _tcstok(szPoint, _T("\""));
memset(szRomdataName, '\0', sizeof(szRomdataName));
_stprintf(szRomdataName, _T("%s%s%s"), szAppRomdataPath, szDatName, _T(".dat"));
szDatName = NULL;
szPoint = NULL;
char* szDrvName = RomdataGetDrvName();
INT32 nGame = BurnDrvGetIndex(szDrvName);
if ((NULL == szDrvName) || (-1 == nGame)) {
FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_NODATA));
FBAPopupDisplay(PUF_TYPE_WARNING);
return 1;
}
if (DrvInit(nGame, true)) { // failed (bad romset, etc.)
nVidFullscreen = 0; // Don't get stuck in fullscreen mode
}
}
} else {
bQuietLoading = true;
bDoIpsPatch = false;
+16 -14
View File
@@ -1323,20 +1323,25 @@ void MenuUpdate()
if (_tcslen(szPrevGames[i])) {
// Check the internal fbneo-database for szPrevGames[] resolution
bool bFound = false;
// First we'll check the internal fbneo-database for szPrevGames[] resolution
bool found = false;
for (unsigned int j = 0; j < nBurnDrvCount; j++) {
nBurnDrvActive = j;
if (!_tcsicmp(szPrevGames[i], BurnDrvGetText(DRV_NAME))) {
_stprintf(szText, _T("%s\t%s"), BurnDrvGetText(DRV_FULLNAME), BurnDrvGetText(DRV_NAME));
bFound = true;
found = true;
break;
}
}
nBurnDrvActive = OldDrvSelect;
if (!bFound) {
_tcscpy(szText, szPrevGames[i]);
// If it's not found, attempt to resolve via RomData
if (found == false) {
// Find RomData directory (recursive or not depending on settings)
TCHAR szDatFile[MAX_PATH] = { 0 };
if (FindZipNameFromDats(szAppRomdataPath, TCHARToANSI(szPrevGames[i], NULL, 0), szDatFile)) {
_stprintf(szText, _T("%s\t%s"), RomdataGetFullName(szDatFile), szPrevGames[i]);
}
}
// Check for &s and change to &&
@@ -1680,12 +1685,11 @@ void MenuEnableItems()
if (kNetGame) {
EnableMenuItem(hMenu, MENU_LOAD, MF_GRAYED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_LOAD_ROMDATA, MF_GRAYED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_LOAD_IPSPATCH, MF_GRAYED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_LOAD_CDIMAGE, MF_GRAYED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_LOAD_ARCHIVE, MF_GRAYED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_ROMDATA_DIRSEARCH, MF_GRAYED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_ROMDATA_OPENFILES, MF_GRAYED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_ROMDATA_RESEARCH, MF_GRAYED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_ROMDATA_MANAGER, MF_GRAYED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_STARTNET, MF_GRAYED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_EXIT, MF_GRAYED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_SETCPUCLOCK, MF_GRAYED | MF_BYCOMMAND);
@@ -1702,12 +1706,11 @@ void MenuEnableItems()
EnableMenuItem(hMenu, MENU_SNAPFACT, MF_GRAYED | MF_BYCOMMAND);
} else {
EnableMenuItem(hMenu, MENU_LOAD, MF_ENABLED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_LOAD_ROMDATA, MF_ENABLED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_LOAD_IPSPATCH, MF_ENABLED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_LOAD_CDIMAGE, MF_ENABLED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_LOAD_ARCHIVE, MF_ENABLED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_ROMDATA_DIRSEARCH, MF_ENABLED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_ROMDATA_OPENFILES, MF_ENABLED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_ROMDATA_RESEARCH, MF_ENABLED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_ROMDATA_MANAGER, MF_ENABLED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_STARTNET, MF_ENABLED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_EXIT, MF_ENABLED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_SETCPUCLOCK, MF_ENABLED | MF_BYCOMMAND);
@@ -1789,13 +1792,12 @@ void MenuEnableItems()
} else {
bAltPause = 0;
EnableMenuItem(hMenu, MENU_ROMDATA_DIRSEARCH, MF_ENABLED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_ROMDATA_OPENFILES, MF_ENABLED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_ROMDATA_RESEARCH, MF_ENABLED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_LOAD, MF_ENABLED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_LOAD_ROMDATA, MF_ENABLED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_LOAD_IPSPATCH, MF_ENABLED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_LOAD_CDIMAGE, MF_ENABLED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_LOAD_ARCHIVE, MF_ENABLED | MF_BYCOMMAND);
EnableMenuItem(hMenu, MENU_ROMDATA_MANAGER, MF_ENABLED | MF_BYCOMMAND);
EnableMenuItem(hMenu, ID_SLOMO_0, MF_GRAYED | MF_BYCOMMAND);
EnableMenuItem(hMenu, ID_SLOMO_1, MF_GRAYED | MF_BYCOMMAND);
EnableMenuItem(hMenu, ID_SLOMO_2, MF_GRAYED | MF_BYCOMMAND);
+25 -3
View File
@@ -17,6 +17,7 @@
#define IDI_TV_NOTFOUND_NON 15
#define IDI_INPD_DETECT_GAMEPADS 16 // icon
#define IDC_INPD_DETECT_GAMEPADS 17 // control
#define IDI_TV_ROMDATA_DRV 18
#define IDI_LV_CDIMAGE_CUE 19
#define IDI_LV_CDIMAGE_CHD 20
@@ -54,6 +55,8 @@
#define IDD_DOWNLOAD_LOCAL 82
#define IDD_CHOOSEMONITOR 83
#define IDD_HARDFXSETTINGS 84
#define IDD_ROMDATA_MANAGER 85
#define IDD_ROMDATA_COVER_DLG 86
#define IDR_MENU 100
#define IDR_MENU_BLITTER_1 110
@@ -529,6 +532,25 @@
#define IDDEFAULT 21160
#define IDC_ROMDATA_MANAGER 21200
#define IDC_ROMDATA_LIST 21201
#define IDC_ROMDATA_TITLE 21202
#define IDC_ROMDATA_PREVIEW 21203
#define IDC_ROMDATA_TITLE_FRAME 21204
#define IDC_ROMDATA_PREVIEW_FRAME 21205
#define IDC_ROMDATA_TEXTDATPATH 21206
#define IDC_ROMDATA_TEXTHARDWARE 21207
#define IDC_ROMDATA_TEXTDRIVER 21208
#define IDC_ROMDATA_SUBDIR_CHECK 21209
#define IDC_ROMDATA_SCAN_BUTTON 21210
#define IDC_ROMDATA_SELDIR_BUTTON 21211
#define IDC_ROMDATA_PLAY_BUTTON 21212
#define IDC_ROMDATA_CANCEL_BUTTON 21213
#define IDC_ROMDATA_LABELHARDWARE 21214
#define IDC_ROMDATA_LABELDAT 21215
#define IDC_ROMDATA_LABELDRIVER 21216
#define IDC_ROMDATA_COVER_PREVIEW_PIC 21217
#define MENU_LOAD 10001
#define MENU_STARTNET 10002
#define MENU_STARTREPLAY 10003
@@ -542,17 +564,16 @@
#define MENU_RESETCPUCLOCK 10011
#define MENU_EXIT 10012
#define MENU_RESET 10013
#define MENU_LOAD_ROMDATA 10014
#define MENU_LOAD_IPSPATCH 10015
#define MENU_LOAD_CDIMAGE 10016
#define MENU_LOAD_ARCHIVE 10017
#define MENU_ROMDATA_MANAGER 10018
#define MENU_MEMCARD_CREATE 10020
#define MENU_MEMCARD_SELECT 10021
#define MENU_MEMCARD_INSERT 10022
#define MENU_MEMCARD_EJECT 10023
#define MENU_MEMCARD_TOGGLE 10024
#define MENU_ROMDATA_DIRSEARCH 10025
#define MENU_ROMDATA_OPENFILES 10026
#define MENU_ROMDATA_RESEARCH 10027
// PGM2 per-slot card menu IDs: base + slot*4 + action (action: 0=Create, 1=Select, 2=Insert, 3=Eject)
#define MENU_MEMCARD_PGM2_BASE 10040
@@ -1089,6 +1110,7 @@
#define GAMESEL_MENU_GAMEINFO 11901
#define GAMESEL_MENU_VIEWEMMA 11902
#define GAMESEL_MENU_FAVORITE 11903
#define GAMESEL_MENU_ROMDATA 11904
// Next default values for new objects
//
+7 -1
View File
@@ -209,7 +209,6 @@
#define IDS_SEL_CHANNELF (IDS_STRING + 558) // ""
#define IDS_SEL_ASTROHOME (IDS_STRING + 712) // ""
#define IDS_SEL_GBA (IDS_STRING + 714) // ""
#define IDS_SEL_ROMDATA (IDS_STRING + 716)
#define IDS_GENRE (IDS_STRING + 650)
#define IDS_GENRE_HORSHOOT (IDS_STRING + 652)
@@ -268,6 +267,13 @@
#define IDS_NGCD_TITLE (IDS_STRING + 812)
#define IDS_NGCD_NGCDID (IDS_STRING + 814)
#define IDS_ROMDATAMANAGER_TITLE (IDS_STRING + 820)
#define IDS_ROMDATA_DATPATH (IDS_STRING + 822)
#define IDS_ROMDATA_ROMSET (IDS_STRING + 824)
#define IDS_ROMDATA_DRIVER (IDS_STRING + 826)
#define IDS_ROMDATA_HARDWARE_DESC (IDS_STRING + 828)
#define IDS_ROMDATA_FULLNAME (IDS_STRING + 830)
#define IDS_MENU_0 (IDS_STRING + 840)
#define IDS_MENU_1 (IDS_STRING + 842)
#define IDS_MENU_2 (IDS_STRING + 844)
File diff suppressed because it is too large. Load diff
+140 -137
View File
@@ -107,104 +107,6 @@ static int nDragX, nDragY;
static int nOldWindowX, nOldWindowY;
static int nLeftButtonX, nLeftButtonY;
static void RomDataRefreshBegin()
{
FreeROMInfo();
UnloadDrvIcons();
DestroyDrvIconsCache();
}
static void RomDataRefreshEnd(UINT32 nOldCount)
{
bRescanRoms = true;
if (nBurnDrvCount == nOldCount) {
CreateROMInfo(NULL);
CreateDrvIconsCache();
return;
}
BurnerDoGameListLocalisation();
CreateROMInfo(NULL);
CreateDrvIconsCache();
MenuEnableItems();
}
static void RomDataAddFiles(HWND hWnd)
{
static const UINT32 nBufferSize = 65536;
TCHAR szBuffer[nBufferSize] = { 0 };
TCHAR szFilter[150] = { 0 };
_stprintf(szFilter, FBALoadStringEx(hAppInst, IDS_DISK_FILE_ROMDATA, true), _T("FBNeo"));
memcpy(szFilter + _tcslen(szFilter), _T(" (*.dat)\0*.dat\0\0"), 16 * sizeof(TCHAR));
OPENFILENAME RomDataOfn = { 0 };
RomDataOfn.lStructSize = sizeof(RomDataOfn);
RomDataOfn.hwndOwner = hWnd;
RomDataOfn.lpstrFile = szBuffer;
RomDataOfn.nMaxFile = nBufferSize;
RomDataOfn.lpstrFilter = szFilter;
RomDataOfn.lpstrInitialDir = szAppRomdataPath;
RomDataOfn.Flags = OFN_ALLOWMULTISELECT | OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_NOCHANGEDIR | OFN_PATHMUSTEXIST;
if (!GetOpenFileName(&RomDataOfn))
return;
UINT32 nOldCount = nBurnDrvCount;
RomDataRefreshBegin();
TCHAR* pszName = szBuffer + _tcslen(szBuffer) + 1;
if (*pszName == _T('\0')) {
RomDataImportOne(szBuffer, szAppRomdataPath);
} else {
const TCHAR* pszDir = szBuffer;
while (*pszName != _T('\0')) {
TCHAR szPath[MAX_PATH];
INT32 nLength = _sntprintf(szPath, MAX_PATH, _T("%s\\%s"), pszDir, pszName);
if (nLength >= 0 && nLength < MAX_PATH)
RomDataImportOne(szPath, szAppRomdataPath);
else
bprintf(PRINT_ERROR, _T("RomData: path is too long '%s\\%s'\n"), pszDir, pszName);
pszName += _tcslen(pszName) + 1;
}
}
RomDataRefreshEnd(nOldCount);
}
static void RomDataAddDirectory(HWND hWnd)
{
TCHAR szPath[MAX_PATH] = { 0 };
BROWSEINFO BrowseInfo = { 0 };
BrowseInfo.hwndOwner = hWnd;
BrowseInfo.pszDisplayName = szPath;
BrowseInfo.lpszTitle = FBALoadStringEx(hAppInst, IDS_SELECT_DIR, true);
BrowseInfo.ulFlags = BIF_EDITBOX | BIF_RETURNONLYFSDIRS;
if (S_OK == nCOMInit)
BrowseInfo.ulFlags |= BIF_NEWDIALOGSTYLE;
LPITEMIDLIST pItem = SHBrowseForFolder(&BrowseInfo);
if (!pItem)
return;
INT32 nSelected = SHGetPathFromIDList(pItem, szPath);
CoTaskMemFree(pItem);
if (!nSelected)
return;
UINT32 nOldCount = nBurnDrvCount;
RomDataRefreshBegin();
RomDataImportDirectory(szPath, szAppRomdataPath);
RomDataRefreshEnd(nOldCount);
}
static void RomDataRescanDefault()
{
UINT32 nOldCount = nBurnDrvCount;
RomDataRefreshBegin();
RomDataScanDefault();
RomDataRefreshEnd(nOldCount);
}
static int OnCreate(HWND, LPCREATESTRUCT);
static void OnActivateApp(HWND, BOOL, DWORD);
static void OnPaint(HWND);
@@ -1168,9 +1070,16 @@ static void OnDestroy(HWND)
static void UpdatePreviousGameList()
{
INT32 nRecentIdenticalTo = -1;
TCHAR szDatFile[MAX_PATH] = { 0 };
// check if this game is identical to any of the listed in the recent menu
for (INT32 x = 0; x < SHOW_PREV_GAMES; x++) {
if (!_tcscmp(BurnDrvGetText(DRV_NAME), szPrevGames[x])) {
if(!_tcscmp(BurnDrvGetText(DRV_NAME), szPrevGames[x])) {
if (NULL != pDataRomDesc) {
// Disables RomData games that are not in the RomData directory from being added to the list
if (!FindZipNameFromDats(szAppRomdataPath, TCHARToANSI(szPrevGames[x], NULL, 0), szDatFile))
return;
}
nRecentIdenticalTo = x;
}
}
@@ -1232,38 +1141,48 @@ static void QuitGame()
}
}
static INT32 RomdataGetDrvIndex(const TCHAR* pszDrvName)
// Compact driver loading module
int BurnerLoadDriver(TCHAR *pszDriverName)
{
const UINT32 nOldDrvActive = nBurnDrvActive;
INT32 nDrvIdx = -1;
bool bCurrentRD = (NULL != pDataRomDesc), bRDMode = false, bFinder = false;
TCHAR szBackup[MAX_PATH] = { 0 }, szRDDatBackup[MAX_PATH] = { 0 };
for (INT32 nDrvIndex = 0; nDrvIndex < (INT32)nBurnDrvCount; nDrvIndex++) {
nBurnDrvActive = nDrvIndex;
if ((0 == _tcscmp(pszDrvName, BurnDrvGetText(DRV_NAME))) && (!(BurnDrvGetFlags() & BDF_BOARDROM))) {
nBurnDrvActive = nOldDrvActive;
return nDrvIndex;
if (bCurrentRD) {
_tcscpy(szBackup, szRomdataName);
RomDataExit();
}
if (bFinder = FindZipNameFromDats(szAppRomdataPath, _TtoA(pszDriverName), szRDDatBackup)) {
if ((nDrvIdx = RomDataCheck(szRDDatBackup)) >= 0) {
bRDMode = true;
}
}
nBurnDrvActive = nOldDrvActive;
return -1;
}
INT32 BurnerLoadDriver(TCHAR *pszDriverName)
{
INT32 nDrvIdx = RomdataGetDrvIndex(pszDriverName);
if (!bFinder || !bRDMode) {
nDrvIdx = RomdataGetDrvIndex(pszDriverName);
}
if (nDrvIdx < 0)
return -1;
memset(szRomdataName, 0, sizeof(szRomdataName));
if (bCurrentRD) {
_tcscpy(szRomdataName, szBackup);
RomDataInit();
}
QuitGame();
if (bRDMode) {
_tcscpy(szRomdataName, szRDDatBackup);
}
nDialogSelect = nOldDlgSelected = nBurnDrvActive = nDrvIdx;
bLoading = 1;
SplashDestroy(1);
StopReplay();
DrvInit(nDrvIdx, bSramLoad);
DrvInit(nDrvIdx, bSramLoad); // Init the game driver
MenuEnableItems();
bAltPause = 0;
AudSoundPlay();
AudSoundPlay(); // Restart sound
bLoading = 0;
UpdatePreviousGameList();
if (bVidAutoSwitchFull) {
@@ -1274,6 +1193,47 @@ INT32 BurnerLoadDriver(TCHAR *pszDriverName)
return 0;
}
INT32 RomDataLoadDriver(const TCHAR* pszSelDat)
{
bool bRDMode = (NULL != pDataRomDesc);
TCHAR szBackup[MAX_PATH] = { 0 };
if (bRDMode) {
_tcscpy(szBackup, szRomdataName);
RomDataExit(); // Before handling RomDataCheck, exit RDMode
}
INT32 nDrvIdx = -1;
if ((nDrvIdx = RomDataCheck(pszSelDat)) < 0)
return -1;
if (bRDMode) {
_tcscpy(szRomdataName, szBackup);
RomDataInit(); // Restore state
}
QuitGame(); // Quit the game completely
_tcscpy(szRomdataName, pszSelDat);
nDialogSelect = nOldDlgSelected = nBurnDrvActive = nDrvIdx;
bLoading = 1;
SplashDestroy(1);
StopReplay();
DrvInit(nDrvIdx, bSramLoad); // Init the game driver
MenuEnableItems();
bAltPause = 0;
AudSoundPlay(); // Restart sound
bLoading = 0;
UpdatePreviousGameList();
if (bVidAutoSwitchFull) {
nVidFullscreen = 1;
POST_INITIALISE_MESSAGE;
}
return 0;
}
static INT32 FileExists(const TCHAR* pszName)
{
DWORD dwAttrib = GetFileAttributes(pszName);
@@ -1376,7 +1336,16 @@ INT32 BurnerQuickLoad(const INT32 nMode, const TCHAR* pszSelect)
{
nQuickOpen = nMode;
bool bRDMode = (NULL != pDataRomDesc);
switch (nMode) {
case 1:
if (!RomDataSetQuickPath(pszSelect)) {
QuickOpenExit();
return -1;
}
break;
case 3:
if (!NgcdVerifyPath(pszSelect)) {
return -1;
@@ -1394,9 +1363,20 @@ INT32 BurnerQuickLoad(const INT32 nMode, const TCHAR* pszSelect)
break;
}
TCHAR szBackup[MAX_PATH] = { 0 };
if (bRDMode) {
_tcscpy(szBackup, szRomdataName);
RomDataExit(); // Before handling RomDataCheck, exit RDMode
}
INT32 nDrvIdx = -1;
switch (nMode) {
case 1:
nDrvIdx = RomDataCheck(pszSelect);
break;
case 2:
nDrvIdx = IpsGetDrvForQuickOpen(pszSelect);
break;
@@ -1431,10 +1411,25 @@ INT32 BurnerQuickLoad(const INT32 nMode, const TCHAR* pszSelect)
QuickOpenExit();
return -1;
}
if (bRDMode) {
_tcscpy(szRomdataName, szBackup);
RomDataInit(); // Restore state
}
QuitGame();
/*
This process may occur during gameplay.
All of the above checks must be completed before resetting the game:
[1] If the check fails, the current game will continue;
[2] If the check passes, the game will quit completely (Enter a new game).
*/
QuitGame(); // Quit the game completely
switch (nMode) {
case 1:
_tcscpy(szRomdataName, pszSelect);
break;
case 2:
bDoIpsPatch = true;
IpsPatchInit();
@@ -1453,17 +1448,17 @@ INT32 BurnerQuickLoad(const INT32 nMode, const TCHAR* pszSelect)
bLoading = 1;
SplashDestroy(1);
StopReplay();
DrvInit(nDrvIdx, bSramLoad);
DrvInit(nDrvIdx, bSramLoad); // Init the game driver
MenuEnableItems();
bAltPause = 0;
AudSoundPlay();
QuickOpenExit();
AudSoundPlay(); // Restart sound
QuickOpenExit(); // No need to save variables anymore
bLoading = 0;
if (bVidAutoSwitchFull) {
nVidFullscreen = 1;
POST_INITIALISE_MESSAGE;
}
if (nMode == 3) {
if (3 == nMode) {
memset(CDEmuImage, 0, sizeof(CDEmuImage));
}
@@ -1475,24 +1470,37 @@ int StartFromReset(TCHAR *szDriverName, bool bLoadSram)
if (!bDrvOkay || (szDriverName && _tcscmp(szDriverName, BurnDrvGetText(DRV_NAME)))) {
bSramLoad = bLoadSram;
BurnerLoadDriver(szDriverName);
bSramLoad = true;
bSramLoad = true; // back to default
return 1;
}
//if(nBurnDrvActive < 1) return 0;
INT32 nOldDrvSelect = nBurnDrvActive;
bool bRDMode = (NULL != pDataRomDesc);
TCHAR szRDDatBackup[MAX_PATH] = { 0 };
if (bRDMode) {
_tcscpy(szRDDatBackup, szRomdataName);
}
DrvExit();
bLoading = 1;
if (bRDMode) {
_tcscpy(szRomdataName, szRDDatBackup);
nOldDrvSelect = BurnDrvGetIndex(RomdataGetDrvName());
}
nBurnDrvActive = nOldDrvSelect;
nDialogSelect = nOldDlgSelected = nOldDrvSelect;
SplashDestroy(1);
StopReplay();
DrvInit(nOldDrvSelect, bLoadSram);
DrvInit(nOldDrvSelect, bLoadSram); // Init the game driver, load SRAM?
MenuEnableItems();
bAltPause = 0;
AudSoundPlay();
AudSoundPlay(); // Restart sound
bLoading = 0;
UpdatePreviousGameList();
if (bVidAutoSwitchFull) {
@@ -1603,15 +1611,20 @@ static void OnCommand(HWND /*hDlg*/, int id, HWND /*hwndCtl*/, UINT codeNotify)
}
}
case MENU_LOAD_ROMDATA:
case MENU_LOAD_IPSPATCH:
case MENU_LOAD_CDIMAGE:
case MENU_LOAD_ARCHIVE: {
nQuickOpen = id - MENU_LOAD_IPSPATCH + 2;
nQuickOpen = id - MENU_LOAD_ROMDATA + 1;
const TCHAR* pszFilter = _T(" (*.dat)\0*.dat\0\0");
INT32 nStringID = 0, nStrLen = 16;
switch (nQuickOpen) {
case 1:
nStringID = IDS_DISK_FILE_ROMDATA;
break;
case 2:
nStringID = IDS_DISK_FILE_IPSPATCH;
break;
@@ -1656,18 +1669,8 @@ static void OnCommand(HWND /*hDlg*/, int id, HWND /*hwndCtl*/, UINT codeNotify)
break;
}
case MENU_ROMDATA_DIRSEARCH: {
RomDataAddDirectory(hScrnWnd);
break;
}
case MENU_ROMDATA_OPENFILES: {
RomDataAddFiles(hScrnWnd);
break;
}
case MENU_ROMDATA_RESEARCH: {
RomDataRescanDefault();
case MENU_ROMDATA_MANAGER: {
RomDataManagerInit();
break;
}
+20 -44
View File
@@ -150,7 +150,6 @@ HTREEITEM hFilterDemo = NULL;
HTREEITEM hFilterHack = NULL;
HTREEITEM hFilterHomebrew = NULL;
HTREEITEM hFilterPrototype = NULL;
HTREEITEM hFilterRomData = NULL;
HTREEITEM hFilterGenuine = NULL;
HTREEITEM hFilterHorshoot = NULL;
HTREEITEM hFilterVershoot = NULL;
@@ -315,7 +314,7 @@ static UINT64 MASKALL = ((UINT64)MASKCAPMISC | MASKCAVE | MASKCPS | MASKCPS2
#define MASKALLGENRE (GBF_HORSHOOT | GBF_VERSHOOT | GBF_SCRFIGHT | GBF_VSFIGHT | GBF_BIOS | GBF_BREAKOUT | GBF_CASINO | GBF_BALLPADDLE | GBF_MAZE | GBF_MINIGAMES | GBF_PINBALL | GBF_PLATFORM | GBF_PUZZLE | GBF_QUIZ | GBF_SPORTSMISC | GBF_SPORTSFOOTBALL | GBF_MISC | GBF_MAHJONG | GBF_RACING | GBF_SHOOT | GBF_MULTISHOOT | GBF_ACTION | GBF_RUNGUN | GBF_STRATEGY | GBF_RPG | GBF_SIM | GBF_ADV | GBF_CARD | GBF_BOARD)
#define MASKALLFAMILY (MASKFAMILYOTHER | FBF_MSLUG | FBF_SF | FBF_KOF | FBF_DSTLK | FBF_FATFURY | FBF_SAMSHO | FBF_19XX | FBF_SONICWI | FBF_PWRINST | FBF_SONIC | FBF_DONPACHI | FBF_MAHOU)
#define MASKALLBOARD (MASKBOARDTYPEGENUINE | BDF_BOOTLEG | BDF_DEMO | BDF_HACK | BDF_HOMEBREW | BDF_PROTOTYPE | BDF_ROMDATA_DRIVER)
#define MASKALLBOARD (MASKBOARDTYPEGENUINE | BDF_BOOTLEG | BDF_DEMO | BDF_HACK | BDF_HOMEBREW | BDF_PROTOTYPE)
#define MASKCAPGRP (MASKCAPMISC | MASKCPS | MASKCPS2 | MASKCPS3)
#define MASKSEGAGRP (MASKSEGA | MASKSG1000 | MASKSMS | MASKMEGADRIVE | MASKGG)
@@ -560,24 +559,6 @@ static int DoExtraFilters()
if (nShowMVSCartsOnly && ((BurnDrvGetHardwareCode() & HARDWARE_PREFIX_CARTRIDGE) != HARDWARE_PREFIX_CARTRIDGE)) return 1;
#define NON_GENUINE_MASK (MASKALLBOARD & ~(MASKBOARDTYPEGENUINE | BDF_ROMDATA_DRIVER))
const INT32 nFlags = BurnDrvGetFlags();
const INT32 nRomData = nFlags & BDF_ROMDATA_DRIVER;
const INT32 nNonGenuine = nFlags & NON_GENUINE_MASK;
if (nRomData) {
if ((nLoadMenuBoardTypeFilter & BDF_ROMDATA_DRIVER) &&
((nNonGenuine && (nLoadMenuBoardTypeFilter & nNonGenuine)) ||
(!nNonGenuine && (nLoadMenuBoardTypeFilter & MASKBOARDTYPEGENUINE))))
return 1;
} else {
if ((nLoadMenuBoardTypeFilter & nNonGenuine) ||
((nLoadMenuBoardTypeFilter & MASKBOARDTYPEGENUINE) && !nNonGenuine))
return 1;
}
#undef NON_GENUINE_MASK
#if 0
if ((nLoadMenuBoardTypeFilter & BDF_BOOTLEG) && (BurnDrvGetFlags() & BDF_BOOTLEG)) return 1;
if ((nLoadMenuBoardTypeFilter & BDF_DEMO) && (BurnDrvGetFlags() & BDF_DEMO)) return 1;
if ((nLoadMenuBoardTypeFilter & BDF_HACK) && (BurnDrvGetFlags() & BDF_HACK)) return 1;
@@ -590,8 +571,6 @@ static int DoExtraFilters()
&& (!(BurnDrvGetFlags() & BDF_HOMEBREW))
&& (!(BurnDrvGetFlags() & BDF_PROTOTYPE))) return 1;
#endif
if ((nLoadMenuFamilyFilter & FBF_MSLUG) && (BurnDrvGetFamilyFlags() & FBF_MSLUG)) return 1;
if ((nLoadMenuFamilyFilter & FBF_SF) && (BurnDrvGetFamilyFlags() & FBF_SF)) return 1;
if ((nLoadMenuFamilyFilter & FBF_KOF) && (BurnDrvGetFamilyFlags() & FBF_KOF)) return 1;
@@ -708,8 +687,6 @@ static int SelListMake()
qsort(nBurnZipListDrv, nBurnDrvCount, sizeof(NODEINFO), ZipNames_qs_cmp_desc);
}
#define ONLY_ROMDATA_SELECTED (nLoadMenuBoardTypeFilter == (MASKALLBOARD & ~BDF_ROMDATA_DRIVER))
// Add all the driver names to the list
// 1st: parents
for (i = nBurnDrvCount-1; i >= 0; i--) {
@@ -724,15 +701,8 @@ static int SelListMake()
continue;
}
INT32 nRomData = BurnDrvGetFlags() & BDF_ROMDATA_DRIVER;
if (ONLY_ROMDATA_SELECTED) {
if (!nRomData)
continue;
} else {
if (nRomData)
continue;
if (BurnDrvGetText(DRV_PARENT) != NULL && (BurnDrvGetFlags() & BDF_CLONE))
continue;
if (BurnDrvGetText(DRV_PARENT) != NULL && (BurnDrvGetFlags() & BDF_CLONE)) { // Skip clones
continue;
}
if(!gameAv[nBurnDrvActive]) nMissingDrvCount++;
@@ -797,9 +767,6 @@ static int SelListMake()
// if showing zip names get active entry from our sorted list
if (nLoadMenuShowY & SHOWSHORT) nBurnDrvActive = nBurnZipListDrv[nBurnDrvCount - 1 - i].nBurnDrvNo;
if (ONLY_ROMDATA_SELECTED)
continue;
if (BurnDrvGetFlags() & BDF_BOARDROM) {
continue;
}
@@ -866,8 +833,8 @@ static int SelListMake()
// Find the parent and add a branch to the tree
if (!TvItem.hParent) {
char szTempName[100] = { 0 };
strncpy(szTempName, BurnDrvGetTextA(DRV_PARENT), sizeof(szTempName) - 1);
char szTempName[32];
strcpy(szTempName, BurnDrvGetTextA(DRV_PARENT));
int nTempBurnDrvSelect = nBurnDrvActive;
for (j = 0; j < nBurnDrvCount; j++) {
nBurnDrvActive = j;
@@ -899,8 +866,6 @@ static int SelListMake()
nTmpDrvCount++;
}
#undef ONLY_ROMDATA_SELECTED
for (i = 0; i < nTmpDrvCount; i++) {
// See if we need to expand the branch of an unavailable or non-working parent
if (nBurnDrv[i].bIsParent && ((nLoadMenuShowY & AUTOEXPAND) || !gameAv[nBurnDrv[i].nBurnDrvNo] || !CheckWorkingStatus(nBurnDrv[i].nBurnDrvNo))) {
@@ -988,6 +953,9 @@ static void MyEndDialog()
nSelDlgWidth = rect.right - rect.left;
nSelDlgHeight = rect.bottom - rect.top;
if (!bSelOkay) {
RomDataStateRestore();
}
bSelOkay = false;
EndDialog(hSelDlg, 0);
@@ -1575,7 +1543,6 @@ static void CreateFilters()
_TVCreateFiltersA(hBoardType , IDS_SEL_HACK , hFilterHack , nLoadMenuBoardTypeFilter & BDF_HACK );
_TVCreateFiltersA(hBoardType , IDS_SEL_HOMEBREW , hFilterHomebrew , nLoadMenuBoardTypeFilter & BDF_HOMEBREW );
_TVCreateFiltersA(hBoardType , IDS_SEL_PROTOTYPE , hFilterPrototype , nLoadMenuBoardTypeFilter & BDF_PROTOTYPE );
_TVCreateFiltersA(hBoardType , IDS_SEL_ROMDATA , hFilterRomData , nLoadMenuBoardTypeFilter & BDF_ROMDATA_DRIVER );
_TVCreateFiltersC(hRoot , IDS_FAMILY , hFamily , nLoadMenuFamilyFilter & MASKALLFAMILY );
@@ -2412,7 +2379,6 @@ static INT_PTR CALLBACK DialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lP
_TreeView_SetCheckState(hFilterList, hFilterHack, FALSE);
_TreeView_SetCheckState(hFilterList, hFilterHomebrew, FALSE);
_TreeView_SetCheckState(hFilterList, hFilterPrototype, FALSE);
_TreeView_SetCheckState(hFilterList, hFilterRomData, FALSE);
_TreeView_SetCheckState(hFilterList, hFilterGenuine, FALSE);
nLoadMenuBoardTypeFilter = MASKALLBOARD;
@@ -2424,7 +2390,6 @@ static INT_PTR CALLBACK DialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lP
_TreeView_SetCheckState(hFilterList, hFilterHack, TRUE);
_TreeView_SetCheckState(hFilterList, hFilterHomebrew, TRUE);
_TreeView_SetCheckState(hFilterList, hFilterPrototype, TRUE);
_TreeView_SetCheckState(hFilterList, hFilterRomData, TRUE);
_TreeView_SetCheckState(hFilterList, hFilterGenuine, TRUE);
nLoadMenuBoardTypeFilter = 0;
@@ -2657,7 +2622,6 @@ static INT_PTR CALLBACK DialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lP
if (hItemChanged == hFilterHack) _ToggleGameListing(nLoadMenuBoardTypeFilter, BDF_HACK);
if (hItemChanged == hFilterHomebrew) _ToggleGameListing(nLoadMenuBoardTypeFilter, BDF_HOMEBREW);
if (hItemChanged == hFilterPrototype) _ToggleGameListing(nLoadMenuBoardTypeFilter, BDF_PROTOTYPE);
if (hItemChanged == hFilterRomData) _ToggleGameListing(nLoadMenuBoardTypeFilter, BDF_ROMDATA_DRIVER);
if (hItemChanged == hFilterGenuine) _ToggleGameListing(nLoadMenuBoardTypeFilter, MASKBOARDTYPEGENUINE);
if (hItemChanged == hFilterOtherFamily) _ToggleGameListing(nLoadMenuFamilyFilter, MASKFAMILYOTHER);
@@ -2828,6 +2792,17 @@ static INT_PTR CALLBACK DialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lP
break;
}
case GAMESEL_MENU_ROMDATA: { // Export to RomData template
if (bDrvSelected) {
RomDataExportTemplate(hSelDlg, nDialogSelect);
}
else {
MessageBox(hSelDlg, FBALoadStringEx(hAppInst, IDS_ERR_NO_DRIVER_SELECTED, true), FBALoadStringEx(hAppInst, IDS_ERR_ERROR, true), MB_OK);
}
break;
}
}
}
@@ -3521,6 +3496,7 @@ int SelDialog(int nMVSCartsOnly, HWND hParentWND)
hParent = hParentWND;
nShowMVSCartsOnly = nMVSCartsOnly;
RomDataStateBackup();
FBADialogBox(hAppInst, MAKEINTRESOURCE(IDD_SELNEW), hParent, (DLGPROC)DialogProc);
+7 -1
View File
@@ -207,7 +207,6 @@ BEGIN
IDS_SEL_NGP "Neo Geo Pocket"
IDS_SEL_CHANNELF "Fairchild Channel F"
IDS_SEL_ASTROHOME "Bally Astrocade"
IDS_SEL_ROMDATA "RomData"
IDS_SEL_SPECTRUM "ZX Spectrum"
IDS_SEL_MIDWAY "Midway"
IDS_SEL_CAPCOM_GRP "Capcom"
@@ -268,6 +267,13 @@ BEGIN
IDS_NGCD_TITLE "Title"
IDS_NGCD_NGCDID "NGCD-ID"
IDS_ROMDATAMANAGER_TITLE "%s%sRomData Manager%sSelect Game"
IDS_ROMDATA_DATPATH "Dat path"
IDS_ROMDATA_ROMSET "Romset"
IDS_ROMDATA_DRIVER "Driver"
IDS_ROMDATA_HARDWARE_DESC "%s"
IDS_ROMDATA_FULLNAME "Game"
IDS_MENU_0 "&Arcade"
IDS_MENU_1 "&Other..."
IDS_MENU_2 "&Other Gamma value..."