GCMemcard: Directory: Move code out of header, add some boundary checks, fix naming conventions.
This commit is contained in:
parent
d3c4d278e2
commit
0052b313d6
|
@ -1387,3 +1387,26 @@ s32 GCMemcard::PSO_MakeSaveGameValid(const Header& cardheader, const DEntry& dir
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Directory::Directory()
|
||||||
|
{
|
||||||
|
memset(this, 0xFF, BLOCK_SIZE);
|
||||||
|
m_update_counter = 0;
|
||||||
|
m_checksum = BE16(0xF003);
|
||||||
|
m_checksum_inv = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Directory::Replace(const DEntry& entry, size_t index)
|
||||||
|
{
|
||||||
|
if (index >= m_dir_entries.size())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
m_dir_entries[index] = entry;
|
||||||
|
FixChecksums();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Directory::FixChecksums()
|
||||||
|
{
|
||||||
|
calc_checksumsBE((u16*)this, 0xFFE, &m_checksum, &m_checksum_inv);
|
||||||
|
}
|
||||||
|
|
|
@ -272,24 +272,30 @@ static_assert(sizeof(DEntry) == DENTRY_SIZE);
|
||||||
|
|
||||||
struct Directory
|
struct Directory
|
||||||
{
|
{
|
||||||
std::array<DEntry, DIRLEN> m_dir_entries; // 0x0000 Directory Entries (max 127)
|
// 127 files of 0x40 bytes each
|
||||||
|
std::array<DEntry, DIRLEN> m_dir_entries;
|
||||||
|
|
||||||
|
// 0x3a bytes at 0x1fc0: Unused, always 0xFF
|
||||||
std::array<u8, 0x3a> m_padding;
|
std::array<u8, 0x3a> m_padding;
|
||||||
Common::BigEndianValue<u16> m_update_counter; // 0x1ffa 2 Update Counter
|
|
||||||
u16 m_checksum; // 0x1ffc 2 Additive Checksum
|
// 2 bytes at 0x1ffa: Update Counter
|
||||||
u16 m_checksum_inv; // 0x1ffe 2 Inverse Checksum
|
// TODO: What happens if this overflows? Is there a special case for preferring 0 over max value?
|
||||||
Directory()
|
Common::BigEndianValue<u16> m_update_counter;
|
||||||
{
|
|
||||||
memset(this, 0xFF, BLOCK_SIZE);
|
// 2 bytes at 0x1ffc: Additive Checksum
|
||||||
m_update_counter = 0;
|
u16 m_checksum;
|
||||||
m_checksum = BE16(0xF003);
|
|
||||||
m_checksum_inv = 0;
|
// 2 bytes at 0x1ffe: Inverse Checksum
|
||||||
}
|
u16 m_checksum_inv;
|
||||||
void Replace(DEntry d, int idx)
|
|
||||||
{
|
// Constructs an empty Directory block.
|
||||||
m_dir_entries[idx] = d;
|
Directory();
|
||||||
fixChecksums();
|
|
||||||
}
|
// Replaces the file metadata at the given index (range 0-126)
|
||||||
void fixChecksums() { calc_checksumsBE((u16*)this, 0xFFE, &m_checksum, &m_checksum_inv); }
|
// with the given DEntry data.
|
||||||
|
bool Replace(const DEntry& entry, size_t index);
|
||||||
|
|
||||||
|
void FixChecksums();
|
||||||
};
|
};
|
||||||
static_assert(sizeof(Directory) == BLOCK_SIZE);
|
static_assert(sizeof(Directory) == BLOCK_SIZE);
|
||||||
|
|
||||||
|
|
|
@ -215,7 +215,7 @@ GCMemcardDirectory::GCMemcardDirectory(const std::string& directory, int slot, u
|
||||||
}
|
}
|
||||||
|
|
||||||
m_loaded_saves.clear();
|
m_loaded_saves.clear();
|
||||||
m_dir1.fixChecksums();
|
m_dir1.FixChecksums();
|
||||||
m_dir2 = m_dir1;
|
m_dir2 = m_dir1;
|
||||||
m_bat2 = m_bat1;
|
m_bat2 = m_bat1;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue