mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-03 19:42:45 +01:00
More work on multi-block reads; not fully functional
This commit is contained in:
parent
1dd9ac2727
commit
58347cc795
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#include "Core/HW/EXI/EXI_DeviceSD.h"
|
#include "Core/HW/EXI/EXI_DeviceSD.h"
|
||||||
|
|
||||||
|
#include <cinttypes>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "Common/ChunkFile.h"
|
#include "Common/ChunkFile.h"
|
||||||
@ -461,12 +462,13 @@ u8 CEXISD::ReadForBlockRead()
|
|||||||
}
|
}
|
||||||
else if (!m_card.ReadBytes(block_buffer.data(), BLOCK_SIZE))
|
else if (!m_card.ReadBytes(block_buffer.data(), BLOCK_SIZE))
|
||||||
{
|
{
|
||||||
ERROR_LOG_FMT(EXPANSIONINTERFACE, "SD read failed - error: {}, eof: {}",
|
ERROR_LOG_FMT(EXPANSIONINTERFACE, "SD read failed at {:#x} - error: {}, eof: {}", address,
|
||||||
ferror(m_card.GetHandle()), feof(m_card.GetHandle()));
|
ferror(m_card.GetHandle()), feof(m_card.GetHandle()));
|
||||||
block_state = BlockState::Token;
|
block_state = BlockState::Token;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
INFO_LOG_FMT(EXPANSIONINTERFACE, "SD read succeeded at {:#x}", address);
|
||||||
block_position = 0;
|
block_position = 0;
|
||||||
block_state = BlockState::Block;
|
block_state = BlockState::Block;
|
||||||
block_crc = Common::HashCrc16(block_buffer);
|
block_crc = Common::HashCrc16(block_buffer);
|
||||||
@ -507,13 +509,13 @@ u8 CEXISD::ReadForBlockRead()
|
|||||||
}
|
}
|
||||||
else if (!m_card.ReadBytes(block_buffer.data(), BLOCK_SIZE))
|
else if (!m_card.ReadBytes(block_buffer.data(), BLOCK_SIZE))
|
||||||
{
|
{
|
||||||
ERROR_LOG_FMT(EXPANSIONINTERFACE, "SD read failed - error: {}, eof: {}",
|
ERROR_LOG_FMT(EXPANSIONINTERFACE, "SD read failed at {:#x} - error: {}, eof: {}", address,
|
||||||
ferror(m_card.GetHandle()), feof(m_card.GetHandle()));
|
ferror(m_card.GetHandle()), feof(m_card.GetHandle()));
|
||||||
block_state = BlockState::Token;
|
block_state = BlockState::Token;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
INFO_LOG_FMT(EXPANSIONINTERFACE, "SD read succeeded");
|
INFO_LOG_FMT(EXPANSIONINTERFACE, "SD read succeeded at {:#x}", address);
|
||||||
block_position = 0;
|
block_position = 0;
|
||||||
block_state = BlockState::Block;
|
block_state = BlockState::Block;
|
||||||
block_crc = Common::HashCrc16(block_buffer);
|
block_crc = Common::HashCrc16(block_buffer);
|
||||||
@ -538,15 +540,36 @@ void CEXISD::WriteForBlockRead(u8 byte)
|
|||||||
{
|
{
|
||||||
if (byte != 0xff)
|
if (byte != 0xff)
|
||||||
{
|
{
|
||||||
ERROR_LOG_FMT(EXPANSIONINTERFACE, "Data written during block read: {:02x}", byte);
|
WARN_LOG_FMT(EXPANSIONINTERFACE, "Data written during block read: {:02x}, {}, {}", byte,
|
||||||
|
u32(block_state), block_position);
|
||||||
}
|
}
|
||||||
// TODO: Read the whole command
|
// TODO: Read the whole command
|
||||||
if (((byte & 0b11000000) == 0b01000000) &&
|
if (((byte & 0b11000000) == 0b01000000) &&
|
||||||
static_cast<Command>(byte & 0x3f) == Command::StopTransmission)
|
static_cast<Command>(byte & 0x3f) == Command::StopTransmission)
|
||||||
{
|
{
|
||||||
// Finish transmitting the current block and then stop
|
// Finish transmitting the current block and then stop
|
||||||
|
if (state == State::MultipleBlockRead)
|
||||||
|
{
|
||||||
|
if (block_state == BlockState::ChecksumWritten ||
|
||||||
|
(block_state == BlockState::Block && block_position == 0))
|
||||||
|
{
|
||||||
|
// Done with the current block, finish everything up now.
|
||||||
|
INFO_LOG_FMT(EXPANSIONINTERFACE, "Assuming stop transmission; done with block read");
|
||||||
|
state = State::ReadyForCommand;
|
||||||
|
block_state = BlockState::Nothing;
|
||||||
|
address = 0;
|
||||||
|
block_position = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
INFO_LOG_FMT(EXPANSIONINTERFACE,
|
||||||
|
"Assuming stop transmission; changing to single block read to finish");
|
||||||
state = State::SingleBlockRead;
|
state = State::SingleBlockRead;
|
||||||
}
|
}
|
||||||
|
// JANK, but I think this will work right
|
||||||
|
response.push_back(0); // R1 - for later
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 CEXISD::ReadForBlockWrite()
|
u8 CEXISD::ReadForBlockWrite()
|
||||||
@ -579,13 +602,13 @@ u8 CEXISD::ReadForBlockWrite()
|
|||||||
}
|
}
|
||||||
else if (!m_card.WriteBytes(block_buffer.data(), BLOCK_SIZE))
|
else if (!m_card.WriteBytes(block_buffer.data(), BLOCK_SIZE))
|
||||||
{
|
{
|
||||||
ERROR_LOG_FMT(EXPANSIONINTERFACE, "SD write failed - error: {}, eof: {}",
|
ERROR_LOG_FMT(EXPANSIONINTERFACE, "SD write failed at {:#x} - error: {}, eof: {}", address,
|
||||||
ferror(m_card.GetHandle()), feof(m_card.GetHandle()));
|
ferror(m_card.GetHandle()), feof(m_card.GetHandle()));
|
||||||
result = DATA_RESPONSE_WRITE_ERROR;
|
result = DATA_RESPONSE_WRITE_ERROR;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
INFO_LOG_FMT(EXPANSIONINTERFACE, "SD write succeeded");
|
INFO_LOG_FMT(EXPANSIONINTERFACE, "SD write succeeded at {:#x}", address);
|
||||||
result = DATA_RESPONSE_ACCEPTED;
|
result = DATA_RESPONSE_ACCEPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user