EXI_DeviceMemoryCard: Use enum class for Command

This commit is contained in:
Léo Lam 2020-11-20 19:10:03 +01:00
parent b2f00be637
commit f81062f561
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
2 changed files with 50 additions and 47 deletions

View File

@ -118,7 +118,7 @@ CEXIMemoryCard::CEXIMemoryCard(const int index, bool gci_folder,
m_interrupt_switch = 0;
m_interrupt_set = false;
m_command = 0;
m_command = Command::NintendoID;
m_status = MC_STATUS_BUSY | MC_STATUS_UNLOCKED | MC_STATUS_READY;
m_position = 0;
memset(m_programming_buffer, 0, sizeof(m_programming_buffer));
@ -289,7 +289,7 @@ void CEXIMemoryCard::SetCS(int cs)
{
switch (m_command)
{
case cmdSectorErase:
case Command::SectorErase:
if (m_position > 2)
{
m_memory_card->ClearBlock(m_address & (m_memory_card_size - 1));
@ -302,7 +302,7 @@ void CEXIMemoryCard::SetCS(int cs)
}
break;
case cmdChipErase:
case Command::ChipErase:
if (m_position > 2)
{
// TODO: Investigate on HW, I (LPFaint99) believe that this only
@ -312,7 +312,7 @@ void CEXIMemoryCard::SetCS(int cs)
}
break;
case cmdPageProgram:
case Command::PageProgram:
if (m_position >= 5)
{
int count = m_position - 5;
@ -329,6 +329,9 @@ void CEXIMemoryCard::SetCS(int cs)
CmdDoneLater(5000);
}
break;
default:
break;
}
}
}
@ -345,26 +348,26 @@ void CEXIMemoryCard::TransferByte(u8& byte)
DEBUG_LOG_FMT(EXPANSIONINTERFACE, "EXI MEMCARD: > {:02x}", byte);
if (m_position == 0)
{
m_command = byte; // first byte is command
byte = 0xFF; // would be tristate, but we don't care.
m_command = static_cast<Command>(byte); // first byte is command
byte = 0xFF; // would be tristate, but we don't care.
switch (m_command) // This seems silly, do we really need it?
{
case cmdNintendoID:
case cmdReadArray:
case cmdArrayToBuffer:
case cmdSetInterrupt:
case cmdWriteBuffer:
case cmdReadStatus:
case cmdReadID:
case cmdReadErrorBuffer:
case cmdWakeUp:
case cmdSleep:
case cmdClearStatus:
case cmdSectorErase:
case cmdPageProgram:
case cmdExtraByteProgram:
case cmdChipErase:
case Command::NintendoID:
case Command::ReadArray:
case Command::ArrayToBuffer:
case Command::SetInterrupt:
case Command::WriteBuffer:
case Command::ReadStatus:
case Command::ReadID:
case Command::ReadErrorBuffer:
case Command::WakeUp:
case Command::Sleep:
case Command::ClearStatus:
case Command::SectorErase:
case Command::PageProgram:
case Command::ExtraByteProgram:
case Command::ChipErase:
DEBUG_LOG_FMT(EXPANSIONINTERFACE, "EXI MEMCARD: command {:02x} at position 0. seems normal.",
m_command);
break;
@ -372,7 +375,7 @@ void CEXIMemoryCard::TransferByte(u8& byte)
WARN_LOG_FMT(EXPANSIONINTERFACE, "EXI MEMCARD: command {:02x} at position 0", m_command);
break;
}
if (m_command == cmdClearStatus)
if (m_command == Command::ClearStatus)
{
m_status &= ~MC_STATUS_PROGRAMEERROR;
m_status &= ~MC_STATUS_ERASEERROR;
@ -389,7 +392,7 @@ void CEXIMemoryCard::TransferByte(u8& byte)
{
switch (m_command)
{
case cmdNintendoID:
case Command::NintendoID:
//
// Nintendo card:
// 00 | 80 00 00 00 10 00 00 00
@ -402,7 +405,7 @@ void CEXIMemoryCard::TransferByte(u8& byte)
byte = static_cast<u8>(m_memory_card->GetCardId() >> (24 - (((m_position - 2) & 3) * 8)));
break;
case cmdReadArray:
case Command::ReadArray:
switch (m_position)
{
case 1: // AD1
@ -429,19 +432,19 @@ void CEXIMemoryCard::TransferByte(u8& byte)
}
break;
case cmdReadStatus:
case Command::ReadStatus:
// (unspecified for byte 1)
byte = m_status;
break;
case cmdReadID:
case Command::ReadID:
if (m_position == 1) // (unspecified)
byte = static_cast<u8>(m_card_id >> 8);
else
byte = static_cast<u8>((m_position & 1) ? (m_card_id) : (m_card_id >> 8));
break;
case cmdSectorErase:
case Command::SectorErase:
switch (m_position)
{
case 1: // AD1
@ -454,7 +457,7 @@ void CEXIMemoryCard::TransferByte(u8& byte)
byte = 0xFF;
break;
case cmdSetInterrupt:
case Command::SetInterrupt:
if (m_position == 1)
{
m_interrupt_switch = byte;
@ -462,11 +465,11 @@ void CEXIMemoryCard::TransferByte(u8& byte)
byte = 0xFF;
break;
case cmdChipErase:
case Command::ChipErase:
byte = 0xFF;
break;
case cmdPageProgram:
case Command::PageProgram:
switch (m_position)
{
case 1: // AD1

View File

@ -71,23 +71,23 @@ private:
// Variant of CmdDone which schedules an event later in the future to complete the command.
void CmdDoneLater(u64 cycles);
enum
enum class Command
{
cmdNintendoID = 0x00,
cmdReadArray = 0x52,
cmdArrayToBuffer = 0x53,
cmdSetInterrupt = 0x81,
cmdWriteBuffer = 0x82,
cmdReadStatus = 0x83,
cmdReadID = 0x85,
cmdReadErrorBuffer = 0x86,
cmdWakeUp = 0x87,
cmdSleep = 0x88,
cmdClearStatus = 0x89,
cmdSectorErase = 0xF1,
cmdPageProgram = 0xF2,
cmdExtraByteProgram = 0xF3,
cmdChipErase = 0xF4,
NintendoID = 0x00,
ReadArray = 0x52,
ArrayToBuffer = 0x53,
SetInterrupt = 0x81,
WriteBuffer = 0x82,
ReadStatus = 0x83,
ReadID = 0x85,
ReadErrorBuffer = 0x86,
WakeUp = 0x87,
Sleep = 0x88,
ClearStatus = 0x89,
SectorErase = 0xF1,
PageProgram = 0xF2,
ExtraByteProgram = 0xF3,
ChipErase = 0xF4,
};
int m_card_index;
@ -96,7 +96,7 @@ private:
// STATE_TO_SAVE
int m_interrupt_switch;
bool m_interrupt_set;
int m_command;
Command m_command;
int m_status;
u32 m_position;
u8 m_programming_buffer[128];