Пример #1
0
void FifoPlayer::SetupFifo()
{
	WriteCP(0x02, 0); // disable read, BP, interrupts
	WriteCP(0x04, 7); // clear overflow, underflow, metrics

	const FifoFrameInfo& frame = m_File->GetFrame(m_CurrentFrame);

	// Set fifo bounds
	WriteCP(0x20, frame.fifoStart);
	WriteCP(0x22, frame.fifoStart >> 16);
	WriteCP(0x24, frame.fifoEnd);
	WriteCP(0x26, frame.fifoEnd >> 16);

	// Set watermarks
	u32 fifoSize = frame.fifoEnd - frame.fifoStart;
	WriteCP(0x28, fifoSize);
	WriteCP(0x2a, fifoSize >> 16);
	WriteCP(0x2c, 0);
	WriteCP(0x2e, 0);

	// Set R/W pointers to fifo start
	WriteCP(0x30, 0);
	WriteCP(0x32, 0);
	WriteCP(0x34, frame.fifoStart);
	WriteCP(0x36, frame.fifoStart >> 16);
	WriteCP(0x38, frame.fifoStart);
	WriteCP(0x3a, frame.fifoStart >> 16);

	// Set fifo bounds
	WritePI(12, frame.fifoStart);
	WritePI(16, frame.fifoEnd);

	// Set write pointer
	WritePI(20, frame.fifoStart);
	FlushWGP();
	WritePI(20, frame.fifoStart);

	WriteCP(0x02, 17); // enable read & GP link
}
Пример #2
0
void FifoPlayer::SetupFifo()
{
  WriteCP(CommandProcessor::CTRL_REGISTER, 0);   // disable read, BP, interrupts
  WriteCP(CommandProcessor::CLEAR_REGISTER, 7);  // clear overflow, underflow, metrics

  const FifoFrameInfo& frame = m_File->GetFrame(m_CurrentFrame);

  // Set fifo bounds
  WriteCP(CommandProcessor::FIFO_BASE_LO, frame.fifoStart);
  WriteCP(CommandProcessor::FIFO_BASE_HI, frame.fifoStart >> 16);
  WriteCP(CommandProcessor::FIFO_END_LO, frame.fifoEnd);
  WriteCP(CommandProcessor::FIFO_END_HI, frame.fifoEnd >> 16);

  // Set watermarks, high at 75%, low at 0%
  u32 hi_watermark = (frame.fifoEnd - frame.fifoStart) * 3 / 4;
  WriteCP(CommandProcessor::FIFO_HI_WATERMARK_LO, hi_watermark);
  WriteCP(CommandProcessor::FIFO_HI_WATERMARK_HI, hi_watermark >> 16);
  WriteCP(CommandProcessor::FIFO_LO_WATERMARK_LO, 0);
  WriteCP(CommandProcessor::FIFO_LO_WATERMARK_HI, 0);

  // Set R/W pointers to fifo start
  WriteCP(CommandProcessor::FIFO_RW_DISTANCE_LO, 0);
  WriteCP(CommandProcessor::FIFO_RW_DISTANCE_HI, 0);
  WriteCP(CommandProcessor::FIFO_WRITE_POINTER_LO, frame.fifoStart);
  WriteCP(CommandProcessor::FIFO_WRITE_POINTER_HI, frame.fifoStart >> 16);
  WriteCP(CommandProcessor::FIFO_READ_POINTER_LO, frame.fifoStart);
  WriteCP(CommandProcessor::FIFO_READ_POINTER_HI, frame.fifoStart >> 16);

  // Set fifo bounds
  WritePI(ProcessorInterface::PI_FIFO_BASE, frame.fifoStart);
  WritePI(ProcessorInterface::PI_FIFO_END, frame.fifoEnd);

  // Set write pointer
  WritePI(ProcessorInterface::PI_FIFO_WPTR, frame.fifoStart);
  FlushWGP();
  WritePI(ProcessorInterface::PI_FIFO_WPTR, frame.fifoStart);

  WriteCP(CommandProcessor::CTRL_REGISTER, 17);  // enable read & GP link
}