mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-02-08 23:07:31 +00:00
* Correct Autoload / Autosave problem
* WIP Save function 8 and 11
This commit is contained in:
parent
9b2939d5a4
commit
f5801916c7
@ -42,11 +42,11 @@ void PSPSaveDialog::Init(int paramAddr)
|
||||
{
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_AUTOLOAD:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_LOAD:
|
||||
DEBUG_LOG(HLE, "Loading. Title: %s Save: %s File: %s", param.GetPspParam()->gameName, param.GetPspParam()->saveName, param.GetPspParam()->fileName);
|
||||
DEBUG_LOG(HLE, "Loading. Title: %s Save: %s File: %s", param.GetGameName(param.GetPspParam()).c_str(), param.GetSaveName(param.GetPspParam()).c_str(), param.GetFileName(param.GetPspParam()).c_str());
|
||||
display = DS_NONE;
|
||||
break;
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_LISTLOAD:
|
||||
DEBUG_LOG(HLE, "Loading. Title: %s Save: %s File: %s", param.GetPspParam()->gameName, param.GetPspParam()->saveName, param.GetPspParam()->fileName);
|
||||
DEBUG_LOG(HLE, "Loading. Title: %s Save: %s File: %s", param.GetGameName(param.GetPspParam()).c_str(), param.GetGameName(param.GetPspParam()).c_str(), param.GetFileName(param.GetPspParam()).c_str());
|
||||
if(param.GetFilenameCount() == 0)
|
||||
display = DS_LOAD_NODATA;
|
||||
else
|
||||
@ -54,25 +54,31 @@ void PSPSaveDialog::Init(int paramAddr)
|
||||
break;
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_AUTOSAVE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_SAVE:
|
||||
DEBUG_LOG(HLE, "Saving. Title: %s Save: %s File: %s", param.GetPspParam()->gameName, param.GetPspParam()->saveName, param.GetPspParam()->fileName);
|
||||
DEBUG_LOG(HLE, "Saving. Title: %s Save: %s File: %s", param.GetGameName(param.GetPspParam()).c_str(), param.GetGameName(param.GetPspParam()).c_str(), param.GetFileName(param.GetPspParam()).c_str());
|
||||
display = DS_NONE;
|
||||
break;
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_LISTSAVE:
|
||||
DEBUG_LOG(HLE, "Saving. Title: %s Save: %s File: %s", param.GetPspParam()->gameName, param.GetPspParam()->saveName, param.GetPspParam()->fileName);
|
||||
DEBUG_LOG(HLE, "Saving. Title: %s Save: %s File: %s", param.GetGameName(param.GetPspParam()).c_str(), param.GetGameName(param.GetPspParam()).c_str(), param.GetFileName(param.GetPspParam()).c_str());
|
||||
display = DS_SAVE_LIST_CHOICE;
|
||||
break;
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_LISTDELETE:
|
||||
DEBUG_LOG(HLE, "Delete. Title: %s Save: %s File: %s", param.GetPspParam()->gameName, param.GetPspParam()->saveName, param.GetPspParam()->fileName);
|
||||
DEBUG_LOG(HLE, "Delete. Title: %s Save: %s File: %s", param.GetGameName(param.GetPspParam()).c_str(), param.GetGameName(param.GetPspParam()).c_str(), param.GetFileName(param.GetPspParam()).c_str());
|
||||
if(param.GetFilenameCount() == 0)
|
||||
display = DS_DELETE_NODATA;
|
||||
else
|
||||
display = DS_DELETE_LIST_CHOICE;
|
||||
break;
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_DELETE: // This run on PSP display a list of all save on the PSP. Weird.
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_SIZES:
|
||||
display = DS_NONE;
|
||||
break;
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_LIST:
|
||||
display = DS_NONE;
|
||||
break;
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_DELETE: // This run on PSP display a list of all save on the PSP. Weird.
|
||||
default:
|
||||
{
|
||||
ERROR_LOG(HLE, "Load/Save function %d not coded. Title: %s Save: %s File: %s", param.GetPspParam()->mode, param.GetPspParam()->gameName, param.GetPspParam()->saveName, param.GetPspParam()->fileName);
|
||||
ERROR_LOG(HLE, "Load/Save function %d not coded. Title: %s Save: %s File: %s", param.GetPspParam()->mode, param.GetGameName(param.GetPspParam()).c_str(), param.GetGameName(param.GetPspParam()).c_str(), param.GetFileName(param.GetPspParam()).c_str());
|
||||
param.GetPspParam()->result = 0;
|
||||
display = DS_NONE;
|
||||
return; // Return 0 should allow the game to continue, but missing function must be implemented and returning the right value or the game can block.
|
||||
}
|
||||
@ -85,36 +91,36 @@ void PSPSaveDialog::Init(int paramAddr)
|
||||
lastButtons = __CtrlPeekButtons();
|
||||
|
||||
/*INFO_LOG(HLE,"Dump Param :");
|
||||
INFO_LOG(HLE,"size : %d",param->size);
|
||||
INFO_LOG(HLE,"language : %d",param->language);
|
||||
INFO_LOG(HLE,"buttonSwap : %d",param->buttonSwap);
|
||||
INFO_LOG(HLE,"result : %d",param->result);
|
||||
INFO_LOG(HLE,"mode : %d",param->mode);
|
||||
INFO_LOG(HLE,"bind : %d",param->bind);
|
||||
INFO_LOG(HLE,"overwriteMode : %d",param->overwriteMode);
|
||||
INFO_LOG(HLE,"gameName : %s",param->gameName);
|
||||
INFO_LOG(HLE,"saveName : %s",param->saveName);
|
||||
INFO_LOG(HLE,"saveNameList : %08x",*((unsigned int*)¶m->saveNameList));
|
||||
INFO_LOG(HLE,"fileName : %s",param->fileName);
|
||||
INFO_LOG(HLE,"dataBuf : %08x",*((unsigned int*)¶m->dataBuf));
|
||||
INFO_LOG(HLE,"dataBufSize : %u",param->dataBufSize);
|
||||
INFO_LOG(HLE,"dataSize : %u",param->dataSize);
|
||||
INFO_LOG(HLE,"size : %d",param.GetPspParam()->size);
|
||||
INFO_LOG(HLE,"language : %d",param.GetPspParam()->language);
|
||||
INFO_LOG(HLE,"buttonSwap : %d",param.GetPspParam()->buttonSwap);
|
||||
INFO_LOG(HLE,"result : %d",param.GetPspParam()->result);
|
||||
INFO_LOG(HLE,"mode : %d",param.GetPspParam()->mode);
|
||||
INFO_LOG(HLE,"bind : %d",param.GetPspParam()->bind);
|
||||
INFO_LOG(HLE,"overwriteMode : %d",param.GetPspParam()->overwriteMode);
|
||||
INFO_LOG(HLE,"gameName : %s",param.GetGameName(param.GetPspParam()).c_str());
|
||||
INFO_LOG(HLE,"saveName : %s",param.GetPspParam()->saveName);
|
||||
INFO_LOG(HLE,"saveNameList : %08x",*((unsigned int*)¶m.GetPspParam()->saveNameList));
|
||||
INFO_LOG(HLE,"fileName : %s",param.GetPspParam()->fileName);
|
||||
INFO_LOG(HLE,"dataBuf : %08x",*((unsigned int*)¶m.GetPspParam()->dataBuf));
|
||||
INFO_LOG(HLE,"dataBufSize : %u",param.GetPspParam()->dataBufSize);
|
||||
INFO_LOG(HLE,"dataSize : %u",param.GetPspParam()->dataSize);
|
||||
|
||||
INFO_LOG(HLE,"sfo title : %s",param->sfoParam.title);
|
||||
INFO_LOG(HLE,"sfo savedataTitle : %s",param->sfoParam.savedataTitle);
|
||||
INFO_LOG(HLE,"sfo detail : %s",param->sfoParam.detail);
|
||||
INFO_LOG(HLE,"sfo title : %s",param.GetPspParam()->sfoParam.title);
|
||||
INFO_LOG(HLE,"sfo savedataTitle : %s",param.GetPspParam()->sfoParam.savedataTitle);
|
||||
INFO_LOG(HLE,"sfo detail : %s",param.GetPspParam()->sfoParam.detail);
|
||||
|
||||
INFO_LOG(HLE,"icon0 data : %08x",*((unsigned int*)¶m->icon0FileData.buf));
|
||||
INFO_LOG(HLE,"icon0 size : %u",param->icon0FileData.bufSize);
|
||||
INFO_LOG(HLE,"icon0 data : %08x",*((unsigned int*)¶m.GetPspParam()->icon0FileData.buf));
|
||||
INFO_LOG(HLE,"icon0 size : %u",param.GetPspParam()->icon0FileData.bufSize);
|
||||
|
||||
INFO_LOG(HLE,"icon1 data : %08x",*((unsigned int*)¶m->icon1FileData.buf));
|
||||
INFO_LOG(HLE,"icon1 size : %u",param->icon1FileData.bufSize);
|
||||
INFO_LOG(HLE,"icon1 data : %08x",*((unsigned int*)¶m.GetPspParam()->icon1FileData.buf));
|
||||
INFO_LOG(HLE,"icon1 size : %u",param.GetPspParam()->icon1FileData.bufSize);
|
||||
|
||||
INFO_LOG(HLE,"pic1 data : %08x",*((unsigned int*)¶m->pic1FileData.buf));
|
||||
INFO_LOG(HLE,"pic1 size : %u",param->pic1FileData.bufSize);
|
||||
INFO_LOG(HLE,"pic1 data : %08x",*((unsigned int*)¶m.GetPspParam()->pic1FileData.buf));
|
||||
INFO_LOG(HLE,"pic1 size : %u",param.GetPspParam()->pic1FileData.bufSize);
|
||||
|
||||
INFO_LOG(HLE,"snd0 data : %08x",*((unsigned int*)¶m->snd0FileData.buf));
|
||||
INFO_LOG(HLE,"snd0 size : %u",param->snd0FileData.bufSize);*/
|
||||
INFO_LOG(HLE,"snd0 data : %08x",*((unsigned int*)¶m.GetPspParam()->snd0FileData.buf));
|
||||
INFO_LOG(HLE,"snd0 size : %u",param.GetPspParam()->snd0FileData.bufSize);*/
|
||||
|
||||
}
|
||||
|
||||
@ -194,7 +200,7 @@ void PSPSaveDialog::DisplaySaveDataInfo1()
|
||||
else
|
||||
{
|
||||
char txt[1024];
|
||||
sprintf(txt,"%s\nSize : %d",param.GetFilename(currentSelectedSave),param.GetFileInfo(currentSelectedSave).size);
|
||||
sprintf(txt,"%s\nSize : %d",param.GetFilename(currentSelectedSave).c_str(),param.GetFileInfo(currentSelectedSave).size);
|
||||
std::string saveinfoTxt = txt;
|
||||
PPGeDrawText(saveinfoTxt.c_str(), 200, 100, PPGE_ALIGN_LEFT, 0.5f, 0xFFFFFFFF);
|
||||
}
|
||||
@ -208,7 +214,7 @@ void PSPSaveDialog::DisplaySaveDataInfo2()
|
||||
else
|
||||
{
|
||||
char txt[1024];
|
||||
sprintf(txt,"%s\nSize : %d",param.GetFilename(currentSelectedSave),param.GetFileInfo(currentSelectedSave).size);
|
||||
sprintf(txt,"%s\nSize : %d",param.GetFilename(currentSelectedSave).c_str(),param.GetFileInfo(currentSelectedSave).size);
|
||||
std::string saveinfoTxt = txt;
|
||||
PPGeDrawText(saveinfoTxt.c_str(), 10, 180, PPGE_ALIGN_LEFT, 0.5f, 0xFFFFFFFF);
|
||||
}
|
||||
@ -573,16 +579,32 @@ void PSPSaveDialog::Update()
|
||||
{
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_LOAD: // Only load and exit
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_AUTOLOAD:
|
||||
param.Save(param.GetPspParam(),param.GetSelectedSave());
|
||||
if(param.Load(param.GetPspParam(),param.GetSelectedSave()))
|
||||
param.GetPspParam()->result = 0;
|
||||
else
|
||||
param.GetPspParam()->result = SCE_UTILITY_SAVEDATA_ERROR_LOAD_NO_DATA;
|
||||
status = SCE_UTILITY_STATUS_FINISHED;
|
||||
return;
|
||||
break;
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_SAVE: // Only save and exit
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_AUTOSAVE:
|
||||
param.Load(param.GetPspParam(),param.GetSelectedSave());
|
||||
if(param.Save(param.GetPspParam(),param.GetSelectedSave()))
|
||||
param.GetPspParam()->result = 0;
|
||||
else
|
||||
param.GetPspParam()->result = SCE_UTILITY_SAVEDATA_ERROR_SAVE_MS_NOSPACE;
|
||||
status = SCE_UTILITY_STATUS_FINISHED;
|
||||
return;
|
||||
break;
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_SIZES:
|
||||
param.GetSizes(param.GetPspParam());
|
||||
param.GetPspParam()->result = SCE_UTILITY_SAVEDATA_ERROR_SIZES_NO_DATA;
|
||||
status = SCE_UTILITY_STATUS_FINISHED;
|
||||
return;
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_LIST:
|
||||
param.GetList(param.GetPspParam());
|
||||
param.GetPspParam()->result = 0;
|
||||
status = SCE_UTILITY_STATUS_FINISHED;
|
||||
return;
|
||||
default:
|
||||
status = SCE_UTILITY_STATUS_FINISHED;
|
||||
return;
|
||||
|
@ -50,13 +50,36 @@ std::string SavedataParam::GetSaveFilePath(SceUtilitySavedataParam* param, int s
|
||||
return "";
|
||||
}
|
||||
|
||||
std::string dirPath = std::string(param->gameName)+param->saveName;
|
||||
std::string dirPath = GetGameName(param)+GetSaveName(param);
|
||||
if(saveId >= 0 && saveNameListDataCount > 0) // if user selection, use it
|
||||
dirPath = std::string(param->gameName)+GetFilename(saveId);
|
||||
dirPath = std::string(GetGameName(param))+GetFilename(saveId);
|
||||
|
||||
return savePath + dirPath;
|
||||
}
|
||||
|
||||
std::string SavedataParam::GetGameName(SceUtilitySavedataParam* param)
|
||||
{
|
||||
char gameName[14];
|
||||
memcpy(gameName,param->gameName,13);
|
||||
gameName[13] = 0;
|
||||
return gameName;
|
||||
}
|
||||
|
||||
std::string SavedataParam::GetSaveName(SceUtilitySavedataParam* param)
|
||||
{
|
||||
char saveName[21];
|
||||
memcpy(saveName,param->saveName,20);
|
||||
saveName[20] = 0;
|
||||
return saveName;
|
||||
}
|
||||
|
||||
std::string SavedataParam::GetFileName(SceUtilitySavedataParam* param)
|
||||
{
|
||||
char fileName[14];
|
||||
memcpy(fileName,param->fileName,13);
|
||||
fileName[13] = 0;
|
||||
return fileName;
|
||||
}
|
||||
|
||||
bool SavedataParam::Delete(SceUtilitySavedataParam* param, int saveId)
|
||||
{
|
||||
@ -91,7 +114,7 @@ bool SavedataParam::Save(SceUtilitySavedataParam* param, int saveId)
|
||||
if(!pspFileSystem.GetFileInfo(dirPath).exists)
|
||||
pspFileSystem.MkDir(dirPath);
|
||||
|
||||
std::string filePath = dirPath+"/"+param->fileName;
|
||||
std::string filePath = dirPath+"/"+GetFileName(param);
|
||||
INFO_LOG(HLE,"Saving file with size %u in %s",param->dataBufSize,filePath.c_str());
|
||||
unsigned int handle = pspFileSystem.OpenFile(filePath,(FileAccess)(FILEACCESS_WRITE | FILEACCESS_CREATE));
|
||||
if(handle == 0)
|
||||
@ -164,7 +187,7 @@ bool SavedataParam::Load(SceUtilitySavedataParam* param, int saveId)
|
||||
u8* data_ = (u8*)Memory::GetPointer(*((unsigned int*)¶m->dataBuf));
|
||||
|
||||
std::string dirPath = GetSaveFilePath(param, saveId);
|
||||
if(saveId >= 0) // if user selection, use it
|
||||
if(saveId >= 0 && saveNameListDataCount > 0) // if user selection, use it
|
||||
{
|
||||
if(saveDataList[saveId].size == 0) // don't read no existing file
|
||||
{
|
||||
@ -172,7 +195,7 @@ bool SavedataParam::Load(SceUtilitySavedataParam* param, int saveId)
|
||||
}
|
||||
}
|
||||
|
||||
std::string filePath = dirPath+"/"+param->fileName;
|
||||
std::string filePath = dirPath+"/"+GetFileName(param);
|
||||
INFO_LOG(HLE,"Loading file with size %u in %s",param->dataBufSize,filePath.c_str());
|
||||
u32 handle = pspFileSystem.OpenFile(filePath,FILEACCESS_READ);
|
||||
if(!handle)
|
||||
@ -188,6 +211,51 @@ bool SavedataParam::Load(SceUtilitySavedataParam* param, int saveId)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SavedataParam::GetSizes(SceUtilitySavedataParam* param)
|
||||
{
|
||||
if (!param) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(Memory::IsValidAddress(param->msFree))
|
||||
{
|
||||
Memory::Write_U32(32768,param->msFree);
|
||||
Memory::Write_U32(32768,param->msFree+4);
|
||||
Memory::Write_U32(1048576,param->msFree+8);
|
||||
Memory::Write_U8(0,param->msFree+12);
|
||||
}
|
||||
if(Memory::IsValidAddress(param->msData))
|
||||
{
|
||||
Memory::Write_U32(0,param->msData+36);
|
||||
Memory::Write_U32(0,param->msData+40);
|
||||
Memory::Write_U8(0,param->msData+44);
|
||||
Memory::Write_U32(0,param->msData+52);
|
||||
Memory::Write_U8(0,param->msData+56);
|
||||
}
|
||||
if(Memory::IsValidAddress(param->utilityData))
|
||||
{
|
||||
Memory::Write_U32(13,param->utilityData);
|
||||
Memory::Write_U32(416,param->utilityData+4);
|
||||
Memory::Write_U8(0,param->utilityData+8);
|
||||
Memory::Write_U32(416,param->utilityData+16);
|
||||
Memory::Write_U8(0,param->utilityData+20);
|
||||
}
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
bool SavedataParam::GetList(SceUtilitySavedataParam* param)
|
||||
{
|
||||
if (!param) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(Memory::IsValidAddress(param->idListAddr))
|
||||
{
|
||||
Memory::Write_U32(0,param->idListAddr+4);
|
||||
}
|
||||
}
|
||||
|
||||
void SavedataParam::SetPspParam(SceUtilitySavedataParam* param)
|
||||
{
|
||||
pspParam = param;
|
||||
@ -221,7 +289,7 @@ void SavedataParam::SetPspParam(SceUtilitySavedataParam* param)
|
||||
{
|
||||
DEBUG_LOG(HLE,"Name : %s",saveNameListData[i]);
|
||||
|
||||
std::string fileDataPath = savePath+"/"+param->gameName+saveNameListData[i]+"/"+param->fileName;
|
||||
std::string fileDataPath = savePath+"/"+GetGameName(param)+saveNameListData[i]+"/"+GetFileName(param);
|
||||
PSPFileInfo info = pspFileSystem.GetFileInfo(fileDataPath);
|
||||
if(info.exists)
|
||||
{
|
||||
@ -262,9 +330,12 @@ const SaveFileInfo& SavedataParam::GetFileInfo(int idx)
|
||||
{
|
||||
return saveDataList[idx];
|
||||
}
|
||||
char* SavedataParam::GetFilename(int idx)
|
||||
std::string SavedataParam::GetFilename(int idx)
|
||||
{
|
||||
return saveDataList[idx].saveName;
|
||||
char fileName[21];
|
||||
memcpy(fileName,saveDataList[idx].saveName,20);
|
||||
fileName[20] = 0;
|
||||
return fileName;
|
||||
}
|
||||
|
||||
int SavedataParam::GetSelectedSave()
|
||||
|
@ -30,7 +30,8 @@ enum SceUtilitySavedataType
|
||||
SCE_UTILITY_SAVEDATA_TYPE_LISTSAVE = 5,
|
||||
SCE_UTILITY_SAVEDATA_TYPE_LISTDELETE = 6,
|
||||
SCE_UTILITY_SAVEDATA_TYPE_DELETE = 7,
|
||||
SCE_UTILITY_SAVEDATA_TYPE_SIZES = 8
|
||||
SCE_UTILITY_SAVEDATA_TYPE_SIZES = 8,
|
||||
SCE_UTILITY_SAVEDATA_TYPE_LIST = 11
|
||||
} ;
|
||||
|
||||
// title, savedataTitle, detail: parts of the unencrypted SFO
|
||||
@ -92,7 +93,29 @@ struct SceUtilitySavedataParam
|
||||
PspUtilitySavedataFileData pic1FileData;
|
||||
PspUtilitySavedataFileData snd0FileData;
|
||||
|
||||
unsigned char unknown17[4];
|
||||
int newData;
|
||||
int focus;
|
||||
int abortStatus;
|
||||
|
||||
// Function SCE_UTILITY_SAVEDATA_TYPE_SIZES
|
||||
int msFree;
|
||||
int msData;
|
||||
int utilityData;
|
||||
|
||||
char key[16];
|
||||
|
||||
int secureVersion;
|
||||
int multiStatus;
|
||||
|
||||
// Function 11 LIST
|
||||
int idListAddr;
|
||||
|
||||
// Function 12 FILES
|
||||
int fileListAddr;
|
||||
|
||||
// Function 22 GETSIZES
|
||||
int sizeAddr;
|
||||
|
||||
};
|
||||
|
||||
struct SaveFileInfo
|
||||
@ -110,6 +133,12 @@ public:
|
||||
bool Delete(SceUtilitySavedataParam* param, int saveId = -1);
|
||||
bool Save(SceUtilitySavedataParam* param, int saveId = -1);
|
||||
bool Load(SceUtilitySavedataParam* param, int saveId = -1);
|
||||
bool GetSizes(SceUtilitySavedataParam* param);
|
||||
bool GetList(SceUtilitySavedataParam* param);
|
||||
|
||||
std::string GetGameName(SceUtilitySavedataParam* param);
|
||||
std::string GetSaveName(SceUtilitySavedataParam* param);
|
||||
std::string GetFileName(SceUtilitySavedataParam* param);
|
||||
|
||||
SavedataParam();
|
||||
|
||||
@ -118,7 +147,7 @@ public:
|
||||
|
||||
int GetFilenameCount();
|
||||
const SaveFileInfo& GetFileInfo(int idx);
|
||||
char* GetFilename(int idx);
|
||||
std::string GetFilename(int idx);
|
||||
|
||||
int GetSelectedSave();
|
||||
void SetSelectedSave(int idx);
|
||||
|
Loading…
x
Reference in New Issue
Block a user