MemoryCard: Fix incorrect checksum after formatting

Fixes memory cards not working in the BIOS.
This commit is contained in:
Connor McLaughlin 2019-12-07 00:03:03 +10:00
parent 54277dc24f
commit 8d7b93766d

View file

@ -256,8 +256,8 @@ std::shared_ptr<MemoryCard> MemoryCard::Open(System* system, std::string_view fi
u8 MemoryCard::ChecksumFrame(const u8* fptr) u8 MemoryCard::ChecksumFrame(const u8* fptr)
{ {
u8 value = fptr[0]; u8 value = 0;
for (u32 i = 0; i < SECTOR_SIZE; i++) for (u32 i = 0; i < SECTOR_SIZE - 1; i++)
value ^= fptr[i]; value ^= fptr[i];
return value; return value;
@ -274,7 +274,7 @@ void MemoryCard::Format()
std::fill_n(fptr, SECTOR_SIZE, u8(0)); std::fill_n(fptr, SECTOR_SIZE, u8(0));
fptr[0] = 'M'; fptr[0] = 'M';
fptr[1] = 'C'; fptr[1] = 'C';
fptr[0x7F] = ChecksumFrame(&m_data[0]); fptr[0x7F] = ChecksumFrame(fptr);
} }
// directory // directory
@ -283,6 +283,8 @@ void MemoryCard::Format()
u8* fptr = GetSectorPtr(frame); u8* fptr = GetSectorPtr(frame);
std::fill_n(fptr, SECTOR_SIZE, u8(0)); std::fill_n(fptr, SECTOR_SIZE, u8(0));
fptr[0] = 0xA0; // free fptr[0] = 0xA0; // free
fptr[8] = 0xFF; // pointer to next file
fptr[9] = 0xFF; // pointer to next file
fptr[0x7F] = ChecksumFrame(fptr); // checksum fptr[0x7F] = ChecksumFrame(fptr); // checksum
} }
@ -295,6 +297,8 @@ void MemoryCard::Format()
fptr[1] = 0xFF; fptr[1] = 0xFF;
fptr[2] = 0xFF; fptr[2] = 0xFF;
fptr[3] = 0xFF; fptr[3] = 0xFF;
fptr[8] = 0xFF; // pointer to next file
fptr[9] = 0xFF; // pointer to next file
fptr[0x7F] = ChecksumFrame(fptr); // checksum fptr[0x7F] = ChecksumFrame(fptr); // checksum
} }
@ -302,14 +306,14 @@ void MemoryCard::Format()
for (u32 frame = 36; frame < 56; frame++) for (u32 frame = 36; frame < 56; frame++)
{ {
u8* fptr = GetSectorPtr(frame); u8* fptr = GetSectorPtr(frame);
std::fill_n(fptr, SECTOR_SIZE, u8(0xFF)); std::fill_n(fptr, SECTOR_SIZE, u8(0x00));
} }
// unused frames // unused frames
for (u32 frame = 56; frame < 63; frame++) for (u32 frame = 56; frame < 63; frame++)
{ {
u8* fptr = GetSectorPtr(frame); u8* fptr = GetSectorPtr(frame);
std::fill_n(fptr, SECTOR_SIZE, u8(0xFF)); std::fill_n(fptr, SECTOR_SIZE, u8(0x00));
} }
// write test frame // write test frame