Created
December 26, 2012 20:22
-
-
Save unknownbrackets/4382866 to your computer and use it in GitHub Desktop.
Thrown-together savedata test for PSP.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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(¶m.icon0FileData, 0, sizeof(param.icon0FileData)); | |
memset(¶m.icon1FileData, 0, sizeof(param.icon1FileData)); | |
memset(¶m.pic1FileData, 0, sizeof(param.pic1FileData)); | |
memset(¶m.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(¶m.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 *) ¶m); | |
printf("sceUtilitySavedataInitStart: %08x\n", result); | |
result = sceUtilityOskInitStart(&oskParams); | |
printf("sceUtilityOskInitStart: %08x\n", result); | |
result = sceUtilitySavedataInitStart((SceUtilitySavedataParam *) ¶m); | |
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