mirror of
https://github.com/dborth/snes9xgx.git
synced 2024-11-27 13:04:21 +01:00
memcard / DVD / other bug fixes
This commit is contained in:
parent
d253f9f590
commit
62e6fab1ad
@ -362,22 +362,22 @@ ParseDVDdirectory ()
|
||||
* DirectorySearch
|
||||
*
|
||||
* Searches for the directory name specified within the current directory
|
||||
* Returns the index of the directory, or 0 if not found
|
||||
* Returns the index of the directory, or -1 if not found
|
||||
*/
|
||||
int DirectorySearch(char dir[512])
|
||||
{
|
||||
for (int i = 0; i < maxfiles; i++ )
|
||||
if (strcmp(filelist[i].filename, dir) == 0)
|
||||
return i;
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* SwitchDVDFolder
|
||||
*
|
||||
* Function to switch to the directory snes9x/roms, if it exists
|
||||
* Also loads the folder contents
|
||||
* Recursively searches for any directory path 'dir' specified
|
||||
* Also loads the directory contents via ParseDVDdirectory()
|
||||
* It relies on dvddir, dvddirlength, and filelist being pre-populated
|
||||
*/
|
||||
bool SwitchDVDFolder(char * dir, int maxDepth)
|
||||
{
|
||||
@ -385,7 +385,7 @@ bool SwitchDVDFolder(char * dir, int maxDepth)
|
||||
return false;
|
||||
|
||||
bool lastdir = false;
|
||||
char * nextdir = 0;
|
||||
char * nextdir = NULL;
|
||||
unsigned int t = strcspn(dir, "/");
|
||||
|
||||
if(t != strlen(dir))
|
||||
@ -396,7 +396,8 @@ bool SwitchDVDFolder(char * dir, int maxDepth)
|
||||
dir[t] = 0;
|
||||
|
||||
int dirindex = DirectorySearch(dir);
|
||||
if(dirindex)
|
||||
|
||||
if(dirindex >= 0)
|
||||
{
|
||||
dvddir = filelist[dirindex].offset;
|
||||
dvddirlength = filelist[dirindex].length;
|
||||
@ -410,16 +411,22 @@ bool SwitchDVDFolder(char * dir, int maxDepth)
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SwitchDVDFolder(char * dir)
|
||||
bool SwitchDVDFolder(char origdir[])
|
||||
{
|
||||
// make a copy of origdir so we don't mess with original
|
||||
char dir[200];
|
||||
strcpy(dir, origdir);
|
||||
|
||||
char * dirptr = dir;
|
||||
|
||||
// strip off leading/trailing slashes on the directory path
|
||||
// we don't want to screw up our recursion!
|
||||
if(dir[0] == '/')
|
||||
dir = dir + 1;
|
||||
dirptr = dirptr + 1;
|
||||
if(dir[strlen(dir)-1] == '/')
|
||||
dir[strlen(dir)-1] = 0;
|
||||
|
||||
return SwitchDVDFolder(dir, 0);
|
||||
return SwitchDVDFolder(dirptr, 0);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -188,8 +188,8 @@ int FileSortCallback(const void *f1, const void *f2)
|
||||
}
|
||||
|
||||
/* If one is a file and one is a directory the directory is first. */
|
||||
if(((FILEENTRIES *)f1)->flags == 1 && ((FILEENTRIES *)f2)->flags == 0) return -1;
|
||||
if(((FILEENTRIES *)f1)->flags == 0 && ((FILEENTRIES *)f2)->flags == 1) return 1;
|
||||
if(((FILEENTRIES *)f1)->flags && !(((FILEENTRIES *)f2)->flags)) return -1;
|
||||
if(!(((FILEENTRIES *)f1)->flags) && ((FILEENTRIES *)f2)->flags) return 1;
|
||||
|
||||
return stricmp(((FILEENTRIES *)f1)->filename, ((FILEENTRIES *)f2)->filename);
|
||||
}
|
||||
|
@ -50,7 +50,7 @@ extern unsigned char savebuffer[];
|
||||
static int bufoffset;
|
||||
static char membuffer[MEMBUFFER];
|
||||
|
||||
char freezecomment[2][32] = { {"Snes9x GX 004 Freeze"}, {"Freeze"} };
|
||||
char freezecomment[2][32] = { {"Snes9x GX 005 Freeze"}, {"Freeze"} };
|
||||
|
||||
|
||||
/**
|
||||
@ -166,7 +166,7 @@ NGCFreezeGame (int method, bool8 silent)
|
||||
}
|
||||
else if(method == METHOD_MC_SLOTA || method == METHOD_MC_SLOTB) // MC Slot A or B
|
||||
{
|
||||
sprintf (filename, "%s.snz", Memory.ROMFilename);
|
||||
sprintf (filename, "%s.snz", Memory.ROMName);
|
||||
|
||||
ClearSaveBuffer ();
|
||||
|
||||
@ -175,7 +175,7 @@ NGCFreezeGame (int method, bool8 silent)
|
||||
memcpy (savebuffer, saveicon, woffset);
|
||||
|
||||
/*** And the freezecomment ***/
|
||||
sprintf (freezecomment[1], "%s", Memory.ROMFilename);
|
||||
sprintf (freezecomment[1], "%s", Memory.ROMName);
|
||||
memcpy (savebuffer + woffset, freezecomment, 64);
|
||||
woffset += 64;
|
||||
|
||||
@ -266,7 +266,7 @@ NGCUnfreezeGame (int method, bool8 silent)
|
||||
bufoffset = 0;
|
||||
|
||||
if(method == METHOD_AUTO)
|
||||
method = autoLoadMethod();
|
||||
method = autoSaveMethod(); // we use 'Save' because snapshot needs R/W
|
||||
|
||||
if (method == METHOD_SD || method == METHOD_USB) // SD & USB
|
||||
{
|
||||
@ -283,7 +283,7 @@ NGCUnfreezeGame (int method, bool8 silent)
|
||||
}
|
||||
else if(method == METHOD_MC_SLOTA || method == METHOD_MC_SLOTB) // MC in slot A or slot B
|
||||
{
|
||||
sprintf (filename, "%s.snz", Memory.ROMFilename);
|
||||
sprintf (filename, "%s.snz", Memory.ROMName);
|
||||
|
||||
int ret = 0;
|
||||
|
||||
|
@ -125,8 +125,6 @@ int MountCard(int cslot, bool silent)
|
||||
int ret = -1;
|
||||
int tries = 0;
|
||||
|
||||
*(unsigned long *) (0xcc006800) |= 1 << 13; // Disable Encryption
|
||||
|
||||
// Mount the card
|
||||
while ( tries < 10 && ret != 0)
|
||||
{
|
||||
@ -229,7 +227,6 @@ LoadBufferFromMC (unsigned char *buf, int slot, char *filename, bool8 silent)
|
||||
int CardError;
|
||||
unsigned int blocks;
|
||||
unsigned int SectorSize;
|
||||
char msg[80];
|
||||
int bytesleft = 0;
|
||||
int bytesread = 0;
|
||||
|
||||
@ -247,7 +244,8 @@ LoadBufferFromMC (unsigned char *buf, int slot, char *filename, bool8 silent)
|
||||
|
||||
if (!CardFileExists (filename, slot))
|
||||
{
|
||||
WaitPrompt((char*) "Unable to open file");
|
||||
if (!silent)
|
||||
WaitPrompt((char*) "Unable to open file");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -271,12 +269,6 @@ LoadBufferFromMC (unsigned char *buf, int slot, char *filename, bool8 silent)
|
||||
CARD_Read (&CardFile, buf + bytesread, SectorSize, bytesread);
|
||||
bytesleft -= SectorSize;
|
||||
bytesread += SectorSize;
|
||||
|
||||
if ( !silent )
|
||||
{
|
||||
sprintf (msg, "Read %d of %d bytes", bytesread, blocks);
|
||||
ShowProgress (msg, bytesread, blocks);
|
||||
}
|
||||
}
|
||||
CARD_Close (&CardFile);
|
||||
CARD_Unmount (slot);
|
||||
|
@ -25,8 +25,6 @@
|
||||
#include "smbop.h"
|
||||
#include "filesel.h"
|
||||
|
||||
#include "mxml.h"
|
||||
|
||||
extern unsigned char savebuffer[];
|
||||
extern int currconfig[4];
|
||||
|
||||
@ -41,82 +39,6 @@ extern unsigned int ncpadmap[];
|
||||
|
||||
char prefscomment[2][32] = { {PREFSVERSTRING}, {"Preferences"} };
|
||||
|
||||
/****************************************************************************
|
||||
* Prepare Preferences Data
|
||||
*
|
||||
* This sets up the save buffer for saving.
|
||||
****************************************************************************/
|
||||
|
||||
void CreateXmlFile(char* filename)
|
||||
{
|
||||
mxml_node_t *xml;
|
||||
mxml_node_t *data;
|
||||
mxml_node_t *group;
|
||||
|
||||
xml = mxmlNewXML("1.0");
|
||||
|
||||
data = mxmlNewElement(xml, "screen");
|
||||
|
||||
//Create Some config value
|
||||
mxmlElementSetAttr(data, "height","480");
|
||||
|
||||
mxmlElementSetAttr(data, "width","640");
|
||||
|
||||
//Lets do some sub items for funs
|
||||
group = mxmlNewElement(data, "properties");
|
||||
mxmlElementSetAttr(group, "username", "beardface");
|
||||
|
||||
mxmlElementSetAttr(group, "favorite_food", "dead babies");
|
||||
|
||||
/* now lets save the xml file to a file! */
|
||||
FILE *fp;
|
||||
fp = fopen(filename, "w");
|
||||
|
||||
mxmlSaveFile(xml, fp, MXML_NO_CALLBACK);
|
||||
|
||||
/*Time to clean up!*/
|
||||
fclose(fp);
|
||||
mxmlDelete(group);
|
||||
mxmlDelete(data);
|
||||
mxmlDelete(xml);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Prepare Preferences Data
|
||||
*
|
||||
* This sets up the save buffer for saving.
|
||||
****************************************************************************/
|
||||
|
||||
void LoadXmlFile(char* filename)
|
||||
{
|
||||
FILE *fp;
|
||||
mxml_node_t *tree;
|
||||
mxml_node_t *data;
|
||||
mxml_node_t *group;
|
||||
|
||||
/*Load our xml file! */
|
||||
fp = fopen(filename, "r");
|
||||
tree = mxmlLoadFile(NULL, fp, MXML_NO_CALLBACK);
|
||||
fclose(fp);
|
||||
|
||||
/*Load and printf our values! */
|
||||
/* As a note, its a good idea to normally check if node* is NULL */
|
||||
data = mxmlFindElement(tree, tree, "screen", NULL, NULL, MXML_DESCEND);
|
||||
|
||||
printf("Loaded following values from xml file:\n");
|
||||
printf(" Height: %s\n",mxmlElementGetAttr(data,"height"));
|
||||
printf(" Width: %s\n",mxmlElementGetAttr(data,"width"));
|
||||
|
||||
group = mxmlFindElement(tree, tree, "properties", NULL, NULL, MXML_DESCEND);
|
||||
printf(" %s's favorite food is %s\n",mxmlElementGetAttr(group, "username"), mxmlElementGetAttr(group, "favorite_food"));
|
||||
|
||||
/* Yay Done! Now lets be considerate programmers, and put memory back how
|
||||
we found it before we started playing with it...*/
|
||||
mxmlDelete(group);
|
||||
mxmlDelete(data);
|
||||
mxmlDelete(tree);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Prepare Preferences Data
|
||||
*
|
||||
|
@ -595,6 +595,11 @@ NGCReportButtons ()
|
||||
}
|
||||
|
||||
mainmenu (3); // go to game menu
|
||||
|
||||
FrameTimer = 0;
|
||||
ConfigRequested = 0;
|
||||
setFrameTimerMethod(); // set frametimer method every time a ROM is loaded
|
||||
S9xReportControllers(); // FIX
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -790,15 +795,11 @@ extern void S9xInitSync();
|
||||
void
|
||||
emulate ()
|
||||
{
|
||||
|
||||
S9xSetSoundMute (TRUE);
|
||||
AudioStart ();
|
||||
S9xInitSync();
|
||||
|
||||
FrameTimer = 0;
|
||||
ConfigRequested = 0;
|
||||
setFrameTimerMethod(); // set frametimer method every time a ROM is loaded
|
||||
S9xReportControllers(); // FIX
|
||||
|
||||
while (1)
|
||||
{
|
||||
@ -928,6 +929,9 @@ main ()
|
||||
if (!Memory.LoadROM ("VIRTUAL.ROM"))
|
||||
while (1);
|
||||
CPU.Flags = save_flags;
|
||||
|
||||
/*** Load SRAM ***/
|
||||
Memory.LoadSRAM ("DVD");
|
||||
}
|
||||
|
||||
/*** Emulate ***/
|
||||
|
@ -48,7 +48,7 @@ prepareMCsavedata ()
|
||||
memcpy (savebuffer, saveicon, offset);
|
||||
|
||||
/*** And the sramcomments ***/
|
||||
sprintf (sramcomment[1], "%s", Memory.ROMFilename);
|
||||
sprintf (sramcomment[1], "%s", Memory.ROMName);
|
||||
memcpy (savebuffer + offset, sramcomment, 64);
|
||||
offset += 64;
|
||||
|
||||
@ -81,7 +81,7 @@ prepareMCsavedata ()
|
||||
* Prepare Exportable SRAM Save Data
|
||||
*
|
||||
* This sets up the save buffer for saving in a format compatible with
|
||||
* snes9x on other platforms. This is used when saving to SD or SMB.
|
||||
* snes9x on other platforms. This is used when saving to SD / USB / SMB.
|
||||
****************************************************************************/
|
||||
int
|
||||
prepareEXPORTsavedata ()
|
||||
@ -243,7 +243,7 @@ LoadSRAM (int method, bool silent)
|
||||
ShowAction ((char*) "Loading...");
|
||||
|
||||
if(method == METHOD_AUTO)
|
||||
method = autoLoadMethod();
|
||||
method = autoSaveMethod(); // we use 'Save' because SRAM needs R/W
|
||||
|
||||
char filepath[1024];
|
||||
int offset = 0;
|
||||
@ -259,15 +259,14 @@ LoadSRAM (int method, bool silent)
|
||||
sprintf (filepath, "%s/%s.srm", GCSettings.SaveFolder, Memory.ROMFilename);
|
||||
offset = LoadBufferFromSMB (filepath, silent);
|
||||
}
|
||||
else if(method == METHOD_MC_SLOTA)
|
||||
else if(method == METHOD_MC_SLOTA || method == METHOD_MC_SLOTB)
|
||||
{
|
||||
sprintf (filepath, "%s.srm", Memory.ROMFilename);
|
||||
offset = LoadBufferFromMC (savebuffer, CARD_SLOTA, filepath, silent);
|
||||
}
|
||||
else if(method == METHOD_MC_SLOTB)
|
||||
{
|
||||
sprintf (filepath, "%s.srm", Memory.ROMFilename);
|
||||
offset = LoadBufferFromMC (savebuffer, CARD_SLOTB, filepath, silent);
|
||||
sprintf (filepath, "%s.srm", Memory.ROMName);
|
||||
|
||||
if(method == METHOD_MC_SLOTA)
|
||||
offset = LoadBufferFromMC (savebuffer, CARD_SLOTA, filepath, silent);
|
||||
else
|
||||
offset = LoadBufferFromMC (savebuffer, CARD_SLOTB, filepath, silent);
|
||||
}
|
||||
|
||||
if (offset > 0)
|
||||
@ -320,15 +319,14 @@ SaveSRAM (int method, bool silent)
|
||||
sprintf (filepath, "%s/%s.srm", GCSettings.SaveFolder, Memory.ROMFilename);
|
||||
offset = SaveBufferToSMB (filepath, datasize, silent);
|
||||
}
|
||||
else if(method == METHOD_MC_SLOTA)
|
||||
else if(method == METHOD_MC_SLOTA || method == METHOD_MC_SLOTB)
|
||||
{
|
||||
sprintf (filepath, "%s.srm", Memory.ROMFilename);
|
||||
offset = SaveBufferToMC (savebuffer, CARD_SLOTA, filepath, datasize, silent);
|
||||
}
|
||||
else if(method == METHOD_MC_SLOTB)
|
||||
{
|
||||
sprintf (filepath, "%s.srm", Memory.ROMFilename);
|
||||
offset = SaveBufferToMC (savebuffer, CARD_SLOTB, filepath, datasize, silent);
|
||||
sprintf (filepath, "%s.srm", Memory.ROMName);
|
||||
|
||||
if(method == METHOD_MC_SLOTA)
|
||||
offset = SaveBufferToMC (savebuffer, CARD_SLOTA, filepath, datasize, silent);
|
||||
else
|
||||
offset = SaveBufferToMC (savebuffer, CARD_SLOTB, filepath, datasize, silent);
|
||||
}
|
||||
|
||||
if (offset > 0)
|
||||
|
Loading…
Reference in New Issue
Block a user