Exemple #1
0
void ZeldaUCode::HandleMail_LightVersion(u32 mail)
{
	//ERROR_LOG(DSPHLE, "Light version mail %08X, list in progress: %s, step: %i/%i",
	// mail, m_list_in_progress ? "yes":"no", m_step, m_num_steps);

	if (m_sync_cmd_pending)
	{
		DSP::GenerateDSPInterruptFromDSPEmu(DSP::INT_DSP);

		MixAudio();

		m_current_buffer++;

		if (m_current_buffer == m_num_buffers)
		{
			m_sync_cmd_pending = false;
			DEBUG_LOG(DSPHLE, "Update the SoundThread to be in sync");
		}
		return;
	}

	if (!m_list_in_progress)
	{
		switch ((mail >> 24) & 0x7F)
		{
		case 0x00: m_num_steps = 1; break; // dummy
		case 0x01: m_num_steps = 5; break; // DsetupTable
		case 0x02: m_num_steps = 3; break; // DsyncFrame

		default:
			{
				m_num_steps = 0;
				PanicAlert("Zelda uCode (light version): unknown/unsupported command %02X", (mail >> 24) & 0x7F);
			}
			return;
		}

		m_list_in_progress = true;
		m_step = 0;
	}

	if (m_step >= sizeof(m_buffer) / 4)
		PanicAlert("m_step out of range");

	((u32*)m_buffer)[m_step] = mail;
	m_step++;

	if (m_step >= m_num_steps)
	{
		ExecuteList();
		m_list_in_progress = false;
	}
}
Exemple #2
0
void CUCode_Zelda::HandleMail_LightVersion(u32 _uMail)
{
	//ERROR_LOG(DSPHLE, "Light version mail %08X, list in progress: %s, step: %i/%i", 
	//	_uMail, m_bListInProgress ? "yes":"no", m_step, m_numSteps);

	if (m_bSyncCmdPending)
	{
		DSP::GenerateDSPInterruptFromDSPEmu(DSP::INT_DSP);
		m_CurBuffer++;

		if (m_CurBuffer == m_NumBuffers)
		{
			soundStream->GetMixer()->SetHLEReady(true);
			m_bSyncCmdPending = false;
			DEBUG_LOG(DSPHLE, "Update the SoundThread to be in sync");
		}
		return;
	}

	if (!m_bListInProgress)
	{
		switch ((_uMail >> 24) & 0x7F)
		{
		case 0x00: m_numSteps = 1; break; // dummy
		case 0x01: m_numSteps = 5; break; // DsetupTable
		case 0x02: m_numSteps = 3; break; // DsyncFrame

		default:
			{
				m_numSteps = 0;
				PanicAlert("Zelda uCode (light version): unknown/unsupported command %02X", (_uMail >> 24) & 0x7F);
			}
			return;
		}

		m_bListInProgress = true;
		m_step = 0;
	}

	if (m_step >= sizeof(m_Buffer) / 4)
		PanicAlert("m_step out of range");

	((u32*)m_Buffer)[m_step] = _uMail;
	m_step++;

	if (m_step >= m_numSteps)
	{
		ExecuteList();
		m_bListInProgress = false;
	}
}