ZeldaHLE: Add a flag to disable Cmd0D on older UCodes.

Shouldn't really matter -- these NOP commands aren't really used, but since it
reads an argument it's probably better to explicitly NOP it for safety.
This commit is contained in:
Pierre Bourdon 2015-08-08 18:34:31 +02:00
parent 8526a4131c
commit 25430e7923
1 changed files with 19 additions and 5 deletions

View File

@ -43,20 +43,26 @@ enum ZeldaUCodeFlag
// If set, handle synchronization per-frame instead of per-16-voices. // If set, handle synchronization per-frame instead of per-16-voices.
SYNC_PER_FRAME = 0x00000040, SYNC_PER_FRAME = 0x00000040,
// If set, does not support command 0D. TODO: rename.
NO_CMD_0D = 0x00000080,
}; };
static const std::map<u32, u32> UCODE_FLAGS = { static const std::map<u32, u32> UCODE_FLAGS = {
// GameCube IPL/BIOS, NTSC. // GameCube IPL/BIOS, NTSC.
// TODO: check NO_CMD_0D presence.
{ 0x24B22038, LIGHT_PROTOCOL | FOUR_MIXING_DESTS | TINY_VPB | { 0x24B22038, LIGHT_PROTOCOL | FOUR_MIXING_DESTS | TINY_VPB |
VOLUME_EXPLICIT_STEP }, VOLUME_EXPLICIT_STEP | NO_CMD_0D },
// GameCube IPL/BIOS, PAL. // GameCube IPL/BIOS, PAL.
{ 0x6BA3B3EA, LIGHT_PROTOCOL | FOUR_MIXING_DESTS }, // TODO: check NO_CMD_0D presence.
// Luigi's Mansion. { 0x6BA3B3EA, LIGHT_PROTOCOL | FOUR_MIXING_DESTS | NO_CMD_0D },
{ 0x42F64AC4, LIGHT_PROTOCOL },
// Pikmin 1 GC NTSC. // Pikmin 1 GC NTSC.
// Animal Crossing. // Animal Crossing.
{ 0x4BE6A5CB, LIGHT_PROTOCOL }, { 0x4BE6A5CB, LIGHT_PROTOCOL | NO_CMD_0D },
// Luigi's Mansion.
{ 0x42F64AC4, LIGHT_PROTOCOL },
// Super Mario Sunshine. // Super Mario Sunshine.
// TODO: check NO_CMD_0D presence.
{ 0x56D36052, SYNC_PER_FRAME }, { 0x56D36052, SYNC_PER_FRAME },
// The Legend of Zelda: The Wind Waker. // The Legend of Zelda: The Wind Waker.
{ 0x86840740, 0 }, { 0x86840740, 0 },
@ -283,6 +289,7 @@ void ZeldaUCode::HandleMailLight(u32 mail)
case 1: m_mail_expected_cmd_mails = 4; break; case 1: m_mail_expected_cmd_mails = 4; break;
case 2: m_mail_expected_cmd_mails = 2; break; case 2: m_mail_expected_cmd_mails = 2; break;
// Doesn't even register as a command, just rejumps to the dispatcher. // Doesn't even register as a command, just rejumps to the dispatcher.
// TODO: That's true on 0x4BE6A5CB and 0x42F64AC4, what about others?
case 3: add_command = false; break; case 3: add_command = false; break;
default: default:
@ -436,6 +443,13 @@ void ZeldaUCode::RunPendingCommands()
// Command 0D: TODO: find a name and implement. // Command 0D: TODO: find a name and implement.
case 0x0D: case 0x0D:
if (m_flags & NO_CMD_0D)
{
WARN_LOG(DSPHLE, "Received a 0D command which is NOP'd on this UCode.");
SendCommandAck(CommandAck::STANDARD, sync);
break;
}
WARN_LOG(DSPHLE, "CMD0D: %08x", Read32()); WARN_LOG(DSPHLE, "CMD0D: %08x", Read32());
SendCommandAck(CommandAck::STANDARD, sync); SendCommandAck(CommandAck::STANDARD, sync);
break; break;