From 0b1af503162699915142d3d174b6040b95cb86bd Mon Sep 17 00:00:00 2001 From: Pierre Bourdon Date: Sat, 8 Aug 2015 21:12:44 +0200 Subject: [PATCH] ZeldaHLE: Initial support for command 0C in both styles implemented by the light protocol. Logs, but doesn't crash anymore. --- Source/Core/Core/HW/DSPHLE/UCodes/Zelda.cpp | 60 ++++++++++++++++----- 1 file changed, 47 insertions(+), 13 deletions(-) diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/Zelda.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/Zelda.cpp index 8cf51b8788..8700264825 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/Zelda.cpp +++ b/Source/Core/Core/HW/DSPHLE/UCodes/Zelda.cpp @@ -46,24 +46,29 @@ enum ZeldaUCodeFlag // If set, does not support command 0D. TODO: rename. NO_CMD_0D = 0x00000080, + + // If set, command 0C is used for GBA crypto. This was used before the GBA + // UCode and UCode switching was available. + SUPPORTS_GBA_CRYPTO = 0x00000100, + + // If set, command 0C is used for an unknown purpose. TODO: rename. + WEIRD_CMD_0C = 0x00000200, }; static const std::map UCODE_FLAGS = { // GameCube IPL/BIOS, NTSC. - // TODO: check NO_CMD_0D presence. { 0x24B22038, LIGHT_PROTOCOL | FOUR_MIXING_DESTS | TINY_VPB | - VOLUME_EXPLICIT_STEP | NO_CMD_0D }, + VOLUME_EXPLICIT_STEP | NO_CMD_0D | WEIRD_CMD_0C }, // GameCube IPL/BIOS, PAL. - // TODO: check NO_CMD_0D presence. - { 0x6BA3B3EA, LIGHT_PROTOCOL | FOUR_MIXING_DESTS | NO_CMD_0D }, + { 0x6BA3B3EA, LIGHT_PROTOCOL | FOUR_MIXING_DESTS | NO_CMD_0D | + WEIRD_CMD_0C }, // Pikmin 1 GC NTSC. // Animal Crossing. - { 0x4BE6A5CB, LIGHT_PROTOCOL | NO_CMD_0D }, + { 0x4BE6A5CB, LIGHT_PROTOCOL | NO_CMD_0D | SUPPORTS_GBA_CRYPTO }, // Luigi's Mansion. - { 0x42F64AC4, LIGHT_PROTOCOL }, + { 0x42F64AC4, LIGHT_PROTOCOL | NO_CMD_0D | WEIRD_CMD_0C }, // Super Mario Sunshine. - // TODO: check NO_CMD_0D presence. - { 0x56D36052, SYNC_PER_FRAME }, + { 0x56D36052, SYNC_PER_FRAME | NO_CMD_0D }, // The Legend of Zelda: The Wind Waker. { 0x86840740, 0 }, // The Legend of Zelda: Four Swords Adventures. @@ -285,12 +290,20 @@ void ZeldaUCode::HandleMailLight(u32 mail) switch ((mail >> 24) & 0x7F) { - case 0: m_mail_expected_cmd_mails = 0; break; - case 1: m_mail_expected_cmd_mails = 4; break; - case 2: m_mail_expected_cmd_mails = 2; break; + case 0x00: m_mail_expected_cmd_mails = 0; break; + case 0x01: m_mail_expected_cmd_mails = 4; break; + case 0x02: m_mail_expected_cmd_mails = 2; break; // 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 0x03: add_command = false; break; + case 0x0C: + if (m_flags & SUPPORTS_GBA_CRYPTO) + m_mail_expected_cmd_mails = 1; + else if (m_flags & WEIRD_CMD_0C) + m_mail_expected_cmd_mails = 2; + else + m_mail_expected_cmd_mails = 0; + break; default: PanicAlert("Received unknown command in light protocol: %08x", mail); @@ -360,7 +373,6 @@ void ZeldaUCode::RunPendingCommands() case 0x00: case 0x0A: case 0x0B: - case 0x0C: case 0x0F: // NOP commands. Log anyway in case we encounter a new version // where these are not NOPs anymore. @@ -455,6 +467,28 @@ void ZeldaUCode::RunPendingCommands() } return; + // Command 0C: used for multiple purpose depending on the UCode version: + // * IPL NTSC/PAL, Luigi's Mansion: TODO (unknown as of now). + // * Pikmin/AC: GBA crypto. + // * SMS and onwards: NOP. + case 0x0C: + if (m_flags & SUPPORTS_GBA_CRYPTO) + { + // TODO + NOTICE_LOG(DSPHLE, "Received an unhandled GBA crypto command, param: %08x", Read32()); + } + else if (m_flags & WEIRD_CMD_0C) + { + // TODO + NOTICE_LOG(DSPHLE, "Received an unhandled 0C command, params: %08x %08x", Read32(), Read32()); + } + else + { + WARN_LOG(DSPHLE, "Received a NOP 0C command. Flags=%08x", m_flags); + } + SendCommandAck(CommandAck::STANDARD, sync); + break; + // Command 0D: TODO: find a name and implement. case 0x0D: if (m_flags & NO_CMD_0D)