mirror of
https://github.com/WinampDesktop/winamp.git
synced 2025-05-24 03:35:41 -04:00
CDROM: Simplify register indexing for write
This commit is contained in:
parent
1ee68ad12a
commit
3223f87eeb
@ -233,23 +233,17 @@ u8 CDROM::ReadRegister(u32 offset)
|
|||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
{
|
||||||
switch (m_status.index)
|
if (m_status.index & 1)
|
||||||
{
|
{
|
||||||
case 0:
|
const u8 value = m_interrupt_flag_register | ~INTERRUPT_REGISTER_MASK;
|
||||||
case 2:
|
Log_DebugPrintf("CDROM read interrupt flag register <- 0x%02X", ZeroExtend32(value));
|
||||||
{
|
return value;
|
||||||
const u8 value = m_interrupt_enable_register | ~INTERRUPT_REGISTER_MASK;
|
}
|
||||||
Log_DebugPrintf("CDROM read interrupt enable register <- 0x%02X", ZeroExtend32(value));
|
else
|
||||||
return value;
|
{
|
||||||
}
|
const u8 value = m_interrupt_enable_register | ~INTERRUPT_REGISTER_MASK;
|
||||||
|
Log_DebugPrintf("CDROM read interrupt enable register <- 0x%02X", ZeroExtend32(value));
|
||||||
case 1:
|
return value;
|
||||||
case 3:
|
|
||||||
{
|
|
||||||
const u8 value = m_interrupt_flag_register | ~INTERRUPT_REGISTER_MASK;
|
|
||||||
Log_DebugPrintf("CDROM read interrupt flag register <- 0x%02X", ZeroExtend32(value));
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -263,165 +257,148 @@ u8 CDROM::ReadRegister(u32 offset)
|
|||||||
|
|
||||||
void CDROM::WriteRegister(u32 offset, u8 value)
|
void CDROM::WriteRegister(u32 offset, u8 value)
|
||||||
{
|
{
|
||||||
switch (offset)
|
if (offset == 0)
|
||||||
|
{
|
||||||
|
Log_TracePrintf("CDROM status register <- 0x%02X", value);
|
||||||
|
m_status.bits = (m_status.bits & static_cast<u8>(~3)) | (value & u8(3));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const u32 reg = (m_status.index * 3u) + (offset - 1);
|
||||||
|
switch (reg)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
{
|
{
|
||||||
Log_TracePrintf("CDROM status register <- 0x%02X", value);
|
Log_DebugPrintf("CDROM command register <- 0x%02X", value);
|
||||||
m_status.bits = (m_status.bits & static_cast<u8>(~3)) | (value & u8(3));
|
if (HasPendingCommand())
|
||||||
|
{
|
||||||
|
Log_WarningPrintf("Cancelling pending command 0x%02X", static_cast<u8>(m_command));
|
||||||
|
m_command = Command::None;
|
||||||
|
}
|
||||||
|
|
||||||
|
BeginCommand(static_cast<Command>(value));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
{
|
||||||
switch (m_status.index)
|
if (m_param_fifo.IsFull())
|
||||||
{
|
{
|
||||||
case 0:
|
Log_WarningPrintf("Parameter FIFO overflow");
|
||||||
{
|
m_param_fifo.RemoveOne();
|
||||||
Log_DebugPrintf("CDROM command register <- 0x%02X", value);
|
|
||||||
if (HasPendingCommand())
|
|
||||||
{
|
|
||||||
Log_WarningPrintf("Cancelling pending command 0x%02X", static_cast<u8>(m_command));
|
|
||||||
m_command = Command::None;
|
|
||||||
}
|
|
||||||
|
|
||||||
BeginCommand(static_cast<Command>(value));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_param_fifo.Push(value);
|
||||||
|
UpdateStatusRegister();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
{
|
||||||
switch (m_status.index)
|
// TODO: sector buffer is not the data fifo
|
||||||
|
Log_DebugPrintf("Request register <- 0x%02X", value);
|
||||||
|
const RequestRegister rr{value};
|
||||||
|
Assert(!rr.SMEN);
|
||||||
|
if (rr.BFRD)
|
||||||
{
|
{
|
||||||
case 0:
|
LoadDataFIFO();
|
||||||
{
|
|
||||||
if (m_param_fifo.IsFull())
|
|
||||||
{
|
|
||||||
Log_WarningPrintf("Parameter FIFO overflow");
|
|
||||||
m_param_fifo.RemoveOne();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_param_fifo.Push(value);
|
|
||||||
UpdateStatusRegister();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
{
|
|
||||||
Log_DebugPrintf("Interrupt enable register <- 0x%02X", value);
|
|
||||||
m_interrupt_enable_register = value & INTERRUPT_REGISTER_MASK;
|
|
||||||
UpdateInterruptRequest();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log_DebugPrintf("Clearing data FIFO");
|
||||||
|
m_data_fifo.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateStatusRegister();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
{
|
||||||
switch (m_status.index)
|
Log_ErrorPrintf("Sound map data out <- 0x%02X", value);
|
||||||
{
|
return;
|
||||||
case 0:
|
|
||||||
{
|
|
||||||
// TODO: sector buffer is not the data fifo
|
|
||||||
Log_DebugPrintf("Request register <- 0x%02X", value);
|
|
||||||
const RequestRegister rr{value};
|
|
||||||
Assert(!rr.SMEN);
|
|
||||||
if (rr.BFRD)
|
|
||||||
{
|
|
||||||
LoadDataFIFO();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Log_DebugPrintf("Clearing data FIFO");
|
|
||||||
m_data_fifo.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
UpdateStatusRegister();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
{
|
|
||||||
Log_DebugPrintf("Interrupt flag register <- 0x%02X", value);
|
|
||||||
m_interrupt_flag_register &= ~(value & INTERRUPT_REGISTER_MASK);
|
|
||||||
if (m_interrupt_flag_register == 0)
|
|
||||||
{
|
|
||||||
if (HasPendingAsyncInterrupt())
|
|
||||||
DeliverAsyncInterrupt();
|
|
||||||
else
|
|
||||||
UpdateCommandEvent();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bit 6 clears the parameter FIFO.
|
|
||||||
if (value & 0x40)
|
|
||||||
{
|
|
||||||
m_param_fifo.Clear();
|
|
||||||
UpdateStatusRegister();
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
{
|
|
||||||
Log_DebugPrintf("Audio volume for left-to-right output <- 0x%02X", value);
|
|
||||||
m_next_cd_audio_volume_matrix[0][1] = value;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
{
|
|
||||||
Log_DebugPrintf("Audio volume apply changes <- 0x%02X", value);
|
|
||||||
m_adpcm_muted = ConvertToBoolUnchecked(value & u8(0x01));
|
|
||||||
if (value & 0x20)
|
|
||||||
m_cd_audio_volume_matrix = m_next_cd_audio_volume_matrix;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Log_ErrorPrintf("Unknown CDROM register write: offset=0x%02X, index=%d, value=0x%02X", offset,
|
case 4:
|
||||||
m_status.index.GetValue(), value);
|
{
|
||||||
|
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);
|
||||||
|
m_interrupt_flag_register &= ~(value & INTERRUPT_REGISTER_MASK);
|
||||||
|
if (m_interrupt_flag_register == 0)
|
||||||
|
{
|
||||||
|
if (HasPendingAsyncInterrupt())
|
||||||
|
DeliverAsyncInterrupt();
|
||||||
|
else
|
||||||
|
UpdateCommandEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bit 6 clears the parameter FIFO.
|
||||||
|
if (value & 0x40)
|
||||||
|
{
|
||||||
|
m_param_fifo.Clear();
|
||||||
|
UpdateStatusRegister();
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
m_next_cd_audio_volume_matrix[0][1] = value;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
m_adpcm_muted = ConvertToBoolUnchecked(value & u8(0x01));
|
||||||
|
if (value & 0x20)
|
||||||
|
m_cd_audio_volume_matrix = m_next_cd_audio_volume_matrix;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user