From 167d87e5cb1c34bd1b3f84a66b996b0f40f1e6a6 Mon Sep 17 00:00:00 2001 From: Pokechu22 Date: Tue, 25 Aug 2020 14:41:27 -0700 Subject: [PATCH] Fix CRC handling 2 different CRC bugs, and also an OOB bug. --- Source/Core/Core/HW/EXI/EXI_DeviceSD.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Source/Core/Core/HW/EXI/EXI_DeviceSD.cpp b/Source/Core/Core/HW/EXI/EXI_DeviceSD.cpp index b8647442c5..96dd52d459 100644 --- a/Source/Core/Core/HW/EXI/EXI_DeviceSD.cpp +++ b/Source/Core/Core/HW/EXI/EXI_DeviceSD.cpp @@ -556,6 +556,8 @@ u8 CEXISD::ReadForBlockWrite() u8 result; if (actual_crc != block_crc) { + ERROR_LOG_FMT(EXPANSIONINTERFACE, "Bad CRC: was {:04x}, should be {:04x}", actual_crc, + block_crc); result = DATA_RESPONSE_BAD_CRC; } else if (!m_card.Seek(address, File::SeekOrigin::Begin)) @@ -612,14 +614,14 @@ void CEXISD::WriteForBlockWrite(u8 byte) state = State::ReadyForCommand; block_state = BlockState::Nothing; } - else + else if (byte != 0xff) { ERROR_LOG_FMT(EXPANSIONINTERFACE, "Unexpected token for block write {:02x}", byte); } break; case BlockState::Block: block_buffer[block_position++] = byte; - if (block_position > BLOCK_SIZE) + if (block_position >= BLOCK_SIZE) { block_state = BlockState::Checksum1; } @@ -629,7 +631,7 @@ void CEXISD::WriteForBlockWrite(u8 byte) block_state = BlockState::Checksum2; break; case BlockState::Checksum2: - block_crc |= byte << 8; + block_crc |= byte; block_state = BlockState::ChecksumWritten; break; case BlockState::ChecksumWritten: