From 0ebb7376c8830226759bf807ac73929d8f6e57bd Mon Sep 17 00:00:00 2001 From: "XTra.KrazzY" Date: Thu, 17 Sep 2009 12:09:10 +0000 Subject: [PATCH] More WaveTable (ucode case 0x4,0x7,0xb,0xc) work (thanks for noticing they're the same, LordMark!) git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4292 8ced0084-cf51-0410-be5f-012b33b47a6e --- .../Plugin_DSP_HLE/Src/UCodes/UCode_Zelda.h | 1 + .../Src/UCodes/UCode_Zelda_Synth.cpp | 8 ++++++++ .../Src/UCodes/UCode_Zelda_Voice.cpp | 9 ++++++--- docs/DSP/DSP_UC_Zelda.txt | 14 +++++++------- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_Zelda.h b/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_Zelda.h index 6cbd3c94a2..038daa94c5 100644 --- a/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_Zelda.h +++ b/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_Zelda.h @@ -307,6 +307,7 @@ private: void RenderSynth_Constant(ZeldaVoicePB &PB, s32* _Buffer, int _Size); void RenderSynth_RectWave(ZeldaVoicePB &PB, s32* _Buffer, int _Size); void RenderSynth_SawWave(ZeldaVoicePB &PB, s32* _Buffer, int _Size); + void RenderSynth_WaveTable(ZeldaVoicePB &PB, s32* _Buffer, int _Size); void RenderVoice_PCM8(ZeldaVoicePB& PB, s16* _Buffer, int _Size); void RenderVoice_PCM16(ZeldaVoicePB& PB, s16* _Buffer, int _Size); diff --git a/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_Zelda_Synth.cpp b/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_Zelda_Synth.cpp index 281877bacb..193a53300f 100644 --- a/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_Zelda_Synth.cpp +++ b/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_Zelda_Synth.cpp @@ -117,4 +117,12 @@ void CUCode_Zelda::RenderSynth_Constant(ZeldaVoicePB &PB, s32* _Buffer, int _Siz } +void CUCode_Zelda::RenderSynth_WaveTable(ZeldaVoicePB &PB, s32* _Buffer, int _Size) +{ + WARN_LOG(DSPHLE, "Not synthesizing un-REd format 0x%04x", PB.Format); + // TODO: Header, footer + //for (int i = 0; i < _Size; i++) + //_Buffer[i++] = (s32)PB.RatioInt; +} + diff --git a/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_Zelda_Voice.cpp b/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_Zelda_Voice.cpp index 874393aa53..3f3a791e6f 100644 --- a/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_Zelda_Voice.cpp +++ b/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_Zelda_Voice.cpp @@ -531,12 +531,15 @@ void CUCode_Zelda::RenderAddVoice(ZeldaVoicePB &PB, s32* _LeftBuffer, s32* _Righ break; // These are more "synth" formats - square wave, saw wave etc. - case 0x0002: WARN_LOG(DSPHLE, "PB Format 0x02 used!"); + case 0x0002: + WARN_LOG(DSPHLE, "PB Format 0x02 used!"); + break; + case 0x0004: // Example: Big Pikmin onion mothership landing/building a bridge in Pikmin case 0x0007: // Example: "success" SFX in Pikmin 1, Pikmin 2 in a cave, not sure what sound it is. case 0x000b: // Example: SFX in area selection menu in Pikmin case 0x000c: // Example: beam of death/yellow force-field in Temple of the Gods, ZWW - WARN_LOG(DSPHLE, "Not synthesizing unreversed-engineerd format 0x%04x", PB.Format); + RenderSynth_WaveTable(PB, m_VoiceBuffer, _Size); break; default: @@ -753,4 +756,4 @@ void CUCode_Zelda::MixAdd(short *_Buffer, int _Size) _Buffer += 2; } m_csMix.Leave(); -} \ No newline at end of file +} diff --git a/docs/DSP/DSP_UC_Zelda.txt b/docs/DSP/DSP_UC_Zelda.txt index 334fd3d126..4f536810f8 100644 --- a/docs/DSP/DSP_UC_Zelda.txt +++ b/docs/DSP/DSP_UC_Zelda.txt @@ -3052,15 +3052,15 @@ void 087c_DefaultDecoder() 0893 029f 08ed jmp 0x08ed // case 0x1 // 08ed_Decoder0x1_SawWave (used in ZWW) 0895 029f 08d5 jmp 0x08d5 // case 0x2 // 08d5_Decoder0x2_SquareSaw (hasn't been spotted) 0897 029f 08c2 jmp 0x08c2 // case 0x3 // 08c2_Decoder0x3_RectangleWave (hasn't been spotted) -0899 029f 08fb jmp 0x08fb // case 0x4 (used in Pikmin) +0899 029f 08fb jmp 0x08fb // case 0x4 // void 08f3_Decoder0x4_0xb_0xc_WaveTable (used in Pikmin) 089b 029f 08b1 jmp 0x08b1 // case 0x5 (can never happen) 089d 029f 0919 jmp 0x0919 // case 0x6 // 0919_Decoder0x6_Constant (hasn't been spotted) 089f 029f 091c jmp 0x091c // case 0x7 // 091c_Decoder0x7_WaveTable (used in Pikmin) 08a1 029f 08b1 jmp 0x08b1 // case 0x8 (can never happen) 08a3 029f 08b1 jmp 0x08b1 // case 0x9 (can never happen) 08a5 029f 093a jmp 0x093a // case 0xa (hasn't been spotted) -08a7 029f 08f3 jmp 0x08f3 // case 0xb (used in Pikmin) -08a9 029f 08f7 jmp 0x08f7 // case 0xc (Zelda force field in temple of gods) +08a7 029f 08f3 jmp 0x08f3 // case 0xb // void 08f3_Decoder0x4_0xb_0xc_WaveTable (used in Pikmin) (used in Pikmin) +08a9 029f 08f7 jmp 0x08f7 // case 0xc // void 08f3_Decoder0x4_0xb_0xc_WaveTable (used in Pikmin) (Zelda force field in temple of gods) 08ab 029f 08b1 jmp 0x08b1 // case 0xd (unused) 08ad 029f 08b1 jmp 0x08b1 // case 0xe (unused) 08af 029f 08b1 jmp 0x08b1 // case 0xf (unused) @@ -3164,14 +3164,14 @@ void 08ed_Decoder0x1_SawWave(ACC0, AR0, AX0.L) { } -void 08f3_Unk() { - 08f3 0082 0180 lri $AR2, #0x0180 // Three entrances +void 08f3_Decoder0x4_0xb_0xc_WaveTable(ACC0, AR0, AX0.L) { + 08f3 0082 0180 lri $AR2, #0x0180 // Entrance 1, 0x0b 08f5 029f 08fd jmp 0x08fd - 08f7 0082 01c0 lri $AR2, #0x01c0 // Entrance 2 + 08f7 0082 01c0 lri $AR2, #0x01c0 // Entrance 2, 0x0c 08f9 029f 08fd jmp 0x08fd - 08fb 0082 0140 lri $AR2, #0x0140 // Entrance 3 + 08fb 0082 0140 lri $AR2, #0x0140 // Entrance 3, 0x04 08fd 008a 003f lri $WR2, #0x003f 08ff 0086 0000 lri $IX2, #0x0000 0901 1406 lsl $ACC0, #6