dsphle - improved ax/axwii hle ucode switching (needed for Nintendo Puzzle Collection <-> GBA, ...)
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6052 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
3312435ae2
commit
a8f6904ec7
|
@ -211,14 +211,10 @@ void CUCode_AX::MixAdd(short* _pBuffer, int _iSize)
|
||||||
// Handle incoming mail
|
// Handle incoming mail
|
||||||
void CUCode_AX::HandleMail(u32 _uMail)
|
void CUCode_AX::HandleMail(u32 _uMail)
|
||||||
{
|
{
|
||||||
static s8 newucodemails = -1;
|
if (m_UploadSetupInProgress)
|
||||||
|
{
|
||||||
if (newucodemails > -1) {
|
PrepareBootUCode(_uMail);
|
||||||
newucodemails++;
|
return;
|
||||||
if (newucodemails == 10) {
|
|
||||||
newucodemails = -1;
|
|
||||||
m_rMailHandler.PushMail(DSP_RESUME);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if ((_uMail & 0xFFFF0000) == MAIL_AX_ALIST)
|
if ((_uMail & 0xFFFF0000) == MAIL_AX_ALIST)
|
||||||
|
@ -232,13 +228,16 @@ void CUCode_AX::HandleMail(u32 _uMail)
|
||||||
}
|
}
|
||||||
else if (_uMail == 0xCDD10001) // Action 1 - new ucode upload ( GC: BayBlade S.T.B,...)
|
else if (_uMail == 0xCDD10001) // Action 1 - new ucode upload ( GC: BayBlade S.T.B,...)
|
||||||
{
|
{
|
||||||
NOTICE_LOG(DSPHLE,"DSP IROM - New Ucode!");
|
DEBUG_LOG(DSPHLE,"DSP IROM - New Ucode!");
|
||||||
newucodemails = 0;
|
// TODO find a better way to protect from HLEMixer?
|
||||||
|
soundStream->GetMixer()->SetHLEReady(false);
|
||||||
|
m_UploadSetupInProgress = true;
|
||||||
}
|
}
|
||||||
else if (_uMail == 0xCDD10002) // Action 2 - IROM_Reset(); ( GC: NFS Carbon, FF Crystal Chronicles,...)
|
else if (_uMail == 0xCDD10002) // Action 2 - IROM_Reset(); ( GC: NFS Carbon, FF Crystal Chronicles,...)
|
||||||
{
|
{
|
||||||
NOTICE_LOG(DSPHLE,"DSP IROM - Reset!");
|
DEBUG_LOG(DSPHLE,"DSP IROM - Reset!");
|
||||||
CDSPHandler::GetInstance().SetUCode(UCODE_ROM);
|
CDSPHandler::GetInstance().SetUCode(UCODE_ROM);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else if (_uMail == 0xCDD10003) // Action 3 - AX_GetNextCmdBlock();
|
else if (_uMail == 0xCDD10003) // Action 3 - AX_GetNextCmdBlock();
|
||||||
{
|
{
|
||||||
|
@ -256,8 +255,13 @@ void CUCode_AX::HandleMail(u32 _uMail)
|
||||||
// Update with DSP Interrupt
|
// Update with DSP Interrupt
|
||||||
void CUCode_AX::Update(int cycles)
|
void CUCode_AX::Update(int cycles)
|
||||||
{
|
{
|
||||||
|
if (NeedsResumeMail())
|
||||||
|
{
|
||||||
|
m_rMailHandler.PushMail(DSP_RESUME);
|
||||||
|
g_dspInitialize.pGenerateDSPInterrupt();
|
||||||
|
}
|
||||||
// check if we have to send something
|
// check if we have to send something
|
||||||
if (!m_rMailHandler.IsEmpty())
|
else if (!m_rMailHandler.IsEmpty())
|
||||||
{
|
{
|
||||||
g_dspInitialize.pGenerateDSPInterrupt();
|
g_dspInitialize.pGenerateDSPInterrupt();
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,14 +51,10 @@ CUCode_AXWii::~CUCode_AXWii()
|
||||||
|
|
||||||
void CUCode_AXWii::HandleMail(u32 _uMail)
|
void CUCode_AXWii::HandleMail(u32 _uMail)
|
||||||
{
|
{
|
||||||
static s8 newucodemails = -1;
|
if (m_UploadSetupInProgress)
|
||||||
|
{
|
||||||
if (newucodemails > -1) {
|
PrepareBootUCode(_uMail);
|
||||||
newucodemails++;
|
return;
|
||||||
if (newucodemails == 10) {
|
|
||||||
newucodemails = -1;
|
|
||||||
m_rMailHandler.PushMail(DSP_RESUME);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if ((_uMail & 0xFFFF0000) == MAIL_AX_ALIST)
|
else if ((_uMail & 0xFFFF0000) == MAIL_AX_ALIST)
|
||||||
{
|
{
|
||||||
|
@ -72,24 +68,24 @@ void CUCode_AXWii::HandleMail(u32 _uMail)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xCDD10001: // Action 1 - new ucode upload
|
case 0xCDD10001: // Action 1 - new ucode upload
|
||||||
NOTICE_LOG(DSPHLE,"DSP IROM - New Ucode!");
|
DEBUG_LOG(DSPHLE,"DSP IROM - New Ucode!");
|
||||||
newucodemails = 0;
|
// TODO find a better way to protect from HLEMixer?
|
||||||
|
soundStream->GetMixer()->SetHLEReady(false);
|
||||||
|
m_UploadSetupInProgress = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xCDD10002: // Action 2 - IROM_Reset(); ( WII: De Blob, Cursed Mountain,...)
|
case 0xCDD10002: // Action 2 - IROM_Reset(); ( WII: De Blob, Cursed Mountain,...)
|
||||||
NOTICE_LOG(DSPHLE,"DSP IROM - Reset!");
|
DEBUG_LOG(DSPHLE,"DSP IROM - Reset!");
|
||||||
CDSPHandler::GetInstance().SetUCode(UCODE_ROM);
|
CDSPHandler::GetInstance().SetUCode(UCODE_ROM);
|
||||||
break;
|
return;
|
||||||
|
|
||||||
case 0xCDD10003: // Action 3 - AX_GetNextCmdBlock()
|
case 0xCDD10003: // Action 3 - AX_GetNextCmdBlock()
|
||||||
//TODO: Implement??
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
|
||||||
DEBUG_LOG(DSPHLE, " >>>> u32 MAIL : AXTask Mail (%08x)", _uMail);
|
DEBUG_LOG(DSPHLE, " >>>> u32 MAIL : AXTask Mail (%08x)", _uMail);
|
||||||
AXTask(_uMail);
|
AXTask(_uMail);
|
||||||
}
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,8 +143,13 @@ void CUCode_AXWii::MixAdd(short* _pBuffer, int _iSize)
|
||||||
|
|
||||||
void CUCode_AXWii::Update(int cycles)
|
void CUCode_AXWii::Update(int cycles)
|
||||||
{
|
{
|
||||||
// check if we have to sent something
|
if (NeedsResumeMail())
|
||||||
if (!m_rMailHandler.IsEmpty())
|
{
|
||||||
|
m_rMailHandler.PushMail(DSP_RESUME);
|
||||||
|
g_dspInitialize.pGenerateDSPInterrupt();
|
||||||
|
}
|
||||||
|
// check if we have to send something
|
||||||
|
else if (!m_rMailHandler.IsEmpty())
|
||||||
{
|
{
|
||||||
g_dspInitialize.pGenerateDSPInterrupt();
|
g_dspInitialize.pGenerateDSPInterrupt();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue