GCMemcard: Use BigEndianValue for DEntry.m_first_block.

This commit is contained in:
Admiral H. Curtiss 2018-11-18 18:19:35 +01:00
parent 929fd2b41d
commit 675a549628
3 changed files with 20 additions and 15 deletions

View File

@ -511,7 +511,7 @@ u16 GCMemcard::DEntry_FirstBlock(u8 index) const
if (!m_valid || index >= DIRLEN) if (!m_valid || index >= DIRLEN)
return 0xFFFF; return 0xFFFF;
u16 block = BE16(CurrentDir->m_dir_entries[index].m_first_block); u16 block = CurrentDir->m_dir_entries[index].m_first_block;
if (block > (u16)maxBlock) if (block > (u16)maxBlock)
return 0xFFFF; return 0xFFFF;
return block; return block;
@ -542,7 +542,7 @@ std::string GCMemcard::GetSaveComment1(u8 index) const
return ""; return "";
u32 Comment1 = BE32(CurrentDir->m_dir_entries[index].m_comments_address); u32 Comment1 = BE32(CurrentDir->m_dir_entries[index].m_comments_address);
u32 DataBlock = BE16(CurrentDir->m_dir_entries[index].m_first_block) - MC_FST_BLOCKS; u32 DataBlock = CurrentDir->m_dir_entries[index].m_first_block - MC_FST_BLOCKS;
if ((DataBlock > maxBlock) || (Comment1 == 0xFFFFFFFF)) if ((DataBlock > maxBlock) || (Comment1 == 0xFFFFFFFF))
{ {
return ""; return "";
@ -557,7 +557,7 @@ std::string GCMemcard::GetSaveComment2(u8 index) const
u32 Comment1 = BE32(CurrentDir->m_dir_entries[index].m_comments_address); u32 Comment1 = BE32(CurrentDir->m_dir_entries[index].m_comments_address);
u32 Comment2 = Comment1 + DENTRY_STRLEN; u32 Comment2 = Comment1 + DENTRY_STRLEN;
u32 DataBlock = BE16(CurrentDir->m_dir_entries[index].m_first_block) - MC_FST_BLOCKS; u32 DataBlock = CurrentDir->m_dir_entries[index].m_first_block - MC_FST_BLOCKS;
if ((DataBlock > maxBlock) || (Comment1 == 0xFFFFFFFF)) if ((DataBlock > maxBlock) || (Comment1 == 0xFFFFFFFF))
{ {
return ""; return "";
@ -682,7 +682,7 @@ u32 GCMemcard::ImportFile(const DEntry& direntry, std::vector<GCMBlock>& saveBlo
if (BE32(UpdatedDir.m_dir_entries[i].m_gamecode) == 0xFFFFFFFF) if (BE32(UpdatedDir.m_dir_entries[i].m_gamecode) == 0xFFFFFFFF)
{ {
UpdatedDir.m_dir_entries[i] = direntry; UpdatedDir.m_dir_entries[i] = direntry;
*(u16*)&UpdatedDir.m_dir_entries[i].m_first_block = BE16(firstBlock); UpdatedDir.m_dir_entries[i].m_first_block = firstBlock;
UpdatedDir.m_dir_entries[i].m_copy_counter = UpdatedDir.m_dir_entries[i].m_copy_counter + 1; UpdatedDir.m_dir_entries[i].m_copy_counter = UpdatedDir.m_dir_entries[i].m_copy_counter + 1;
break; break;
} }
@ -748,7 +748,7 @@ u32 GCMemcard::RemoveFile(u8 index) // index in the directory array
if (index >= DIRLEN) if (index >= DIRLEN)
return DELETE_FAIL; return DELETE_FAIL;
u16 startingblock = BE16(CurrentDir->m_dir_entries[index].m_first_block); u16 startingblock = CurrentDir->m_dir_entries[index].m_first_block;
u16 numberofblocks = BE16(CurrentDir->m_dir_entries[index].m_block_count); u16 numberofblocks = BE16(CurrentDir->m_dir_entries[index].m_block_count);
BlockAlloc UpdatedBat = *CurrentBat; BlockAlloc UpdatedBat = *CurrentBat;
@ -1060,7 +1060,11 @@ void GCMemcard::Gcs_SavConvert(DEntry& tempDEntry, int saveType, int length)
memcpy(&tempDEntry.m_animation_speed, tmp.data(), 2); memcpy(&tempDEntry.m_animation_speed, tmp.data(), 2);
ByteSwap(&tempDEntry.m_file_permissions, &tempDEntry.m_copy_counter); ByteSwap(&tempDEntry.m_file_permissions, &tempDEntry.m_copy_counter);
ArrayByteSwap((tempDEntry.m_first_block));
memcpy(tmp.data(), &tempDEntry.m_first_block, 2);
ByteSwap(&tmp[0], &tmp[1]);
memcpy(&tempDEntry.m_first_block, tmp.data(), 2);
ArrayByteSwap((tempDEntry.m_block_count)); ArrayByteSwap((tempDEntry.m_block_count));
ArrayByteSwap((tempDEntry.m_unused_2)); ArrayByteSwap((tempDEntry.m_unused_2));
ArrayByteSwap((tempDEntry.m_comments_address)); ArrayByteSwap((tempDEntry.m_comments_address));
@ -1088,7 +1092,7 @@ bool GCMemcard::ReadBannerRGBA8(u8 index, u32* buffer) const
return false; return false;
u32 DataOffset = CurrentDir->m_dir_entries[index].m_image_offset; u32 DataOffset = CurrentDir->m_dir_entries[index].m_image_offset;
u32 DataBlock = BE16(CurrentDir->m_dir_entries[index].m_first_block) - MC_FST_BLOCKS; u32 DataBlock = CurrentDir->m_dir_entries[index].m_first_block - MC_FST_BLOCKS;
if ((DataBlock > maxBlock) || (DataOffset == 0xFFFFFFFF)) if ((DataBlock > maxBlock) || (DataOffset == 0xFFFFFFFF))
{ {
@ -1135,7 +1139,7 @@ u32 GCMemcard::ReadAnimRGBA8(u8 index, u32* buffer, u8* delays) const
int bnrFormat = (flags & 3); int bnrFormat = (flags & 3);
u32 DataOffset = CurrentDir->m_dir_entries[index].m_image_offset; u32 DataOffset = CurrentDir->m_dir_entries[index].m_image_offset;
u32 DataBlock = BE16(CurrentDir->m_dir_entries[index].m_first_block) - MC_FST_BLOCKS; u32 DataBlock = CurrentDir->m_dir_entries[index].m_first_block - MC_FST_BLOCKS;
if ((DataBlock > maxBlock) || (DataOffset == 0xFFFFFFFF)) if ((DataBlock > maxBlock) || (DataOffset == 0xFFFFFFFF))
{ {

View File

@ -212,8 +212,9 @@ struct DEntry
// 3 no copy File cannot be copied by the IPL // 3 no copy File cannot be copied by the IPL
// 2 public Can be read by any game // 2 public Can be read by any game
// //
u8 m_copy_counter; // 0x35 0x01 Copy counter (*2) u8 m_copy_counter; // 0x35 0x01 Copy counter (*2)
u8 m_first_block[2]; // 0x36 0x02 Block no of first block of file (0 == offset 0) Common::BigEndianValue<u16>
m_first_block; // 0x36 0x02 Block no of first block of file (0 == offset 0)
u8 m_block_count[2]; // 0x38 0x02 File-length (number of blocks in file) u8 m_block_count[2]; // 0x38 0x02 File-length (number of blocks in file)
u8 m_unused_2[2]; // 0x3a 0x02 Reserved/unused (always 0xffff, has no effect) u8 m_unused_2[2]; // 0x3a 0x02 Reserved/unused (always 0xffff, has no effect)
u8 m_comments_address[4]; // 0x3c 0x04 Address of the two comments within the file data u8 m_comments_address[4]; // 0x3c 0x04 Address of the two comments within the file data
@ -281,7 +282,7 @@ struct BlockAlloc
m_last_allocated_block = BE16(current); m_last_allocated_block = BE16(current);
m_free_blocks = BE16(BE16(m_free_blocks) - length); m_free_blocks = BE16(BE16(m_free_blocks) - length);
fixChecksums(); fixChecksums();
return BE16(starting); return starting;
} }
}; };
static_assert(sizeof(BlockAlloc) == BLOCK_SIZE); static_assert(sizeof(BlockAlloc) == BLOCK_SIZE);

View File

@ -108,7 +108,7 @@ int GCMemcardDirectory::LoadGCI(const std::string& file_name, bool current_game_
file_name.c_str()); file_name.c_str());
return NO_INDEX; return NO_INDEX;
} }
*(u16*)&gci.m_gci_header.m_first_block = first_block; gci.m_gci_header.m_first_block = first_block;
if (gci.HasCopyProtection() && gci.LoadSaveBlocks()) if (gci.HasCopyProtection() && gci.LoadSaveBlocks())
{ {
GCMemcard::PSO_MakeSaveGameValid(m_hdr, gci.m_gci_header, gci.m_save_data); GCMemcard::PSO_MakeSaveGameValid(m_hdr, gci.m_gci_header, gci.m_save_data);
@ -452,8 +452,8 @@ inline void GCMemcardDirectory::SyncSaves()
m_saves[i].m_dirty = true; m_saves[i].m_dirty = true;
u32 gamecode = BE32(m_saves[i].m_gci_header.m_gamecode); u32 gamecode = BE32(m_saves[i].m_gci_header.m_gamecode);
u32 new_gamecode = BE32(current->m_dir_entries[i].m_gamecode); u32 new_gamecode = BE32(current->m_dir_entries[i].m_gamecode);
u32 old_start = BE16(m_saves[i].m_gci_header.m_first_block); u32 old_start = m_saves[i].m_gci_header.m_first_block;
u32 new_start = BE16(current->m_dir_entries[i].m_first_block); u32 new_start = current->m_dir_entries[i].m_first_block;
if ((gamecode != 0xFFFFFFFF) && (gamecode != new_gamecode)) if ((gamecode != 0xFFFFFFFF) && (gamecode != new_gamecode))
{ {
@ -551,7 +551,7 @@ bool GCMemcardDirectory::SetUsedBlocks(int save_index)
else else
current_bat = &m_bat1; current_bat = &m_bat1;
u16 block = BE16(m_saves[save_index].m_gci_header.m_first_block); u16 block = m_saves[save_index].m_gci_header.m_first_block;
while (block != 0xFFFF) while (block != 0xFFFF)
{ {
m_saves[save_index].m_used_blocks.push_back(block); m_saves[save_index].m_used_blocks.push_back(block);