|
|
|
@ -185,7 +185,7 @@ void Read16(u16& _rReturnValue, const u32 _Address)
|
|
|
|
|
_rReturnValue = ReadLow (fifo.CPEnd - fifo.SafeCPReadPointer + fifo.CPWritePointer - fifo.CPBase + 32);
|
|
|
|
|
else
|
|
|
|
|
_rReturnValue = ReadLow (fifo.CPReadWriteDistance);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR, "read FIFO_RW_DISTANCE_LO : %04x", _rReturnValue);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR, "Read FIFO_RW_DISTANCE_LO : %04x", _rReturnValue);
|
|
|
|
|
return;
|
|
|
|
|
case FIFO_RW_DISTANCE_HI:
|
|
|
|
|
if (IsOnThread())
|
|
|
|
@ -195,29 +195,29 @@ void Read16(u16& _rReturnValue, const u32 _Address)
|
|
|
|
|
_rReturnValue = ReadHigh (fifo.CPEnd - fifo.SafeCPReadPointer + fifo.CPWritePointer - fifo.CPBase + 32);
|
|
|
|
|
else
|
|
|
|
|
_rReturnValue = ReadHigh(fifo.CPReadWriteDistance);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR, "read FIFO_RW_DISTANCE_HI : %04x", _rReturnValue);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR, "Read FIFO_RW_DISTANCE_HI : %04x", _rReturnValue);
|
|
|
|
|
return;
|
|
|
|
|
case FIFO_WRITE_POINTER_LO:
|
|
|
|
|
_rReturnValue = ReadLow (fifo.CPWritePointer);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR, "read FIFO_WRITE_POINTER_LO : %04x", _rReturnValue);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR, "Read FIFO_WRITE_POINTER_LO : %04x", _rReturnValue);
|
|
|
|
|
return;
|
|
|
|
|
case FIFO_WRITE_POINTER_HI:
|
|
|
|
|
_rReturnValue = ReadHigh(fifo.CPWritePointer);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR, "read FIFO_WRITE_POINTER_HI : %04x", _rReturnValue);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR, "Read FIFO_WRITE_POINTER_HI : %04x", _rReturnValue);
|
|
|
|
|
return;
|
|
|
|
|
case FIFO_READ_POINTER_LO:
|
|
|
|
|
if (IsOnThread())
|
|
|
|
|
_rReturnValue = ReadLow (fifo.SafeCPReadPointer);
|
|
|
|
|
else
|
|
|
|
|
_rReturnValue = ReadLow (fifo.CPReadPointer);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR, "read FIFO_READ_POINTER_LO : %04x", _rReturnValue);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR, "Read FIFO_READ_POINTER_LO : %04x", _rReturnValue);
|
|
|
|
|
return;
|
|
|
|
|
case FIFO_READ_POINTER_HI:
|
|
|
|
|
if (IsOnThread())
|
|
|
|
|
_rReturnValue = ReadHigh (fifo.SafeCPReadPointer);
|
|
|
|
|
else
|
|
|
|
|
_rReturnValue = ReadHigh (fifo.CPReadPointer);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR, "read FIFO_READ_POINTER_HI : %04x", _rReturnValue);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR, "Read FIFO_READ_POINTER_HI : %04x", _rReturnValue);
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
case FIFO_BP_LO: _rReturnValue = ReadLow (fifo.CPBreakpoint); return;
|
|
|
|
@ -326,83 +326,83 @@ void Write16(const u16 _Value, const u32 _Address)
|
|
|
|
|
{
|
|
|
|
|
UCPClearReg tmpCtrl(_Value);
|
|
|
|
|
m_CPClearReg.Hex = tmpCtrl.Hex;
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t write to CLEAR_REGISTER : %04x", _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t Write to CLEAR_REGISTER : %04x", _Value);
|
|
|
|
|
SetCpClearRegister();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case PERF_SELECT:
|
|
|
|
|
// Seems to select which set of perf registers should be exposed.
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR, "write to PERF_SELECT: %04x", _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR, "Write to PERF_SELECT: %04x", _Value);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
// Fifo Registers
|
|
|
|
|
case FIFO_TOKEN_REGISTER:
|
|
|
|
|
m_tokenReg = _Value;
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_TOKEN_REGISTER : %04x", _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t Write to FIFO_TOKEN_REGISTER : %04x", _Value);
|
|
|
|
|
break;
|
|
|
|
|
case FIFO_BASE_LO:
|
|
|
|
|
WriteLow ((u32 &)fifo.CPBase, _Value & 0xFFE0);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_BASE_LO : %04x", _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t Write to FIFO_BASE_LO : %04x", _Value);
|
|
|
|
|
break;
|
|
|
|
|
case FIFO_BASE_HI:
|
|
|
|
|
WriteHigh((u32 &)fifo.CPBase, _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_BASE_HI : %04x", _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t Write to FIFO_BASE_HI : %04x", _Value);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case FIFO_END_LO:
|
|
|
|
|
WriteLow ((u32 &)fifo.CPEnd, _Value & 0xFFE0);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_END_LO : %04x", _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t Write to FIFO_END_LO : %04x", _Value);
|
|
|
|
|
break;
|
|
|
|
|
case FIFO_END_HI:
|
|
|
|
|
WriteHigh((u32 &)fifo.CPEnd, _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_END_HI : %04x", _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t Write to FIFO_END_HI : %04x", _Value);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case FIFO_WRITE_POINTER_LO:
|
|
|
|
|
WriteLow ((u32 &)fifo.CPWritePointer, _Value & 0xFFE0);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_WRITE_POINTER_LO : %04x", _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t Write to FIFO_WRITE_POINTER_LO : %04x", _Value);
|
|
|
|
|
break;
|
|
|
|
|
case FIFO_WRITE_POINTER_HI:
|
|
|
|
|
WriteHigh((u32 &)fifo.CPWritePointer, _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_WRITE_POINTER_HI : %04x", _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t Write to FIFO_WRITE_POINTER_HI : %04x", _Value);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case FIFO_READ_POINTER_LO:
|
|
|
|
|
WriteLow ((u32 &)fifo.CPReadPointer, _Value & 0xFFE0);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_READ_POINTER_LO : %04x", _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t Write to FIFO_READ_POINTER_LO : %04x", _Value);
|
|
|
|
|
break;
|
|
|
|
|
case FIFO_READ_POINTER_HI:
|
|
|
|
|
WriteHigh((u32 &)fifo.CPReadPointer, _Value);
|
|
|
|
|
fifo.SafeCPReadPointer = fifo.CPReadPointer;
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_READ_POINTER_HI : %04x", _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t Write to FIFO_READ_POINTER_HI : %04x", _Value);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case FIFO_HI_WATERMARK_LO:
|
|
|
|
|
WriteLow ((u32 &)fifo.CPHiWatermark, _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_HI_WATERMARK_LO : %04x", _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t Write to FIFO_HI_WATERMARK_LO : %04x", _Value);
|
|
|
|
|
break;
|
|
|
|
|
case FIFO_HI_WATERMARK_HI:
|
|
|
|
|
WriteHigh((u32 &)fifo.CPHiWatermark, _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_HI_WATERMARK_HI : %04x", _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t Write to FIFO_HI_WATERMARK_HI : %04x", _Value);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case FIFO_LO_WATERMARK_LO:
|
|
|
|
|
WriteLow ((u32 &)fifo.CPLoWatermark, _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_LO_WATERMARK_LO : %04x", _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t Write to FIFO_LO_WATERMARK_LO : %04x", _Value);
|
|
|
|
|
break;
|
|
|
|
|
case FIFO_LO_WATERMARK_HI:
|
|
|
|
|
WriteHigh((u32 &)fifo.CPLoWatermark, _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_LO_WATERMARK_HI : %04x", _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"\t Write to FIFO_LO_WATERMARK_HI : %04x", _Value);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case FIFO_BP_LO:
|
|
|
|
|
WriteLow ((u32 &)fifo.CPBreakpoint, _Value & 0xFFE0);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"write to FIFO_BP_LO : %04x", _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"Write to FIFO_BP_LO : %04x", _Value);
|
|
|
|
|
break;
|
|
|
|
|
case FIFO_BP_HI:
|
|
|
|
|
WriteHigh((u32 &)fifo.CPBreakpoint, _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"write to FIFO_BP_HI : %04x", _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"Write to FIFO_BP_HI : %04x", _Value);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case FIFO_RW_DISTANCE_HI:
|
|
|
|
@ -417,11 +417,11 @@ void Write16(const u16 _Value, const u32 _Address)
|
|
|
|
|
ResetVideoBuffer();
|
|
|
|
|
}
|
|
|
|
|
IncrementCheckContextId();
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"try to write to FIFO_RW_DISTANCE_HI : %04x", _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"Try to write to FIFO_RW_DISTANCE_HI : %04x", _Value);
|
|
|
|
|
break;
|
|
|
|
|
case FIFO_RW_DISTANCE_LO:
|
|
|
|
|
WriteLow((u32 &)fifo.CPReadWriteDistance, _Value & 0xFFE0);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"try to write to FIFO_RW_DISTANCE_LO : %04x", _Value);
|
|
|
|
|
DEBUG_LOG(COMMANDPROCESSOR,"Try to write to FIFO_RW_DISTANCE_LO : %04x", _Value);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
@ -453,7 +453,7 @@ void STACKALIGN GatherPipeBursted()
|
|
|
|
|
RunGpu();
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// In multibuffer mode is not allowed write in the same fifo attached to the GPU.
|
|
|
|
|
// In multibuffer mode is not allowed write in the same FIFO attached to the GPU.
|
|
|
|
|
// Fix Pokemon XD in DC mode.
|
|
|
|
|
if((ProcessorInterface::Fifo_CPUEnd == fifo.CPEnd) && (ProcessorInterface::Fifo_CPUBase == fifo.CPBase)
|
|
|
|
|
&& fifo.CPReadWriteDistance > 0)
|
|
|
|
@ -469,7 +469,7 @@ void STACKALIGN GatherPipeBursted()
|
|
|
|
|
if (IsOnThread())
|
|
|
|
|
SetCpStatus(true);
|
|
|
|
|
|
|
|
|
|
// update the fifo-pointer
|
|
|
|
|
// update the fifo pointer
|
|
|
|
|
if (fifo.CPWritePointer >= fifo.CPEnd)
|
|
|
|
|
fifo.CPWritePointer = fifo.CPBase;
|
|
|
|
|
else
|
|
|
|
@ -481,7 +481,7 @@ void STACKALIGN GatherPipeBursted()
|
|
|
|
|
RunGpu();
|
|
|
|
|
|
|
|
|
|
_assert_msg_(COMMANDPROCESSOR, fifo.CPReadWriteDistance <= fifo.CPEnd - fifo.CPBase,
|
|
|
|
|
"FIFO is overflown by GatherPipe !\nCPU thread is too fast!");
|
|
|
|
|
"FIFO is overflowed by GatherPipe !\nCPU thread is too fast!");
|
|
|
|
|
|
|
|
|
|
// check if we are in sync
|
|
|
|
|
_assert_msg_(COMMANDPROCESSOR, fifo.CPWritePointer == ProcessorInterface::Fifo_CPUWritePointer, "FIFOs linked but out of sync");
|
|
|
|
|