CDROM: Simplify register indexing for write

This commit is contained in:
Connor McLaughlin 2020-03-19 00:28:41 +10:00
parent 1ee68ad12a
commit 3223f87eeb

View File

@ -233,23 +233,17 @@ u8 CDROM::ReadRegister(u32 offset)
case 3: case 3:
{ {
switch (m_status.index) if (m_status.index & 1)
{
case 0:
case 2:
{
const u8 value = m_interrupt_enable_register | ~INTERRUPT_REGISTER_MASK;
Log_DebugPrintf("CDROM read interrupt enable register <- 0x%02X", ZeroExtend32(value));
return value;
}
case 1:
case 3:
{ {
const u8 value = m_interrupt_flag_register | ~INTERRUPT_REGISTER_MASK; const u8 value = m_interrupt_flag_register | ~INTERRUPT_REGISTER_MASK;
Log_DebugPrintf("CDROM read interrupt flag register <- 0x%02X", ZeroExtend32(value)); Log_DebugPrintf("CDROM read interrupt flag register <- 0x%02X", ZeroExtend32(value));
return value; return value;
} }
else
{
const u8 value = m_interrupt_enable_register | ~INTERRUPT_REGISTER_MASK;
Log_DebugPrintf("CDROM read interrupt enable register <- 0x%02X", ZeroExtend32(value));
return value;
} }
} }
break; break;
@ -263,19 +257,15 @@ u8 CDROM::ReadRegister(u32 offset)
void CDROM::WriteRegister(u32 offset, u8 value) void CDROM::WriteRegister(u32 offset, u8 value)
{ {
switch (offset) if (offset == 0)
{
case 0:
{ {
Log_TracePrintf("CDROM status register <- 0x%02X", value); Log_TracePrintf("CDROM status register <- 0x%02X", value);
m_status.bits = (m_status.bits & static_cast<u8>(~3)) | (value & u8(3)); m_status.bits = (m_status.bits & static_cast<u8>(~3)) | (value & u8(3));
return; return;
} }
break;
case 1: const u32 reg = (m_status.index * 3u) + (offset - 1);
{ switch (reg)
switch (m_status.index)
{ {
case 0: case 0:
{ {
@ -291,32 +281,6 @@ void CDROM::WriteRegister(u32 offset, u8 value)
} }
case 1: case 1:
{
Log_ErrorPrintf("Sound map data out <- 0x%02X", value);
return;
}
case 2:
{
Log_ErrorPrintf("Sound map coding info <- 0x%02X", value);
return;
}
case 3:
{
Log_DebugPrintf("Audio volume for right-to-left output <- 0x%02X", value);
m_next_cd_audio_volume_matrix[1][0] = value;
return;
}
}
}
break;
case 2:
{
switch (m_status.index)
{
case 0:
{ {
if (m_param_fifo.IsFull()) if (m_param_fifo.IsFull())
{ {
@ -329,36 +293,7 @@ void CDROM::WriteRegister(u32 offset, u8 value)
return; return;
} }
case 1:
{
Log_DebugPrintf("Interrupt enable register <- 0x%02X", value);
m_interrupt_enable_register = value & INTERRUPT_REGISTER_MASK;
UpdateInterruptRequest();
return;
}
case 2: case 2:
{
Log_DebugPrintf("Audio volume for left-to-left output <- 0x%02X", value);
m_next_cd_audio_volume_matrix[0][0] = value;
return;
}
case 3:
{
Log_DebugPrintf("Audio volume for right-to-left output <- 0x%02X", value);
m_next_cd_audio_volume_matrix[1][0] = value;
return;
}
}
}
break;
case 3:
{
switch (m_status.index)
{
case 0:
{ {
// TODO: sector buffer is not the data fifo // TODO: sector buffer is not the data fifo
Log_DebugPrintf("Request register <- 0x%02X", value); Log_DebugPrintf("Request register <- 0x%02X", value);
@ -378,7 +313,21 @@ void CDROM::WriteRegister(u32 offset, u8 value)
return; return;
} }
case 1: case 3:
{
Log_ErrorPrintf("Sound map data out <- 0x%02X", value);
return;
}
case 4:
{
Log_DebugPrintf("Interrupt enable register <- 0x%02X", value);
m_interrupt_enable_register = value & INTERRUPT_REGISTER_MASK;
UpdateInterruptRequest();
return;
}
case 5:
{ {
Log_DebugPrintf("Interrupt flag register <- 0x%02X", value); Log_DebugPrintf("Interrupt flag register <- 0x%02X", value);
m_interrupt_flag_register &= ~(value & INTERRUPT_REGISTER_MASK); m_interrupt_flag_register &= ~(value & INTERRUPT_REGISTER_MASK);
@ -400,14 +349,41 @@ void CDROM::WriteRegister(u32 offset, u8 value)
return; return;
} }
case 2: case 6:
{
Log_ErrorPrintf("Sound map coding info <- 0x%02X", value);
return;
}
case 7:
{
Log_DebugPrintf("Audio volume for left-to-left output <- 0x%02X", value);
m_next_cd_audio_volume_matrix[0][0] = value;
return;
}
case 8:
{ {
Log_DebugPrintf("Audio volume for left-to-right output <- 0x%02X", value); Log_DebugPrintf("Audio volume for left-to-right output <- 0x%02X", value);
m_next_cd_audio_volume_matrix[0][1] = value; m_next_cd_audio_volume_matrix[0][1] = value;
return; return;
} }
case 3: case 9:
{
Log_DebugPrintf("Audio volume for right-to-left output <- 0x%02X", value);
m_next_cd_audio_volume_matrix[1][0] = value;
return;
}
case 10:
{
Log_DebugPrintf("Audio volume for right-to-left output <- 0x%02X", value);
m_next_cd_audio_volume_matrix[1][0] = value;
return;
}
case 11:
{ {
Log_DebugPrintf("Audio volume apply changes <- 0x%02X", value); Log_DebugPrintf("Audio volume apply changes <- 0x%02X", value);
m_adpcm_muted = ConvertToBoolUnchecked(value & u8(0x01)); m_adpcm_muted = ConvertToBoolUnchecked(value & u8(0x01));
@ -415,13 +391,14 @@ void CDROM::WriteRegister(u32 offset, u8 value)
m_cd_audio_volume_matrix = m_next_cd_audio_volume_matrix; m_cd_audio_volume_matrix = m_next_cd_audio_volume_matrix;
return; return;
} }
}
}
break;
}
Log_ErrorPrintf("Unknown CDROM register write: offset=0x%02X, index=%d, value=0x%02X", offset, default:
m_status.index.GetValue(), value); {
Log_ErrorPrintf("Unknown CDROM register write: offset=0x%02X, index=%d, reg=%u, value=0x%02X", offset,
m_status.index.GetValue(), reg, value);
return;
}
}
} }
void CDROM::DMARead(u32* words, u32 word_count) void CDROM::DMARead(u32* words, u32 word_count)