From 62e6fab1adc79eaea94dd9eaea731001b8f6e25e Mon Sep 17 00:00:00 2001 From: dborth Date: Sun, 17 Aug 2008 05:25:33 +0000 Subject: [PATCH] memcard / DVD / other bug fixes --- source/ngc/dvd.cpp | 25 +++++++----- source/ngc/filesel.cpp | 4 +- source/ngc/freeze.cpp | 10 ++--- source/ngc/memcardop.cpp | 12 +----- source/ngc/preferences.cpp | 78 -------------------------------------- source/ngc/snes9xGX.cpp | 12 ++++-- source/ngc/sram.cpp | 36 +++++++++--------- 7 files changed, 50 insertions(+), 127 deletions(-) diff --git a/source/ngc/dvd.cpp b/source/ngc/dvd.cpp index 7829803..6a34333 100644 --- a/source/ngc/dvd.cpp +++ b/source/ngc/dvd.cpp @@ -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); } /**************************************************************************** diff --git a/source/ngc/filesel.cpp b/source/ngc/filesel.cpp index 5c2b9dc..3808159 100644 --- a/source/ngc/filesel.cpp +++ b/source/ngc/filesel.cpp @@ -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); } diff --git a/source/ngc/freeze.cpp b/source/ngc/freeze.cpp index 90536ab..981ad50 100644 --- a/source/ngc/freeze.cpp +++ b/source/ngc/freeze.cpp @@ -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; diff --git a/source/ngc/memcardop.cpp b/source/ngc/memcardop.cpp index d7d2ae3..ba0436a 100644 --- a/source/ngc/memcardop.cpp +++ b/source/ngc/memcardop.cpp @@ -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); diff --git a/source/ngc/preferences.cpp b/source/ngc/preferences.cpp index f302d9f..3ef3074 100644 --- a/source/ngc/preferences.cpp +++ b/source/ngc/preferences.cpp @@ -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 * diff --git a/source/ngc/snes9xGX.cpp b/source/ngc/snes9xGX.cpp index 237a56c..19e5196 100644 --- a/source/ngc/snes9xGX.cpp +++ b/source/ngc/snes9xGX.cpp @@ -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 ***/ diff --git a/source/ngc/sram.cpp b/source/ngc/sram.cpp index 76605eb..4cf118d 100644 --- a/source/ngc/sram.cpp +++ b/source/ngc/sram.cpp @@ -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)