diff options
| -rwxr-xr-x | gui/Linux.h | 1 | ||||
| -rwxr-xr-x | gui/LnxMain.c | 1 | ||||
| -rwxr-xr-x | gui/MemcardDlg.c | 13 | ||||
| -rwxr-xr-x | libpcsxcore/misc.c | 31 | ||||
| -rwxr-xr-x | libpcsxcore/plugins.c | 14 | ||||
| -rwxr-xr-x | libpcsxcore/plugins.h | 2 | ||||
| -rwxr-xr-x | libpcsxcore/psxbios.c | 14 | ||||
| -rwxr-xr-x | libpcsxcore/psxmem.c | 13 | ||||
| -rwxr-xr-x | libpcsxcore/sio.c | 53 | ||||
| -rwxr-xr-x | libpcsxcore/sio.h | 2 |
10 files changed, 84 insertions, 60 deletions
diff --git a/gui/Linux.h b/gui/Linux.h index db70a2a9..2a939050 100755 --- a/gui/Linux.h +++ b/gui/Linux.h @@ -29,6 +29,7 @@ #define DEFAULT_MEM_CARD_1 "/.pcsxr/memcards/card1.mcd" #define DEFAULT_MEM_CARD_2 "/.pcsxr/memcards/card2.mcd" #define MEMCARD_DIR "/.pcsxr/memcards/" +#define MEMCARD_PERGAME_DIR "/.pcsxr/memcards/games" #define PLUGINS_DIR "/.pcsxr/plugins/" #define PLUGINS_CFG_DIR "/.pcsxr/plugins/cfg/" #define PCSXR_DOT_DIR "/.pcsxr/" diff --git a/gui/LnxMain.c b/gui/LnxMain.c index a7f934ae..d6dd9316 100755 --- a/gui/LnxMain.c +++ b/gui/LnxMain.c @@ -83,6 +83,7 @@ static void CheckSubDir() { CreateHomeConfigDir(BIOS_DIR); CreateHomeConfigDir(MEMCARD_DIR); + CreateHomeConfigDir(MEMCARD_PERGAME_DIR); CreateHomeConfigDir(STATES_DIR); CreateHomeConfigDir(PLUGINS_DIR); CreateHomeConfigDir(PLUGINS_CFG_DIR); diff --git a/gui/MemcardDlg.c b/gui/MemcardDlg.c index d3949565..666a21e0 100755 --- a/gui/MemcardDlg.c +++ b/gui/MemcardDlg.c @@ -443,7 +443,7 @@ static int GetFreeMemcardSlot(gint target_card, gint count, u8* blocks) { return -1; } -void CopyMemcardData(gint dstmcd, char *from, char *to, gint srci, gint dsti, +void CopyMemcardData(char *from, char *to, gint srci, gint dsti, gchar *str, const u16 linkindex) { u16* linkptr; u8* checksumptr; @@ -465,11 +465,11 @@ void CopyMemcardData(gint dstmcd, char *from, char *to, gint srci, gint dsti, //printf("link = %i %i\n", dsti, linkindex); } - SaveMcd(dstmcd, (char *)str, to, dsti * 128, 128); + SaveMcd((char *)str, to, dsti * 128, 128); // data memcpy(to + dsti * 1024 * 8, from + srci * 1024 * 8, 1024 * 8); - SaveMcd(dstmcd, (char *)str, to, dsti * 1024 * 8, 1024 * 8); + SaveMcd((char *)str, to, dsti * 1024 * 8, 1024 * 8); //printf("data = %s\n", from + (srci+1) * 128); } @@ -550,7 +550,7 @@ static void OnMcd_CopyTo(GtkWidget *widget, gpointer user_data) { for (j=0; srctbl[j] > 0; j++) { // last parameter specifies link index (next block) - CopyMemcardData(dstmcd, source, destination, + CopyMemcardData(source, destination, srctbl[j], dsttbl[j], str, dsttbl[j+1]-1); //printf("count = %i, indices=(%x,%x) jindex=%i\n", count, srctbl[j], dsttbl[j], j); } @@ -622,7 +622,7 @@ static void OnMemcardDelete(GtkWidget *widget, gpointer user_data) { } *ptr = xorsum; - SaveMcd(memcard, (char *)filename, data, i * 128, 128); + SaveMcd((char *)filename, data, i * 128, 128); // Check links i = GETLINKFORBLOCK(data, i); //0...15 index when ++i at top of loop @@ -753,9 +753,6 @@ void OnConf_Mcds() { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( gtk_builder_get_object(builder, "GtkCheckButton_PerGameMcd")), Config.PerGameMcd); - // Disable it because it is not working yet - gtk_widget_set_sensitive(GTK_WIDGET( - gtk_builder_get_object(builder, "GtkCheckButton_PerGameMcd")), FALSE); LoadMcdDlg(dialog); diff --git a/libpcsxcore/misc.c b/libpcsxcore/misc.c index f54abeb6..d8a7805c 100755 --- a/libpcsxcore/misc.c +++ b/libpcsxcore/misc.c @@ -356,13 +356,9 @@ int CheckCdrom() { else Config.PsxType = PSX_TYPE_NTSC; // ntsc } - - if (Config.OverClock == 0) - { + if (Config.OverClock == 0) { PsxClockSpeed = 33868800; // 33.8688 MHz (stock) - } - else - { + } else { PsxClockSpeed = 33868800 * Config.PsxClock; } @@ -376,9 +372,22 @@ int CheckCdrom() { memset(Config.PsxExeName, 0, sizeof(Config.PsxExeName)); strncpy(Config.PsxExeName, exename, 11); - if(Config.PerGameMcd) - LoadMcds(Config.Mcd1, Config.Mcd2); - + if(Config.PerGameMcd) { + char mcd1path[MAXPATHLEN] = { '\0' }; + char mcd2path[MAXPATHLEN] = { '\0' }; +#ifdef _WINDOWS + sprintf(mcd1path, "memcards\\games\\%s-%02d.mcd", Config.PsxExeName, 1); + sprintf(mcd2path, "memcards\\games\\%s-%02d.mcd", Config.PsxExeName, 2); +#else + //lk: dot paths should not be hardcoded here, this is for testing only + sprintf(mcd1path, "%s/.pcsxr/memcards/games/%s-%02d.mcd", getenv("HOME"), Config.PsxExeName, 1); + sprintf(mcd2path, "%s/.pcsxr/memcards/games/%s-%02d.mcd", getenv("HOME"), Config.PsxExeName, 2); +#endif + strcpy(Config.Mcd1, mcd1path); + strcpy(Config.Mcd2, mcd2path); + LoadMcds(Config.Mcd1, Config.Mcd2); + } + BuildPPFCache(); LoadSBI(NULL); @@ -612,7 +621,7 @@ int SaveStateMem(const u32 id) { char name[32]; int ret = -1; - snprintf(name, 32, SHM_SS_NAME_TEMPLATE, id); + snprintf(name, sizeof(name), SHM_SS_NAME_TEMPLATE, id); int fd = shm_open(name, O_CREAT | O_RDWR | O_TRUNC, 0666); if (fd >= 0) { @@ -635,7 +644,7 @@ int LoadStateMem(const u32 id) { char name[32]; int ret = -1; - snprintf(name, 32, SHM_SS_NAME_TEMPLATE, id); + snprintf(name, sizeof(name), SHM_SS_NAME_TEMPLATE, id); int fd = shm_open(name, O_RDONLY, 0444); if (fd >= 0) { diff --git a/libpcsxcore/plugins.c b/libpcsxcore/plugins.c index 567630c8..c4fdae68 100755 --- a/libpcsxcore/plugins.c +++ b/libpcsxcore/plugins.c @@ -25,6 +25,7 @@ #include "cdriso.h" static char IsoFile[MAXPATHLEN] = ""; +static char AppPath[MAXPATHLEN] = ""; //Application path(== pcsxr.exe directory) static s64 cdOpenCaseTime = 0; GPUupdateLace GPU_updateLace; @@ -845,10 +846,23 @@ void SetIsoFile(const char *filename) { strncpy(IsoFile, filename, MAXPATHLEN); } +// Set pcsxr.exe directory. This is not contain filename(and ext)). +void SetAppPath(const char *apppath ) { + if (apppath == NULL) { + AppPath[0] = '\0'; + return; + } + strncpy(AppPath, apppath, MAXPATHLEN); +} + const char *GetIsoFile(void) { return IsoFile; } +const char *GetAppPath(void) { + return AppPath; +} + boolean UsingIso(void) { return (IsoFile[0] != '\0' || Config.Cdr[0] == '\0'); } diff --git a/libpcsxcore/plugins.h b/libpcsxcore/plugins.h index b7ba4cd3..982d0978 100755 --- a/libpcsxcore/plugins.h +++ b/libpcsxcore/plugins.h @@ -422,7 +422,9 @@ extern SIO1registerCallback SIO1_registerCallback; void CALLBACK clearDynarec(void); void SetIsoFile(const char *filename); +void SetAppPath(const char *filename); const char *GetIsoFile(void); +const char *GetAppPath(void); boolean UsingIso(void); void SetCdOpenCaseTime(s64 time); diff --git a/libpcsxcore/psxbios.c b/libpcsxcore/psxbios.c index 1249f596..61f9a463 100755 --- a/libpcsxcore/psxbios.c +++ b/libpcsxcore/psxbios.c @@ -1744,7 +1744,7 @@ static void buopen(int mcd, u8 *ptr, u8 *cfg) SysPrintf("openC %s %d\n", ptr, nblk); v0 = 1 + mcd; /* just go ahead and resave them all */ - SaveMcd(mcd, cfg, ptr, 128, 128 * 15); + SaveMcd(cfg, ptr, 128, 128 * 15); break; } /* shouldn't this return ENOSPC if i == 16? */ @@ -1839,7 +1839,7 @@ void psxBios_read() { // 0x34 ptr = Mcd##mcd##Data + offset; \ memcpy(ptr, Ra1, a2); \ FDesc[1 + mcd].offset += a2; \ - SaveMcd(mcd, Config.Mcd##mcd, Mcd##mcd##Data, offset, a2); \ + SaveMcd(Config.Mcd##mcd, Mcd##mcd##Data, offset, a2); \ if (FDesc[1 + mcd].mode & 0x8000) v0 = 0; \ else v0 = a2; \ DeliverEvent(0x11, 0x2); /* 0xf0000011, 0x0004 */ \ @@ -1936,7 +1936,7 @@ int nfile; ptr+= 0xa; \ if (pfile[0] == 0) { \ strncpy(dir->name, ptr, sizeof(dir->name)); \ - dir->name[sizeof(dir->name)] = '\0'; \ + dir->name[sizeof(dir->name) - 1] = '\0'; \ } else for (i=0; i<20; i++) { \ if (pfile[i] == ptr[i]) { \ dir->name[i] = ptr[i]; continue; } \ @@ -2023,7 +2023,7 @@ void psxBios_nextfile() { // 43 memset(ptr+0xa+namelen, 0, 0x75-namelen); \ for (j=0; j<127; j++) xor^= ptr[j]; \ ptr[127] = xor; \ - SaveMcd(mcd, Config.Mcd##mcd, Mcd##mcd##Data, 128 * i + 0xa, 0x76); \ + SaveMcd(Config.Mcd##mcd, Mcd##mcd##Data, 128 * i + 0xa, 0x76); \ v0 = 1; \ break; \ } \ @@ -2061,7 +2061,7 @@ void psxBios_rename() { // 44 if ((*ptr & 0xF0) != 0x50) continue; \ if (strcmp(Ra0+5, ptr+0xa)) continue; \ *ptr = (*ptr & 0xf) | 0xA0; \ - SaveMcd(mcd, Config.Mcd##mcd, Mcd##mcd##Data, 128 * i, 1); \ + SaveMcd(Config.Mcd##mcd, Mcd##mcd##Data, 128 * i, 1); \ SysPrintf("delete %s\n", ptr+0xa); \ v0 = 1; \ break; \ @@ -2135,10 +2135,10 @@ void psxBios__card_write() { // 0x4e if (port == 0) { memcpy(Mcd1Data + (sect * MCD_SECT_SIZE), Ra2, MCD_SECT_SIZE); - SaveMcd(1, Config.Mcd1, Mcd1Data, sect * MCD_SECT_SIZE, MCD_SECT_SIZE); + SaveMcd(Config.Mcd1, Mcd1Data, sect * MCD_SECT_SIZE, MCD_SECT_SIZE); } else { memcpy(Mcd2Data + (sect * MCD_SECT_SIZE), Ra2, MCD_SECT_SIZE); - SaveMcd(2, Config.Mcd2, Mcd2Data, sect * MCD_SECT_SIZE, MCD_SECT_SIZE); + SaveMcd(Config.Mcd2, Mcd2Data, sect * MCD_SECT_SIZE, MCD_SECT_SIZE); } DeliverEvent(0x11, 0x2); // 0xf0000011, 0x0004 diff --git a/libpcsxcore/psxmem.c b/libpcsxcore/psxmem.c index bc2a0ca0..ae2600ab 100755 --- a/libpcsxcore/psxmem.c +++ b/libpcsxcore/psxmem.c @@ -107,16 +107,22 @@ int psxMemInit() { void psxMemReset() { FILE *f = NULL; - char bios[1024]; + char bios[1024] = { '\0' }; memset(psxM, 0, 0x00200000); memset(psxP, 0, 0x00010000); // Load BIOS if (strcmp(Config.Bios, "HLE") != 0) { - sprintf(bios, "%s/%s", Config.BiosDir, Config.Bios); - f = fopen(bios, "rb"); + //AppPath's priority is high. + const char* apppath = GetAppPath(); + if( strlen(apppath) > 0 ) + strcat( strcat( strcat( bios, GetAppPath() ), "bios\\"), Config.Bios ); + else + sprintf(bios, "%s/%s", Config.BiosDir, Config.Bios); + + f = fopen(bios, "rb"); if (f == NULL) { SysMessage(_("Could not open BIOS:\"%s\". Enabling HLE Bios!\n"), bios); memset(psxR, 0, 0x80000); @@ -125,6 +131,7 @@ void psxMemReset() { fread(psxR, 1, 0x80000, f); fclose(f); Config.HLE = FALSE; + SysPrintf(_("Loaded BIOS: %s\n"), bios ); } } else Config.HLE = TRUE; } diff --git a/libpcsxcore/sio.c b/libpcsxcore/sio.c index dfa79bb1..76742352 100755 --- a/libpcsxcore/sio.c +++ b/libpcsxcore/sio.c @@ -801,11 +801,11 @@ unsigned char sioRead8() { switch (CtrlReg & 0x2002) { case 0x0002: memcpy(Mcd1Data + (adrL | (adrH << 8)) * 128, &buf[1], 128); - SaveMcd(1, Config.Mcd1, Mcd1Data, (adrL | (adrH << 8)) * 128, 128); + SaveMcd(Config.Mcd1, Mcd1Data, (adrL | (adrH << 8)) * 128, 128); break; case 0x2002: memcpy(Mcd2Data + (adrL | (adrH << 8)) * 128, &buf[1], 128); - SaveMcd(2, Config.Mcd2, Mcd2Data, (adrL | (adrH << 8)) * 128, 128); + SaveMcd(Config.Mcd2, Mcd2Data, (adrL | (adrH << 8)) * 128, 128); break; } } @@ -884,29 +884,30 @@ void sioInterrupt() { void LoadMcd(int mcd, char *str) { FILE *f; char *data = NULL; - char Mcd[MAXPATHLEN]; + char filepath[MAXPATHLEN] = { '\0' }; + const char *apppath = GetAppPath(); if (mcd == 1) data = Mcd1Data; if (mcd == 2) data = Mcd2Data; - if (Config.PerGameMcd && mcd && strlen(Config.PsxExeName)) - sprintf(Mcd, "memcards\\games\\%s-%02d.mcr", Config.PsxExeName, mcd-1); - else - strcpy(Mcd, str); - - if (*Mcd == 0) { + if (*str == 0) { SysPrintf(_("No memory card value was specified - card %i is not plugged.\n"), mcd); return; } - f = fopen(Mcd, "rb"); + + //Getting full application path. + memmove(filepath, apppath, strlen(apppath)); + strcat(filepath, str); + + f = fopen(filepath, "rb"); if (f == NULL) { - SysPrintf(_("The memory card %s doesn't exist - creating it\n"), Mcd); - CreateMcd(Mcd); - f = fopen(Mcd, "rb"); + SysPrintf(_("The memory card %s doesn't exist - creating it\n"), filepath); + CreateMcd(filepath); + f = fopen(filepath, "rb"); if (f != NULL) { struct stat buf; - if (stat(Mcd, &buf) != -1) { + if (stat(filepath, &buf) != -1) { if (buf.st_size == MCD_SIZE + 64) fseek(f, 64, SEEK_SET); else if(buf.st_size == MCD_SIZE + 3904) @@ -916,12 +917,12 @@ void LoadMcd(int mcd, char *str) { fclose(f); } else - SysMessage(_("Memory card %s failed to load!\n"), Mcd); + SysMessage(_("Memory card %s failed to load!\n"), filepath); } else { struct stat buf; - SysPrintf(_("Loading memory card %s\n"), Mcd); - if (stat(Mcd, &buf) != -1) { + SysPrintf(_("Loading memory card %s\n"), filepath); + if (stat(filepath, &buf) != -1) { if (buf.st_size == MCD_SIZE + 64) fseek(f, 64, SEEK_SET); else if(buf.st_size == MCD_SIZE + 3904) @@ -940,20 +941,14 @@ void LoadMcds(char *mcd1, char *mcd2) { LoadMcd(2, mcd2); } -void SaveMcd(int mcd, char *str, char *data, uint32_t adr, int size) { +void SaveMcd(char *mcd, char *data, uint32_t adr, int size) { FILE *f; - char Mcd[MAXPATHLEN]; - if (Config.PerGameMcd && mcd && strlen(Config.PsxExeName)) - sprintf(Mcd, "memcards\\games\\%s-%02d.mcr", Config.PsxExeName, mcd-1); - else - strcpy(Mcd, str); - - f = fopen(Mcd, "r+b"); + f = fopen(mcd, "r+b"); if (f != NULL) { struct stat buf; - if (stat(Mcd, &buf) != -1) { + if (stat(mcd, &buf) != -1) { if (buf.st_size == MCD_SIZE + 64) fseek(f, adr + 64, SEEK_SET); else if (buf.st_size == MCD_SIZE + 3904) @@ -965,9 +960,7 @@ void SaveMcd(int mcd, char *str, char *data, uint32_t adr, int size) { fwrite(data + adr, 1, size, f); fclose(f); - - SysPrintf(_("Saving memory card %s\n"), Mcd); - + SysPrintf(_("Saving memory card %s\n"), mcd); return; } @@ -980,7 +973,7 @@ void SaveMcd(int mcd, char *str, char *data, uint32_t adr, int size) { } #endif - ConvertMcd(str, data); + ConvertMcd(mcd, data); } void CreateMcd(char *mcd) { diff --git a/libpcsxcore/sio.h b/libpcsxcore/sio.h index b3897552..64993992 100755 --- a/libpcsxcore/sio.h +++ b/libpcsxcore/sio.h @@ -55,7 +55,7 @@ int sioFreeze(gzFile f, int Mode); void LoadMcd(int mcd, char *str); void LoadMcds(char *mcd1, char *mcd2); -void SaveMcd(int mcd, char *str, char *data, uint32_t adr, int size); +void SaveMcd(char *mcd, char *data, uint32_t adr, int size); void CreateMcd(char *mcd); void ConvertMcd(char *mcd, char *data); |
