Applied a series of patches by John Peterson:

- Fixed a printf statement in ConsoleDebugger.cpp.
- Fixed memory watches not breaking in CPUDebug.h.
- Added some helpful batch files to the VS2008 directory.
- Added support for automatic loading of parent ROM sets.
This commit is contained in:
John Peterson 2012-07-12 05:28:08 +00:00
parent 93b71c8429
commit 3963a7a53c
10 changed files with 154 additions and 51 deletions

View file

@ -64,13 +64,12 @@ still low.
8. Force Feedback
9. Save States and NVRAM
10. Game-Specific Comments and Tips
11. Merging Split ROM Sets
12. The Configuration File
13. Index of Command Line Options
14. Index of Configuration File Settings
15. Compiling the Source Code
16. Contact Information
17. Acknowledgments
11. The Configuration File
12. Index of Command Line Options
13. Index of Configuration File Settings
14. Compiling the Source Code
15. Contact Information
16. Acknowledgments
=======================
@ -807,38 +806,7 @@ and, in the 'Game Assignments' menu, performing the following sequence:
==============================
11. Merging Split ROM Sets
==============================
ROMs that are split into parent and child sets (eg., 'Scud Race Plus', whose
parent ROM set is 'Scud Race') must be combined into a single ZIP file. ROM
files from the parent set that have the same IC numbers (usually the file
extension but sometimes the number in the file name itself) as child ROMs
should be deleted, otherwise Supermodel may choose to load the parent game.
For example, 'Scud Race Plus' is normally distributed containing only the
following files:
epr-20092a.17
epr-20093a.18
epr-20094a.19
epr-20095a.20
epr-20096a.21
mpr-20097.13
mpr-20098.14
mpr-20099.15
mpr-20100.16
mpr-20101.24
To merge with the parent ROM set, copy over all files from 'Scud Race' except
those with extension numbers 17-21, 13-16, and 24. Some 'Scud Race Plus' ROM
sets may have 'mpr-20101.23' instead of 'mpr-20101.24'. They are the same file
and in both cases should replace the file with extension 24 from 'Scud Race'
('mpr-19671.24').
==============================
12. The Configuration File
11. The Configuration File
==============================
Supermodel reads configuration settings from 'Supermodel.ini' located in the
@ -1116,7 +1084,7 @@ option '-input-system=rawinput' and the input mappings configured for each gun.
=====================================
13. Index of Command Line Options
12. Index of Command Line Options
=====================================
All valid command line settings are listed here, ordered by category. Defaults
@ -1290,7 +1258,7 @@ not. All options are case sensitive.
============================================
14. Index of Configuration File Settings
13. Index of Configuration File Settings
============================================
All valid configuration file settings are listed here, ordered by category.
@ -1860,7 +1828,7 @@ All settings are case sensitive.
=================================
15. Compiling the Source Code
14. Compiling the Source Code
=================================
First, ensure that OpenGL, SDL (http://www.libsdl.org), and zlib
@ -1894,7 +1862,7 @@ When everything is ready, rename the appropriate Makefile to 'Makefile' and run
===========================
16. Contact Information
15. Contact Information
===========================
The official Supermodel web site is:
@ -1915,7 +1883,7 @@ We ask that you remain mindful of the following courtesies:
=======================
17. Acknowledgments
16. Acknowledgments
=======================
Numerous people contributed their precious time and energy to this project.

View file

@ -689,6 +689,8 @@ namespace Debugger
else if (mappedIO == NULL)
return;
}
if (m_break)
WaitCommand(HaltUntil);
}
inline void CCPUDebug::CheckWrite(UINT32 addr, unsigned dataSize, UINT64 data)
@ -735,6 +737,8 @@ namespace Debugger
}
else if (mappedIO == NULL)
return;
if (m_break)
WaitCommand(HaltUntil);
}
}
@ -777,6 +781,8 @@ namespace Debugger
CWatch *watch = (CWatch*)m_memWatchTable->Get(addr);
if (watch != NULL && watch->CheckRead(addr, dataSize, data))
MemWatchTriggered(watch, addr, dataSize, data, true);
if (m_break)
WaitCommand(HaltUntil);
}
inline void CCPUDebug::CheckRead16(UINT32 addr, UINT16 data)
@ -820,9 +826,10 @@ namespace Debugger
CWatch *watch = (CWatch*)m_memWatchTable->Get(addr);
if (watch != NULL && watch->CheckWrite(addr, dataSize, data))
MemWatchTriggered(watch, addr, dataSize, data, false);
if (m_break)
WaitCommand(HaltUntil);
}
inline void CCPUDebug::CheckWrite16(UINT32 addr, UINT16 data)
{
if ((addr&m_mem16AndMask) == m_mem16AndMask && (addr&m_mem16OrMask) == 0)
CheckWrite(addr, 2, data);

View file

@ -1030,7 +1030,7 @@ namespace Debugger
m_cpu->WriteMem(addr, size, data);
m_cpu->FormatData(dataStr, size, data);
m_cpu->FormatAddress(addrStr, addr);
Print("Set %s data at %s to %s.\n", addrStr, dataStr);
Print("Set %s data at %s to %s.\n", uSizeStr, addrStr, dataStr);
}
else if (CheckToken(token, "lo", "listios")) // listios
{

View file

@ -38,6 +38,7 @@ const struct GameInfo g_Model3GameList[] =
// Sega Bass Fishing
{
"bass",
NULL,
"Sega Bass Fishing",
"Sega",
1997,
@ -105,6 +106,7 @@ const struct GameInfo g_Model3GameList[] =
// Daytona USA 2 (Revision A)
{
"daytona2",
NULL,
"Daytona USA 2 Battle on the Edge",
"Sega",
1998,
@ -188,6 +190,7 @@ const struct GameInfo g_Model3GameList[] =
// Daytona USA 2 Power Edition
{
"dayto2pe",
NULL,
"Daytona USA 2 Power Edition",
"Sega",
1998,
@ -271,6 +274,7 @@ const struct GameInfo g_Model3GameList[] =
// Dirt Devils (Revision A)
{
"dirtdvls",
NULL,
"Dirt Devils",
"Sega",
1998,
@ -333,6 +337,7 @@ const struct GameInfo g_Model3GameList[] =
// Dirt Devils (Alt)(Revision A)
{
"dirtdvlsa",
"dirtdvls",
"Dirt Devils (Alt.)",
"Sega",
1998,
@ -395,6 +400,7 @@ const struct GameInfo g_Model3GameList[] =
// Emergency Call Ambulance
{
"eca",
NULL,
"Emergency Call Ambulance",
"Sega",
1999,
@ -464,6 +470,7 @@ const struct GameInfo g_Model3GameList[] =
// Emergency Call Ambulance (Export)
{
"ecax",
"eca",
"Emergency Call Ambulance (Export)",
"Sega",
1999,
@ -533,6 +540,7 @@ const struct GameInfo g_Model3GameList[] =
// Fighting Vipers 2 (Revision A)
{
"fvipers2",
NULL,
"Fighting Vipers 2",
"Sega",
1998,
@ -608,6 +616,7 @@ const struct GameInfo g_Model3GameList[] =
// Get Bass
{
"getbass",
NULL,
"Get Bass",
"Sega",
1997,
@ -675,6 +684,7 @@ const struct GameInfo g_Model3GameList[] =
// Harley-Davidson & L.A. Riders (Revision A)
{
"harley",
NULL,
"Harley-Davidson & L.A. Riders",
"Sega",
1997,
@ -744,6 +754,7 @@ const struct GameInfo g_Model3GameList[] =
// Harley-Davidson & L.A. Riders (Revision B)
{
"harleyb",
"harley",
"Harley-Davidson & L.A. Riders (Revision B)",
"Sega",
1997,
@ -813,6 +824,7 @@ const struct GameInfo g_Model3GameList[] =
// L.A. Machineguns
{
"lamachin",
NULL,
"L.A. Machineguns",
"Sega",
1998,
@ -882,6 +894,7 @@ const struct GameInfo g_Model3GameList[] =
// Le Mans 24
{
"lemans24",
NULL,
"Le Mans 24",
"Sega",
1997,
@ -949,6 +962,7 @@ const struct GameInfo g_Model3GameList[] =
// The Lost World
{
"lostwsga",
NULL,
"The Lost World",
"Sega",
1997,
@ -1022,6 +1036,7 @@ const struct GameInfo g_Model3GameList[] =
// Magical Truck Adventure
{
"magtruck",
NULL,
"Magical Truck Adventure",
"Sega",
1998,
@ -1079,6 +1094,7 @@ const struct GameInfo g_Model3GameList[] =
// The Ocean Hunter
{
"oceanhun",
NULL,
"The Ocean Hunter",
"Sega",
1998,
@ -1148,6 +1164,7 @@ const struct GameInfo g_Model3GameList[] =
// Scud Race (Australia)
{
"scud",
NULL,
"Scud Race (Australia)",
"Sega",
1996,
@ -1223,6 +1240,7 @@ const struct GameInfo g_Model3GameList[] =
// Scud Race (Export)
{
"scuda",
"scud",
"Scud Race (Export)",
"Sega",
1996,
@ -1298,6 +1316,7 @@ const struct GameInfo g_Model3GameList[] =
// Scud Race (Japan)
{
"scudj",
"scud",
"Scud Race (Japan)",
"Sega",
1996,
@ -1373,6 +1392,7 @@ const struct GameInfo g_Model3GameList[] =
// Scud Race Plus (Revision A)
{
"scudp",
"scud",
"Scud Race Plus",
"Sega",
1997,
@ -1454,6 +1474,7 @@ const struct GameInfo g_Model3GameList[] =
// Ski Champ
{
"skichamp",
NULL,
"Ski Champ",
"Sega",
1998,
@ -1527,6 +1548,7 @@ const struct GameInfo g_Model3GameList[] =
// Spikeout Final Edition (disabled because this is a bad dump according to MAME)
{
"spikeofe",
NULL,
"Spikeout Final Edition",
"Sega",
1999,
@ -1607,6 +1629,7 @@ const struct GameInfo g_Model3GameList[] =
// Spikeout (Revision C)
{
"spikeout",
NULL,
"Spikeout",
"Sega",
1998,
@ -1687,6 +1710,7 @@ const struct GameInfo g_Model3GameList[] =
// Sega Rally 2
{
"srally2",
NULL,
"Sega Rally 2",
"Sega",
1998,
@ -1762,6 +1786,7 @@ const struct GameInfo g_Model3GameList[] =
// Sega Rally 2 DX
{
"srally2x",
NULL,
"Sega Rally 2 DX",
"Sega",
1998,
@ -1832,6 +1857,7 @@ const struct GameInfo g_Model3GameList[] =
// Star Wars Trilogy (Revision A)
{
"swtrilgy",
NULL,
"Star Wars Trilogy (Revision A)",
"Sega, LucasArts",
1998,
@ -1904,6 +1930,7 @@ const struct GameInfo g_Model3GameList[] =
// Star Wars Trilogy
{
"swtrilgya",
"swtrilgy",
"Star Wars Trilogy",
"Sega, LucasArts",
1998,
@ -1976,6 +2003,7 @@ const struct GameInfo g_Model3GameList[] =
// Virtua Fighter 3 (Revision C)
{
"vf3",
NULL,
"Virtua Fighter 3",
"Sega",
1996,
@ -2049,6 +2077,7 @@ const struct GameInfo g_Model3GameList[] =
// Virtua Fighter 3 (Revision A)
{
"vf3a",
"vf3",
"Virtua Fighter 3 (Revision A)",
"Sega",
1996,
@ -2122,6 +2151,7 @@ const struct GameInfo g_Model3GameList[] =
// Virtua Fighter 3 Team Battle
{
"vf3tb",
"vf3",
"Virtua Fighter 3 Team Battle",
"Sega",
1996,
@ -2195,6 +2225,7 @@ const struct GameInfo g_Model3GameList[] =
// Virtual On: Oratorio Tangram (Revision B)
{
"von2",
NULL,
"Virtual On: Oratorio Tangram",
"Sega",
1998,
@ -2270,6 +2301,7 @@ const struct GameInfo g_Model3GameList[] =
// Virtual On: Oratorio Tangram (Version 5.4g)
{
"von254g",
"von2",
"Virtual On: Oratorio Tangram (Version 5.4g)",
"Sega",
1998,
@ -2345,6 +2377,7 @@ const struct GameInfo g_Model3GameList[] =
// Virtua Striker 2 (Step 2.0)
{
"vs2",
NULL,
"Virtua Striker 2 (Step 2.0)",
"Sega",
1997,
@ -2418,6 +2451,7 @@ const struct GameInfo g_Model3GameList[] =
// Virtua Striker 2 (Step 1.5)
{
"vs215",
"vs2",
"Virtua Striker 2 (Step 1.5)",
"Sega",
1997,
@ -2491,6 +2525,7 @@ const struct GameInfo g_Model3GameList[] =
// Virtua Striker 2 '98 (Step 2.0)
{
"vs298",
NULL,
"Virtua Striker 2 '98 (Step 2.0)",
"Sega",
1998,
@ -2564,6 +2599,7 @@ const struct GameInfo g_Model3GameList[] =
// Virtua Striker 2 '98 (Step 1.5)
{
"vs29815",
"vs298",
"Virtua Striker 2 '98 (Step 1.5)",
"Sega",
1998,
@ -2637,6 +2673,7 @@ const struct GameInfo g_Model3GameList[] =
// Virtua Striker 2 '99
{
"vs299",
"vs2v991",
"Virtua Striker 2 '99",
"Sega",
1999,
@ -2710,6 +2747,7 @@ const struct GameInfo g_Model3GameList[] =
// Virtua Striker 2 '99 (Revision A)
{
"vs299a",
"vs2v991",
"Virtua Striker 2 '99 (Revision A)",
"Sega",
1999,
@ -2783,6 +2821,7 @@ const struct GameInfo g_Model3GameList[] =
// Virtua Striker 2 '99 (Revision B)
{
"vs299b",
"vs2v991",
"Virtua Striker 2 '99 (Revision B)",
"Sega",
1999,
@ -2856,6 +2895,7 @@ const struct GameInfo g_Model3GameList[] =
// Virtua Striker 2 '99.1 (Revision B)
{
"vs2v991",
NULL,
"Virtua Striker 2 '99.1",
"Sega",
1999,
@ -2931,6 +2971,7 @@ const struct GameInfo g_Model3GameList[] =
"",
NULL,
NULL,
NULL,
0,
0,
0,

View file

@ -67,6 +67,7 @@ struct GameInfo
{
// Game information
const char id[10]; // 9-character game identifier (also serves as zip archive file name)
const char *parent; // parent game identifier
const char *title; // complete game title
const char *mfgName; // name of manufacturer
unsigned year; // year released (in decimal)

View file

@ -204,10 +204,11 @@ static bool LoadROM(UINT8 *buf, unsigned bufSize, const struct ROMMap *Map, cons
*/
const struct GameInfo * LoadROMSetFromZIPFile(const struct ROMMap *Map, const struct GameInfo *GameList, const char *zipFile, bool loadAll)
{
unzFile zf;
unzFile zf, zfp = NULL;
unz_file_info fileInfo;
const struct GameInfo *Game = NULL;
const struct GameInfo *CurGame; // this is the game to which the last ROM found is thought to belong
string zipFileParent, zfpErr = "";
int romIdx; // index within Game->ROM
unsigned romsFound[sizeof(Game->ROM)/sizeof(struct ROMInfo)], numROMs;
int err;
@ -263,6 +264,34 @@ const struct GameInfo * LoadROMSetFromZIPFile(const struct ROMMap *Map, const st
}
}
if (CurGame->parent)
{
// Create parent zip file name
string path = "";
if (strstr(zipFile, "/"))
{
path = string(zipFile);
path = path.substr(0, path.find_last_of("/") + 1);
}
if (strstr(zipFile, "\\"))
{
path = string(zipFile);
path = path.substr(0, path.find_last_of("\\") + 1);
}
zipFileParent = path + CurGame->parent + ".zip";
// Create error message
zfpErr = " or '" + string(zipFileParent) + "'";
// Try to open file
zfp = unzOpen(zipFileParent.c_str());
if (NULL == zfp)
{
ErrorLog("Parent ROM set '%s' is missing.", zipFileParent.c_str());
return NULL;
}
}
// Second pass: check if all ROM files for the identified game are present
err = unzGoToFirstFile(zf);
if (UNZ_OK != err)
@ -285,7 +314,30 @@ const struct GameInfo * LoadROMSetFromZIPFile(const struct ROMMap *Map, const st
// If we have found a ROM for the correct game, mark its corresponding indicator
romsFound[romIdx] = 1;
}
if (zfp)
{
err = unzGoToFirstFile(zfp);
if (UNZ_OK != err)
{
ErrorLog("Unable to read the contents of '%s' (code %X)", zipFileParent.c_str(), err);
return NULL;
}
for (; err != UNZ_END_OF_LIST_OF_FILE; err = unzGoToNextFile(zfp))
{
// Identify the file we're looking at
err = unzGetCurrentFileInfo(zfp, &fileInfo, NULL, 0, NULL, 0, NULL, 0);
if (err != UNZ_OK)
continue;
// If it's not part of the game we've identified, skip it
if (OKAY != FindROMByCRCInGame(&CurGame, &romIdx, Game, fileInfo.crc))
continue;
// If we have found a ROM for the correct game, mark its corresponding indicator
romsFound[romIdx] = 1;
}
}
// Compute how many ROM files this game has
for (numROMs = 0; Game->ROM[numROMs].region != NULL; numROMs++)
;
@ -295,11 +347,12 @@ const struct GameInfo * LoadROMSetFromZIPFile(const struct ROMMap *Map, const st
for (i = 0; i < numROMs; i++)
{
if ((0 == romsFound[i]) && !Game->ROM[i].optional) // if not found and also not optional
err |= (int) ErrorLog("'%s' (CRC=%08X) is missing from '%s'.", Game->ROM[i].fileName, Game->ROM[i].crc, zipFile);
err |= (int) ErrorLog("'%s' (CRC=%08X) is missing from '%s'%s.", Game->ROM[i].fileName, Game->ROM[i].crc, zipFile, zfp ? zfpErr.c_str() : "");
}
if (err != OKAY)
{
unzClose(zf);
if (zfp) unzClose(zfp);
return NULL;
}
@ -314,6 +367,7 @@ const struct GameInfo * LoadROMSetFromZIPFile(const struct ROMMap *Map, const st
if (NULL == buf)
{
unzClose(zf);
if (zfp) unzClose(zfp);
ErrorLog("Insufficient memory to load ROM files (%d bytes).", maxSize);
return NULL;
}
@ -341,7 +395,31 @@ const struct GameInfo * LoadROMSetFromZIPFile(const struct ROMMap *Map, const st
if (OKAY == LoadROM(buf, maxSize, Map, &Game->ROM[romIdx], zf, zipFile, loadAll))
romsFound[romIdx] = 1; // success! mark as loaded
}
if (zfp)
{
err = unzGoToFirstFile(zfp);
if (UNZ_OK != err)
{
ErrorLog("Unable to read the contents of '%s' (code %X).", zipFileParent.c_str(), err);
err = FAIL;
goto Quit;
}
for (; err != UNZ_END_OF_LIST_OF_FILE; err = unzGoToNextFile(zfp))
{
err = unzGetCurrentFileInfo(zfp, &fileInfo, NULL, 0, NULL, 0, NULL, 0);
if (err != UNZ_OK)
continue;
// If this ROM is not part of the game we're loading, skip it
if (OKAY != FindROMByCRCInGame(&CurGame, &romIdx, Game, fileInfo.crc))
continue;
// Load the ROM and mark that we did so successfully
if (OKAY == LoadROM(buf, maxSize, Map, &Game->ROM[romIdx], zfp, zipFileParent.c_str(), loadAll))
romsFound[romIdx] = 1; // success! mark as loaded
}
}
// Ensure all ROMs were loaded
if (loadAll)
{
@ -350,7 +428,7 @@ const struct GameInfo * LoadROMSetFromZIPFile(const struct ROMMap *Map, const st
for (i = 0; i < numROMs; i++)
{
if (!(romsFound[i] || Game->ROM[i].optional)) // if ROM not found and also not optional
err = ErrorLog("Could not load '%s' (CRC=%08X) from '%s'.", Game->ROM[i].fileName, Game->ROM[i].crc, zipFile);
err = ErrorLog("Could not load '%s' (CRC=%08X) from '%s'%s.", Game->ROM[i].fileName, Game->ROM[i].crc, zipFile, zfp ? zfpErr.c_str() : "");
}
}
else

View file

@ -0,0 +1,2 @@
SET CL=/DSUPERMODEL_DEBUGGER
call Build.Release.bat %1

4
VS2008/Build.Release.bat Normal file
View file

@ -0,0 +1,4 @@
call Build.bat Release x64 Supermodel %1
call Build.bat Release Win32 Supermodel %1
@echo All builds succeeded
pause

View file

@ -0,0 +1 @@
call Build.Release.Debugger.bat Rebuild

View file

@ -0,0 +1 @@
call Build.Release.bat Rebuild