Skip to content

Instantly share code, notes, and snippets.

@unknownbrackets
Created December 26, 2012 20:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save unknownbrackets/4382866 to your computer and use it in GitHub Desktop.
Save unknownbrackets/4382866 to your computer and use it in GitHub Desktop.
Thrown-together savedata test for PSP.
#include <common.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define sceUtilitySavedataUpdate sceUtilitySavedataUpdate_INCORRECT
#include <pspdebug.h>
#include <pspdisplay.h>
#include <pspmoduleinfo.h>
#include <psputility.h>
typedef struct SceUtilitySavedataParam2
{
pspUtilityDialogCommon base;
PspUtilitySavedataMode mode;
int bind;
int overwrite;
/** gameName: name used from the game for saves, equal for all saves */
char gameName[13];
char reserved[3];
/** saveName: name of the particular save, normally a number */
char saveName[20];
/** saveNameList: used by multiple modes */
char (*saveNameList)[20];
/** fileName: name of the data file of the game for example DATA.BIN */
char fileName[13];
char reserved1[3];
/** pointer to a buffer that will contain data file unencrypted data */
void *dataBuf;
/** size of allocated space to dataBuf */
SceSize dataBufSize;
SceSize dataSize;
PspUtilitySavedataSFOParam sfoParam;
PspUtilitySavedataFileData icon0FileData;
PspUtilitySavedataFileData icon1FileData;
PspUtilitySavedataFileData pic1FileData;
PspUtilitySavedataFileData snd0FileData;
/** Pointer to an PspUtilitySavedataListSaveNewData structure */
PspUtilitySavedataListSaveNewData *newData;
/** Initial focus for lists */
PspUtilitySavedataFocus focus;
int abortStatus;
int msFree;
int msData;
int utilityData;
/** key: encrypt/decrypt key for save with firmware >= 2.00 */
char key[16];
int secureVersion;
int multiStatus;
void *idList;
void *fileList;
void *sizeInfo;
} SceUtilitySavedataParam2;
#undef sceUtilitySavedataUpdate
extern int sceUtilitySavedataUpdate(int animSpeed);
int main(int argc, char **argv) {
SceUtilitySavedataParam2 param;
PspUtilitySavedataListSaveNewData newData;
param.base.size = sizeof(param);
param.base.language = 1;
param.base.buttonSwap = 1;
param.base.graphicsThread = 0x11;
param.base.accessThread = 0x13;
param.base.fontThread = 0x12;
param.base.soundThread = 0x10;
param.base.result = 0;
param.base.reserved[0] = 0;
param.base.reserved[1] = 0;
param.base.reserved[2] = 0;
param.base.reserved[3] = 0;
param.mode = PSP_UTILITY_SAVEDATA_AUTOLOAD;
param.bind = 0;
param.overwrite = 1;
memset(param.gameName, 0, sizeof(param.gameName));
strncpy(param.gameName, "NPUZ00276", sizeof(param.gameName) - 1);
memset(param.reserved, 0, sizeof(param.reserved));
memset(param.saveName, 0, sizeof(param.saveName));
strncpy(param.saveName, "DATA99", sizeof(param.saveName) - 1);
param.saveNameList = NULL;
memset(param.fileName, 0, sizeof(param.fileName));
strncpy(param.fileName, "SECURE.BIN", sizeof(param.fileName) - 1);
memset(param.reserved1, 0, sizeof(param.reserved1));
u8 dataBuf[] = {0, 96, 1, 0, 32, 63, 205, 8, 0, 0, 33, 0};
param.dataBuf = &dataBuf;
param.dataBufSize = sizeof(dataBuf);
param.dataSize = sizeof(dataBuf);
memset(param.sfoParam.title, 0, sizeof(param.sfoParam.title));
strncpy(param.sfoParam.title, "Canabalt", sizeof(param.sfoParam.title) - 1);
memset(param.sfoParam.savedataTitle, 0, sizeof(param.sfoParam.savedataTitle));
strncpy(param.sfoParam.savedataTitle, "Best Run: 0 m", sizeof(param.sfoParam.savedataTitle) - 1);
memset(param.sfoParam.detail, 0, sizeof(param.sfoParam.detail));
strncpy(param.sfoParam.detail, "", sizeof(param.sfoParam.detail) - 1);
param.sfoParam.parentalLevel = 4;
param.sfoParam.unknown[0] = 15;
param.sfoParam.unknown[1] = 0;
param.sfoParam.unknown[2] = 0;
memset(&param.icon0FileData, 0, sizeof(param.icon0FileData));
memset(&param.icon1FileData, 0, sizeof(param.icon1FileData));
memset(&param.pic1FileData, 0, sizeof(param.pic1FileData));
memset(&param.snd0FileData, 0, sizeof(param.snd0FileData));
newData.icon0.buf = NULL;
newData.icon0.bufSize = 0;
newData.icon0.size = 0;
newData.icon0.unknown = 0x00000000;
newData.title = NULL;
param.newData = &newData;
param.focus = PSP_UTILITY_SAVEDATA_FOCUS_FIRSTEMPTY;
param.abortStatus = 0;
param.msFree = 0;
param.msData = 0;
param.utilityData = 0;
u32 key[] = {0x33323130, 0x37363534, 0x42413938, 0x00454443};
memcpy(&param.key, &key, sizeof(key));
param.secureVersion = 0;
param.multiStatus = 0;
param.idList = NULL;
param.fileList = NULL;
// TODO: test a value? Canabalt uses one.
param.sizeInfo = NULL;
SceUtilityOskData oskData;
memset(&oskData, 0, sizeof(oskData));
oskData.language = 1;
oskData.inputtype = PSP_UTILITY_OSK_INPUTTYPE_ALL;
oskData.lines = 1;
oskData.desc = (ushort *) L"Descript";
oskData.intext = (ushort *) L"Initial";
ushort blah[24];
oskData.outtextlength = 24;
oskData.outtext = (ushort *) &blah;
oskData.outtextlimit = 24;
SceUtilityOskParams oskParams;
memset(&oskParams, 0, sizeof(oskParams));
oskParams.base.size = sizeof(oskParams);
oskParams.base.language = 1;
oskParams.base.buttonSwap = 1;
oskParams.base.graphicsThread = 0x11;
oskParams.base.accessThread = 0x13;
oskParams.base.fontThread = 0x12;
oskParams.base.soundThread = 0x10;
oskParams.datacount = 1;
oskParams.data = &oskData;
int result = sceUtilitySavedataGetStatus();
printf("sceUtilitySavedataGetStatus: %08x\n", result);
result = sceUtilityOskGetStatus();
printf("sceUtilityOskGetStatus: %08x\n", result);
result = sceUtilitySavedataInitStart((SceUtilitySavedataParam *) &param);
printf("sceUtilitySavedataInitStart: %08x\n", result);
result = sceUtilityOskInitStart(&oskParams);
printf("sceUtilityOskInitStart: %08x\n", result);
result = sceUtilitySavedataInitStart((SceUtilitySavedataParam *) &param);
printf("sceUtilitySavedataInitStart: %08x\n", result);
int i;
for (i = 0; i < 10; ++i)
{
int status = sceUtilitySavedataGetStatus();
printf("sceUtilitySavedataGetStatus: %08x\n", status);
sceKernelDelayThread(20000);
status = sceUtilitySavedataGetStatus();
printf("sceUtilitySavedataGetStatus: %08x\n", status);
result = sceUtilitySavedataUpdate(1);
printf("sceUtilitySavedataUpdate: %08x\n", result);
}
result = sceUtilitySavedataShutdownStart();
printf("sceUtilitySavedataShutdownStart: %08x\n", result);
result = sceUtilitySavedataGetStatus();
printf("sceUtilitySavedataGetStatus: %08x\n", result);
result = sceUtilitySavedataGetStatus();
printf("sceUtilitySavedataGetStatus: %08x\n", result);
sceKernelDelayThread(20000);
result = sceUtilitySavedataGetStatus();
printf("sceUtilitySavedataGetStatus: %08x\n", result);
result = sceUtilityOskGetStatus();
printf("sceUtilityOskGetStatus: %08x\n", result);
result = sceUtilityOskInitStart(&oskParams);
printf("sceUtilityOskInitStart: %08x\n", result);
result = sceUtilitySavedataGetStatus();
printf("sceUtilitySavedataGetStatus: %08x\n", result);
result = sceUtilityOskGetStatus();
printf("sceUtilityOskGetStatus: %08x\n", result);
printf("result: %08x\n", param.base.result);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment