From 0edbcdc955b6ccf1fced9debe83815b2c1bb51d6 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 29 Dec 2012 02:56:27 -0800 Subject: [PATCH] Fix some missing things / bugs in save states. --- Core/Dialog/PSPMsgDialog.cpp | 1 + Core/Dialog/PSPOskDialog.cpp | 1 + Core/Dialog/PSPSaveDialog.cpp | 6 ++++- Core/Dialog/SavedataParam.cpp | 7 ++++++ Core/HLE/sceIo.cpp | 1 + Core/HLE/sceKernelMemory.cpp | 8 ++++++- Core/HLE/sceKernelVTimer.cpp | 41 +++++++++++++++++------------------ 7 files changed, 42 insertions(+), 23 deletions(-) diff --git a/Core/Dialog/PSPMsgDialog.cpp b/Core/Dialog/PSPMsgDialog.cpp index a5ef5ceb6e..f7e0dd79e2 100644 --- a/Core/Dialog/PSPMsgDialog.cpp +++ b/Core/Dialog/PSPMsgDialog.cpp @@ -208,6 +208,7 @@ int PSPMsgDialog::Shutdown() void PSPMsgDialog::DoState(PointerWrap &p) { + PSPDialog::DoState(p); p.Do(display); p.Do(messageDialog); p.Do(messageDialogAddr); diff --git a/Core/Dialog/PSPOskDialog.cpp b/Core/Dialog/PSPOskDialog.cpp index abe367b96e..00b539fc4b 100644 --- a/Core/Dialog/PSPOskDialog.cpp +++ b/Core/Dialog/PSPOskDialog.cpp @@ -236,6 +236,7 @@ int PSPOskDialog::Update() void PSPOskDialog::DoState(PointerWrap &p) { + PSPDialog::DoState(p); p.Do(oskParams); p.Do(oskData); p.Do(oskDesc); diff --git a/Core/Dialog/PSPSaveDialog.cpp b/Core/Dialog/PSPSaveDialog.cpp index 4c02582986..b9ee98b671 100644 --- a/Core/Dialog/PSPSaveDialog.cpp +++ b/Core/Dialog/PSPSaveDialog.cpp @@ -708,11 +708,15 @@ int PSPSaveDialog::Shutdown() void PSPSaveDialog::DoState(PointerWrap &p) { + PSPDialog::DoState(p); p.Do(display); param.DoState(p); p.Do(request); // Just reset it. - param.SetPspParam(&request); + bool hasParam = param.GetPspParam() != NULL; + p.Do(hasParam); + if (hasParam) + param.SetPspParam(&request); p.Do(requestAddr); p.Do(currentSelectedSave); p.Do(yesnoChoice); diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 4abafe0c73..a0d23714ec 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -482,6 +482,7 @@ int SavedataParam::SetPspParam(SceUtilitySavedataParam *param) Clear(); saveDataList = new SaveFileInfo[1]; + saveDataListCount = 1; // get and stock file info for each file DEBUG_LOG(HLE,"Name : %s",GetSaveName(param).c_str()); @@ -608,6 +609,12 @@ void SavedataParam::DoState(PointerWrap &p) p.Do(selectedSave); p.Do(saveDataListCount); p.Do(saveNameListDataCount); + if (p.mode == p.MODE_READ) + { + if (saveDataList != NULL) + delete [] saveDataList; + saveDataList = new SaveFileInfo[saveDataListCount]; + } p.DoArray(saveDataList, saveDataListCount); p.DoMarker("SavedataParam"); } diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index a7f8e00564..c3b1386894 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -865,6 +865,7 @@ public: virtual void DoState(PointerWrap &p) { p.Do(name); + p.Do(index); // TODO: Is this the right way for it to wake up? int count = listing.size(); diff --git a/Core/HLE/sceKernelMemory.cpp b/Core/HLE/sceKernelMemory.cpp index 9ac86fc5ae..bce9a5cec3 100644 --- a/Core/HLE/sceKernelMemory.cpp +++ b/Core/HLE/sceKernelMemory.cpp @@ -55,6 +55,12 @@ struct NativeFPL //FPL - Fixed Length Dynamic Memory Pool - every item has the same length struct FPL : public KernelObject { + FPL() : blocks(NULL) {} + ~FPL() { + if (blocks != NULL) { + delete [] blocks; + } + } const char *GetName() {return nf.name;} const char *GetTypeName() {return "FPL";} static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_UNKNOWN_FPLID; } @@ -400,7 +406,7 @@ public: virtual void DoState(PointerWrap &p) { p.Do(address); - p.Do(name); + p.DoArray(name, sizeof(name)); p.DoMarker("PMB"); } diff --git a/Core/HLE/sceKernelVTimer.cpp b/Core/HLE/sceKernelVTimer.cpp index 35174f34f1..1d6fb67f89 100644 --- a/Core/HLE/sceKernelVTimer.cpp +++ b/Core/HLE/sceKernelVTimer.cpp @@ -23,25 +23,8 @@ // VTIMER ////////////////////////////////////////////////////////////////////////// -struct VTimer : public KernelObject +struct NativeVTimer { - const char *GetName() {return name;} - const char *GetTypeName() {return "VTimer";} - static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_UNKNOWN_VTID; } - int GetIDType() const { return SCE_KERNEL_TMID_VTimer; } - - virtual void DoState(PointerWrap &p) - { - p.Do(size); - p.Do(name); - p.Do(startTime); - p.Do(running); - p.Do(handler); - p.Do(handlerTime); - p.Do(argument); - p.DoMarker("VTimer"); - } - SceSize size; char name[KERNELOBJECT_MAX_NAME_LENGTH+1]; u64 startTime; @@ -51,6 +34,22 @@ struct VTimer : public KernelObject u32 argument; }; +struct VTimer : public KernelObject +{ + const char *GetName() {return nvt.name;} + const char *GetTypeName() {return "VTimer";} + static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_UNKNOWN_VTID; } + int GetIDType() const { return SCE_KERNEL_TMID_VTimer; } + + virtual void DoState(PointerWrap &p) + { + p.Do(nvt); + p.DoMarker("VTimer"); + } + + NativeVTimer nvt; +}; + KernelObject *__KernelVTimerObject() { return new VTimer; @@ -64,9 +63,9 @@ void sceKernelCreateVTimer() VTimer *vt = new VTimer(); SceUID uid = kernelObjects.Create(vt); - strncpy(vt->name, name, 32); - vt->running = true; - vt->startTime = 0; //TODO fix + strncpy(vt->nvt.name, name, 32); + vt->nvt.running = true; + vt->nvt.startTime = 0; //TODO fix RETURN(uid); //TODO: return timer ID }