Skip to content

Commit

Permalink
Fix references to memcard gamedata struct size
Browse files Browse the repository at this point in the history
  • Loading branch information
LagoLunatic committed Jan 18, 2025
1 parent e8adc6c commit 067b471
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 39 deletions.
32 changes: 31 additions & 1 deletion include/m_Do/m_Do_MemCardRWmng.h
Original file line number Diff line number Diff line change
@@ -1,10 +1,40 @@
#ifndef M_DO_M_DO_MEMCARDRWMNG_H
#define M_DO_M_DO_MEMCARDRWMNG_H

#include "d/d_save.h"
#include "dolphin/types.h"

typedef struct CARDFileInfo CARDFileInfo;
struct mDoMemCdRWm_HeaderData;

struct mDoMemCdRWm_HeaderData
{
/* 0x0000 */ u8 banner[0x0e00];
/* 0x0e00 */ u8 icon[0x0200];
/* 0x1000 */ u8 field_0x1000[0x0c00];
/* 0x1c00 */ char comment[32];
/* 0x1c20 */ char info[32];
};

struct card_pictdata
{
u8 data[0x1ffe];
u16 csum;
};

struct card_gamedata
{
u8 data[dSv_save_c::PACKED_STRUCT_SIZE];
u64 csum;
};

struct card_savedata
{
u32 saveCount;
u32 dataVersion;
card_gamedata gamedata[3];
u32 field_0x1658[0x269];
u32 csum;
};

s32 mDoMemCdRWm_Store(CARDFileInfo*, void*, u32);
s32 mDoMemCdRWm_Restore(CARDFileInfo*, void*, u32);
Expand Down
12 changes: 4 additions & 8 deletions src/d/d_save.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "d/d_save_init.h"
#include "d/d_com_inf_game.h"
#include "d/d_item_data.h"
#include "m_Do/m_Do_MemCardRWmng.h"
#if VERSION == VERSION_JPN
#include "d/d_s_play.h"
#endif
Expand Down Expand Up @@ -1626,13 +1627,8 @@ BOOL dSv_info_c::isActor(int i_id, int i_roomNo) {

/* 8005E780-8005EA24 .text memory_to_card__10dSv_info_cFPci */
int dSv_info_c::memory_to_card(char* i_cardPtr, int i_dataNum) {
// The size of the dSv_save_c struct in RAM (i.e. with alignment padding) is 0x778.
// The size that gets stored to the memory card (i.e. packed, without the padding) is 0x768.
// At the end of this function there's a check to ensure it doesn't copy more than 0x768 bytes.
// At the start of this function, the size the index gets multiplied by to find the slot in the card is 0x770.
// I'm not sure where 0x770 comes from, but my best guess is that it's 0x768 aligned to the next 0x10 bytes.
char* buffer_start;
char* buffer = i_cardPtr + i_dataNum * ALIGN_NEXT(dSv_save_c::PACKED_STRUCT_SIZE, 0x10);
char* buffer = i_cardPtr + i_dataNum * sizeof(card_gamedata);
buffer_start = buffer;

memcpy(buffer, dComIfGs_getpPlayerStatusA(), sizeof(dSv_player_status_a_c));
Expand Down Expand Up @@ -1723,7 +1719,7 @@ int dSv_info_c::memory_to_card(char* i_cardPtr, int i_dataNum) {
/* 8005EA24-8005ED00 .text card_to_memory__10dSv_info_cFPci */
int dSv_info_c::card_to_memory(char* i_cardPtr, int i_dataNum) {
char* buffer_start;
char* buffer = i_cardPtr + i_dataNum * ALIGN_NEXT(dSv_save_c::PACKED_STRUCT_SIZE, 0x10);
char* buffer = i_cardPtr + i_dataNum * sizeof(card_gamedata);
buffer_start = buffer;

memcpy(dComIfGs_getpPlayerStatusA(), buffer, sizeof(dSv_player_status_a_c));
Expand Down Expand Up @@ -1810,7 +1806,7 @@ int dSv_info_c::card_to_memory(char* i_cardPtr, int i_dataNum) {
/* 8005ED00-8005EF88 .text initdata_to_card__10dSv_info_cFPci */
int dSv_info_c::initdata_to_card(char* i_cardPtr, int i_dataNum) {
// TODO: This function could probably be cleaned up somehow
char* buffer = i_cardPtr + i_dataNum * ALIGN_NEXT(dSv_save_c::PACKED_STRUCT_SIZE, 0x10);
char* buffer = i_cardPtr + i_dataNum * sizeof(card_gamedata);
char* buffer_start = buffer;
char* buffer_src;

Expand Down
30 changes: 0 additions & 30 deletions src/m_Do/m_Do_MemCardRWmng.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,36 +15,6 @@
#include <string.h>
#include <printf.h>

struct mDoMemCdRWm_HeaderData
{
/* 0x0000 */ u8 banner[0x0e00];
/* 0x0e00 */ u8 icon[0x0200];
/* 0x1000 */ u8 field_0x1000[0x0c00];
/* 0x1c00 */ char comment[32];
/* 0x1c20 */ char info[32];
};

struct card_pictdata
{
u8 data[0x1ffe];
u16 csum;
};

struct card_gamedata
{
u8 data[0x768];
u64 csum;
};

struct card_savedata
{
u32 saveCount;
u32 dataVersion;
card_gamedata gamedata[3];
u32 field_0x1658[0x269];
u32 csum;
};

static u8 sTmpBuf[0x2000] ALIGN_DECL(32);
static u8 sTmpBuf2[0x2000] ALIGN_DECL(32);
static u32 sSaveCount;
Expand Down

0 comments on commit 067b471

Please sign in to comment.