Skip to content

Commit

Permalink
isavegame progress
Browse files Browse the repository at this point in the history
  • Loading branch information
SquareMan committed Sep 4, 2024
1 parent eba51a0 commit 42ee8dd
Show file tree
Hide file tree
Showing 2 changed files with 221 additions and 69 deletions.
208 changes: 174 additions & 34 deletions src/SB/Core/gc/isavegame.cpp
Original file line number Diff line number Diff line change
@@ -1,51 +1,66 @@
#include "isavegame.h"

#include <types.h>
#include <stdio.h>
#include <string.h>

#include "iFile.h"
#include "iTRC.h"

extern char isavegame_strings[];
#include <dolphin.h>
#include <stdio.h>
#include <string.h>
#include <types.h>

extern st_ISGSESSION g_isgdata_MAIN;
// WIP
struct st_ISG_TPL_TEXPALETTE
{
};

// .sbss
static volatile S32 g_isginit;
static st_ISG_TPL_TEXPALETTE* g_rawicon;
static st_ISG_TPL_TEXPALETTE* g_rawbanr;
static S32 g_iconsize;
static S32 g_banrsize;
static S8 isMounted;

// .data
static st_ISGSESSION g_isgdata_MAIN = { 0 };
static struct
{
S32 unk_0;
S32 unk_4;
S32 unk_8;
} g_legalSectSize = { 0x2000, 0, -1 };

extern S32 g_isginit;
static S32 iSG_start_your_engines();
static S32 iSG_chk_icondata();
static S32 iSG_load_icondata();
static void iSG_discard_icondata();
static S32 iSG_mc_unmount(S32 slot);

#if 0
S32 iSGStartup()
{
S32 i = g_isginit;

if (g_isginit != 0)
if (g_isginit++ != 0)
{
g_isginit = i;

return i;
return g_isginit;
}
g_isginit = i;

iSG_start_your_engines();
iSG_load_icondata();
return i;
return g_isginit;
}
#endif

S32 iSGShutdown()
{
iSG_discard_icondata();
return 1;
}

// WIP
char* iSGMakeName(en_NAMEGEN_TYPE type, const char* base, S32 idx)
{
static S32 rotate = 0;
static char rotatebuf[32][8];
static volatile S32 rotate = 0; // fakematch??
static char rotatebuf[8][32] = { 0 };

char* use_buf = rotatebuf[rotate];
char* fmt_sd = isavegame_strings;
rotate++;
const char* fmt_sd = "%s%02d";
char* use_buf = rotatebuf[rotate++];
if (rotate == 8)
{
rotate = 0;
Expand All @@ -62,7 +77,7 @@ char* iSGMakeName(en_NAMEGEN_TYPE type, const char* base, S32 idx)
}
else
{
sprintf(use_buf, fmt_sd, isavegame_strings + 7, idx);
sprintf(use_buf, fmt_sd, "SpongeBob", idx);
}
break;
case ISG_NGTYP_GAMEDIR:
Expand All @@ -74,39 +89,164 @@ char* iSGMakeName(en_NAMEGEN_TYPE type, const char* base, S32 idx)
return use_buf;
}

#if 0
// Struct definition is screwed up.
st_ISGSESSION* iSGSessionBegin(void* cltdata, void (*chgfunc)(void*, en_CHGCODE), S32 monitor)
{
iTRCDisk::CheckDVDAndResetState();
memset(&g_isgdata_MAIN, 0, sizeof(st_ISGSESSION));

g_isgdata_MAIN.unk_260 = -1;
g_isgdata_MAIN.chgfunc = chgfunc;
g_isgdata_MAIN.cltdata = cltdata;

iSG_chk_icondata();
return &g_isgdata_MAIN;
}
#endif

#if 0
// Structs make no sense
void iSGSessionEnd(st_ISGSESSION* isgdata)
{
iTRCDisk::CheckDVDAndResetState();
for (S32 i = 0; i < 2; i++)
for (S32 i = 0; i < ISG_NUM_SLOTS; i++)
{
if (isgdata->mcdata[i].mcport != 0)
if (isgdata->mcdata[i].unk_0)
{
iSG_mc_unmount(i);
isgdata->mcdata[i].mcport = 0;
isgdata->mcdata[i].unk_0 = 0;
}
}

memset(isgdata, 0, sizeof(st_ISGSESSION));
}
#endif

void iSG_cb_asyndone(long, long)
static S32 iSG_start_your_engines()
{
CARDInit();
return 1;
}

// Looks equivalent. Can't get variable initializtions to match.
S32 iSG_mcidx2slot(S32 param1, S32* param2, S32* param3)
{
s32 cardReady[ISG_NUM_SLOTS] = {};
S32 ret = 0;
S32 idk = 0;
s32 memSize = 0;
s32 sectorSize = 0;
*param2 = -1;

for (S32 i = 0; i < ISG_NUM_SLOTS; i++)
{
s32 result;
do
{
result = CARDProbeEx(i, &memSize, &sectorSize);
} while (result == CARD_RESULT_BUSY);

if (result == CARD_RESULT_READY)
{
cardReady[i] = TRUE;
}
}

for (S32 i = 0; i < ISG_NUM_SLOTS; i++)
{
if (cardReady[i])
{
if (idk == param1)
{
*param2 = i;
ret = 1;
break;
}
idk++;
}
}

if (param3)
{
for (S32 i = 0; i < ISG_NUM_SLOTS; i++)
{
param3[i] = cardReady[i];
}
}

return ret;
}

static S32 iSG_mc_exists(S32 slot)
{
S32 ret = 0;
s32 memSize = 0;
s32 sectorSize = 0;

if (slot < -1)
{
return 0;
}

S32 result;
do
{
result = CARDProbeEx(slot, &memSize, &sectorSize);
} while (result == CARD_RESULT_BUSY);

if (result == CARD_RESULT_READY)
{
ret = 1;
}

return ret;
}

static S32 iSG_chk_icondata()
{
return 1;
}

void iSG_tpl_unpack(st_ISG_TPL_TEXPALETTE*);
static S32 iSG_load_icondata()
{
g_rawicon = (st_ISG_TPL_TEXPALETTE*)iFileLoad("/SBGCIcon.tpl", NULL, (U32*)g_iconsize);
g_rawbanr = (st_ISG_TPL_TEXPALETTE*)iFileLoad("/SBGCBanner.tpl", NULL, (U32*)g_banrsize);
iSG_tpl_unpack(g_rawicon);
iSG_tpl_unpack(g_rawbanr);

return g_rawicon && g_iconsize && g_rawbanr && g_banrsize ? 1 : 0;
}

static void iSG_discard_icondata()
{
OSFreeToHeap(__OSCurrHeap, g_rawicon);
OSFreeToHeap(__OSCurrHeap, g_rawbanr);
g_rawicon = NULL;
g_iconsize = 0;
g_rawbanr = NULL;
g_banrsize = 0;
}

static S32 iSG_mc_unmount(S32 slot)
{
S32 ret = 0;
s32 chan = slot;
S32 result;

do
{
result = CARDUnmount(chan);
} while (result == CARD_RESULT_BUSY);

if (result == CARD_RESULT_READY)
{
ret = 1;
}
else if (result == CARD_RESULT_NOCARD)
{
ret = 1;
}

return ret;
}

static void iSG_cb_asyndone(long, long)
{
}

Expand Down
82 changes: 47 additions & 35 deletions src/SB/Core/gc/isavegame.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,36 +94,55 @@ enum en_CHGCODE
ISG_CHG_GAMELIST
};

/* DWARF Definitions (PS2)
class st_ISG_MEMCARD_DATA {
// total size: 0x100
public:
signed int mcport; // offset 0x0, size 0x4
signed int mcslot; // offset 0x4, size 0x4
signed int mcfp; // offset 0x8, size 0x4
enum en_ISG_IOMODE fmode; // offset 0xC, size 0x4
char gamepath[64]; // offset 0x10, size 0x40
class sceMcTblGetDir finfo; // offset 0x80, size 0x40
signed int cur_mcop; // offset 0xC0, size 0x4
enum en_ISGMC_ERRSTATUS mcerr; // offset 0xC4, size 0x4
signed int allow_cache; // offset 0xC8, size 0x4
};
class st_ISGSESSION {
// total size: 0x9C
public:
class st_ISG_MEMCARD_DATA * mcdata; // offset 0x0, size 0x4
char gameroot[64]; // offset 0x4, size 0x40
char gamedir[64]; // offset 0x44, size 0x40
enum en_ASYNC_OPCODE as_curop; // offset 0x84, size 0x4
enum en_ASYNC_OPSTAT as_opstat; // offset 0x88, size 0x4
enum en_ASYNC_OPERR as_operr; // offset 0x8C, size 0x4
void * cltdata; // offset 0x90, size 0x4
enum en_CHGCODE chgcode; // offset 0x94, size 0x4
void (* chgfunc)(void *, enum en_CHGCODE); // offset 0x98, size 0x4
};
*/

// Size should be 0x130
struct st_ISG_MEMCARD_DATA
{
S32 mcport;
S32 mcslot;
S32 mcfp;
en_ISG_IOMODE fmode;
char gamepath[64];
sceMcTblGetDir finfo;
S32 cur_mcop;
en_ISGMC_ERRSTATUS mcerr;
S32 allow_cache;
S32 unk_0;
S32 unk_pad[75];
};

// This struct is definitely wrong
// Size should be 0x280
#define ISG_NUM_SLOTS 2
struct st_ISGSESSION
{
// This is just a pointer in the DWARF
// I've changed it because of iSGSessionEnd,
// but there might just be another field before this instead.
st_ISG_MEMCARD_DATA mcdata[2];

char gameroot[64];
char gamedir[64];
en_ASYNC_OPCODE as_curop;
en_ASYNC_OPSTAT as_opstat;
en_ASYNC_OPERR as_operr;
void* cltdata;
en_CHGCODE chgcode;
void (*chgfunc)(void*, en_CHGCODE);
st_ISG_MEMCARD_DATA mcdata[ISG_NUM_SLOTS];
S32 unk_260;
S32 unk_264[4];
void (*chgfunc)(void*, en_CHGCODE); // 0x274
void* cltdata; // 0x278
S32 unk_27c;
};

enum en_NAMEGEN_TYPE
Expand All @@ -145,10 +164,9 @@ U32 iSGTgtState(st_ISGSESSION* isgdata, S32 tgtidx, const char* dpath);
S32 iSGTgtFormat(st_ISGSESSION* isgdata, S32 tgtidx, S32 async, S32* canRecover);
S32 iSGTgtSetActive(st_ISGSESSION* isgdata, S32 tgtidx);
S32 iSGTgtHaveRoom(st_ISGSESSION* isgdata, S32 tidx, S32 fsize, const char* dpath,
const char* fname, S32* bytesNeeded, S32* availOnDisk, S32* needFile);
const char* fname, S32* bytesNeeded, S32* availOnDisk, S32* needFile);
S32 iSGTgtHaveRoomStartup(st_ISGSESSION* isgdata, S32 tidx, S32 fsize, const char* dpath,
const char* fname, S32* bytesNeeded, S32* availOnDisk,
S32* needFile);
const char* fname, S32* bytesNeeded, S32* availOnDisk, S32* needFile);
U8 iSGCheckMemoryCard(st_ISGSESSION* isgdata, S32 index);
S32 iSGFileSize(st_ISGSESSION* isgdata, const char* fname);
char* iSGFileModDate(st_ISGSESSION* isgdata, const char* fname);
Expand All @@ -157,23 +175,17 @@ char* iSGFileModDate(st_ISGSESSION* isgdata, const char* fname, S32* sec, S32* m
en_ASYNC_OPSTAT iSGPollStatus(st_ISGSESSION* isgdata, en_ASYNC_OPCODE* curop, S32 block);
en_ASYNC_OPERR iSGOpError(st_ISGSESSION* isgdata, char* errmsg);
S32 iSGReadLeader(st_ISGSESSION* isgdata, const char* fname, char* databuf, S32 numbytes,
S32 async);
S32 async);
S32 iSGSelectGameDir(st_ISGSESSION* isgdata, const char* dname);
void iSGMakeTimeStamp(char* str);
S32 iSGSetupGameDir(st_ISGSESSION* isgdata, const char* dname, S32 force_iconfix);
S32 iSGSaveFile(st_ISGSESSION* isgdata, const char* fname, char* data, S32 n, S32 async,
char*);
S32 iSGSaveFile(st_ISGSESSION* isgdata, const char* fname, char* data, S32 n, S32 async, char*);
S32 iSGLoadFile(st_ISGSESSION* isgdata, const char* fname, char* databuf, S32 async);
void iSGAutoSave_Startup();
st_ISGSESSION* iSGAutoSave_Connect(S32 idx_target, void* cltdata, void (*chg)(void*, en_CHGCODE));
void iSGAutoSave_Disconnect(st_ISGSESSION* isg);
S32 iSGAutoSave_Monitor(st_ISGSESSION* isg, S32 idx_target);
S32 iSGCheckForWrongDevice();
S32 iSG_start_your_engines();
S32 iSG_load_icondata();
void iSG_discard_icondata();
S32 iSG_chk_icondata();
S32 iSG_mc_unmount(S32 slot);
S32 iSGCheckForCorruptFiles(st_ISGSESSION*, char files[][64]);

#endif

0 comments on commit 42ee8dd

Please sign in to comment.