From b97a369236f7afca79b7588a3618793ae9ffc1af Mon Sep 17 00:00:00 2001 From: zelda2774 Date: Sun, 22 Aug 2021 23:32:59 +0200 Subject: [PATCH] Match func_800DDB64 --- .../code/audio_synthesis/func_800DDB64.s | 189 ------------------ include/z64audio.h | 32 +-- src/code/audio_synthesis.c | 64 +++--- 3 files changed, 47 insertions(+), 238 deletions(-) delete mode 100644 asm/non_matchings/code/audio_synthesis/func_800DDB64.s diff --git a/asm/non_matchings/code/audio_synthesis/func_800DDB64.s b/asm/non_matchings/code/audio_synthesis/func_800DDB64.s deleted file mode 100644 index c8bf3bf594..0000000000 --- a/asm/non_matchings/code/audio_synthesis/func_800DDB64.s +++ /dev/null @@ -1,189 +0,0 @@ -glabel func_800DDB64 -/* B54D04 800DDB64 8FAE0014 */ lw $t6, 0x14($sp) -/* B54D08 800DDB68 24090001 */ li $t1, 1 -/* B54D0C 800DDB6C 24010002 */ li $at, 2 -/* B54D10 800DDB70 11C90005 */ beq $t6, $t1, .L800DDB88 -/* B54D14 800DDB74 24080940 */ li $t0, 2368 -/* B54D18 800DDB78 11C10008 */ beq $t6, $at, .L800DDB9C -/* B54D1C 800DDB7C 24080AE0 */ li $t0, 2784 -/* B54D20 800DDB80 03E00008 */ jr $ra -/* B54D24 800DDB84 00801025 */ move $v0, $a0 - -.L800DDB88: -/* B54D28 800DDB88 90A30003 */ lbu $v1, 3($a1) -/* B54D2C 800DDB8C 90C20002 */ lbu $v0, 2($a2) -/* B54D30 800DDB90 A0C00003 */ sb $zero, 3($a2) -/* B54D34 800DDB94 10000008 */ b .L800DDBB8 -/* B54D38 800DDB98 A0C30002 */ sb $v1, 2($a2) -.L800DDB9C: -/* B54D3C 800DDB9C 90A30004 */ lbu $v1, 4($a1) -/* B54D40 800DDBA0 90C20003 */ lbu $v0, 3($a2) -/* B54D44 800DDBA4 A0C00002 */ sb $zero, 2($a2) -/* B54D48 800DDBA8 10000003 */ b .L800DDBB8 -/* B54D4C 800DDBAC A0C30003 */ sb $v1, 3($a2) -/* B54D50 800DDBB0 03E00008 */ jr $ra -/* B54D54 800DDBB4 00801025 */ move $v0, $a0 - -.L800DDBB8: -/* B54D58 800DDBB8 8FAF0010 */ lw $t7, 0x10($sp) -/* B54D5C 800DDBBC 3C180200 */ lui $t8, (0x020005C0 >> 16) # lui $t8, 0x200 -/* B54D60 800DDBC0 3C0103C0 */ lui $at, 0x3c0 -/* B54D64 800DDBC4 11E9005D */ beq $t7, $t1, .L800DDD3C -/* B54D68 800DDBC8 371805C0 */ ori $t8, (0x020005C0 & 0xFFFF) # ori $t8, $t8, 0x5c0 -/* B54D6C 800DDBCC 00404825 */ move $t1, $v0 -/* B54D70 800DDBD0 1043002B */ beq $v0, $v1, .L800DDC80 -/* B54D74 800DDBD4 00602825 */ move $a1, $v1 -/* B54D78 800DDBD8 00E51021 */ addu $v0, $a3, $a1 -/* B54D7C 800DDBDC 00495023 */ subu $t2, $v0, $t1 -/* B54D80 800DDBE0 3159FFFF */ andi $t9, $t2, 0xffff -/* B54D84 800DDBE4 3C0103C0 */ lui $at, 0x3c0 -/* B54D88 800DDBE8 03216825 */ or $t5, $t9, $at -/* B54D8C 800DDBEC 3C180800 */ lui $t8, (0x080005C0 >> 16) # lui $t8, 0x800 -/* B54D90 800DDBF0 000773C0 */ sll $t6, $a3, 0xf -/* B54D94 800DDBF4 371805C0 */ ori $t8, (0x080005C0 & 0xFFFF) # ori $t8, $t8, 0x5c0 -/* B54D98 800DDBF8 00805825 */ move $t3, $a0 -/* B54D9C 800DDBFC AD780000 */ sw $t8, ($t3) -/* B54DA0 800DDC00 AD6D0004 */ sw $t5, 4($t3) -/* B54DA4 800DDC04 2559FFFE */ addiu $t9, $t2, -2 -/* B54DA8 800DDC08 24840008 */ addiu $a0, $a0, 8 -/* B54DAC 800DDC0C 00806025 */ move $t4, $a0 -/* B54DB0 800DDC10 AD800004 */ sw $zero, 4($t4) -/* B54DB4 800DDC14 24840008 */ addiu $a0, $a0, 8 -/* B54DB8 800DDC18 05C10003 */ bgez $t6, .L800DDC28 -/* B54DBC 800DDC1C 000E7843 */ sra $t7, $t6, 1 -/* B54DC0 800DDC20 25C10001 */ addiu $at, $t6, 1 -/* B54DC4 800DDC24 00017843 */ sra $t7, $at, 1 -.L800DDC28: -/* B54DC8 800DDC28 25F8FFFF */ addiu $t8, $t7, -1 -/* B54DCC 800DDC2C 07210003 */ bgez $t9, .L800DDC3C -/* B54DD0 800DDC30 00196843 */ sra $t5, $t9, 1 -/* B54DD4 800DDC34 27210001 */ addiu $at, $t9, 1 -/* B54DD8 800DDC38 00016843 */ sra $t5, $at, 1 -.L800DDC3C: -/* B54DDC 800DDC3C 030D001A */ div $zero, $t8, $t5 -/* B54DE0 800DDC40 15A00002 */ bnez $t5, .L800DDC4C -/* B54DE4 800DDC44 00000000 */ nop -/* B54DE8 800DDC48 0007000D */ break 7 -.L800DDC4C: -/* B54DEC 800DDC4C 2401FFFF */ li $at, -1 -/* B54DF0 800DDC50 15A10004 */ bne $t5, $at, .L800DDC64 -/* B54DF4 800DDC54 3C018000 */ lui $at, 0x8000 -/* B54DF8 800DDC58 17010002 */ bne $t8, $at, .L800DDC64 -/* B54DFC 800DDC5C 00000000 */ nop -/* B54E00 800DDC60 0006000D */ break 6 -.L800DDC64: -/* B54E04 800DDC64 00007012 */ mflo $t6 -/* B54E08 800DDC68 31CFFFFF */ andi $t7, $t6, 0xffff -/* B54E0C 800DDC6C 31F9FFFF */ andi $t9, $t7, 0xffff -/* B54E10 800DDC70 3C010600 */ lui $at, 0x600 -/* B54E14 800DDC74 0321C025 */ or $t8, $t9, $at -/* B54E18 800DDC78 1000000B */ b .L800DDCA8 -/* B54E1C 800DDC7C AD980000 */ sw $t8, ($t4) -.L800DDC80: -/* B54E20 800DDC80 00805025 */ move $t2, $a0 -/* B54E24 800DDC84 3C0D0A00 */ lui $t5, (0x0A0005C0 >> 16) # lui $t5, 0xa00 -/* B54E28 800DDC88 30EEFFFF */ andi $t6, $a3, 0xffff -/* B54E2C 800DDC8C 3C0103C0 */ lui $at, 0x3c0 -/* B54E30 800DDC90 01C17825 */ or $t7, $t6, $at -/* B54E34 800DDC94 35AD05C0 */ ori $t5, (0x0A0005C0 & 0xFFFF) # ori $t5, $t5, 0x5c0 -/* B54E38 800DDC98 AD4D0000 */ sw $t5, ($t2) -/* B54E3C 800DDC9C AD4F0004 */ sw $t7, 4($t2) -/* B54E40 800DDCA0 24840008 */ addiu $a0, $a0, 8 -/* B54E44 800DDCA4 00E51021 */ addu $v0, $a3, $a1 -.L800DDCA8: -/* B54E48 800DDCA8 1120001B */ beqz $t1, .L800DDD18 -/* B54E4C 800DDCAC 3C180A00 */ lui $t8, 0xa00 -/* B54E50 800DDCB0 2539000F */ addiu $t9, $t1, 0xf -/* B54E54 800DDCB4 3338FFF0 */ andi $t8, $t9, 0xfff0 -/* B54E58 800DDCB8 00186903 */ sra $t5, $t8, 4 -/* B54E5C 800DDCBC 31AE00FF */ andi $t6, $t5, 0xff -/* B54E60 800DDCC0 000E7C00 */ sll $t7, $t6, 0x10 -/* B54E64 800DDCC4 3C011400 */ lui $at, 0x1400 -/* B54E68 800DDCC8 01E1C825 */ or $t9, $t7, $at -/* B54E6C 800DDCCC 373805C0 */ ori $t8, $t9, 0x5c0 -/* B54E70 800DDCD0 00805025 */ move $t2, $a0 -/* B54E74 800DDCD4 AD580000 */ sw $t8, ($t2) -/* B54E78 800DDCD8 8CCD000C */ lw $t5, 0xc($a2) -/* B54E7C 800DDCDC 24840008 */ addiu $a0, $a0, 8 -/* B54E80 800DDCE0 3C0F0A00 */ lui $t7, (0x0A0003C0 >> 16) # lui $t7, 0xa00 -/* B54E84 800DDCE4 25AE00A0 */ addiu $t6, $t5, 0xa0 -/* B54E88 800DDCE8 AD4E0004 */ sw $t6, 4($t2) -/* B54E8C 800DDCEC 35EF03C0 */ ori $t7, (0x0A0003C0 & 0xFFFF) # ori $t7, $t7, 0x3c0 -/* B54E90 800DDCF0 00805825 */ move $t3, $a0 -/* B54E94 800DDCF4 AD6F0000 */ sw $t7, ($t3) -/* B54E98 800DDCF8 00497023 */ subu $t6, $v0, $t1 -/* B54E9C 800DDCFC 253805C0 */ addiu $t8, $t1, 0x5c0 -/* B54EA0 800DDD00 00186C00 */ sll $t5, $t8, 0x10 -/* B54EA4 800DDD04 31CFFFFF */ andi $t7, $t6, 0xffff -/* B54EA8 800DDD08 01AFC825 */ or $t9, $t5, $t7 -/* B54EAC 800DDD0C AD790004 */ sw $t9, 4($t3) -/* B54EB0 800DDD10 10000020 */ b .L800DDD94 -/* B54EB4 800DDD14 24840008 */ addiu $a0, $a0, 8 -.L800DDD18: -/* B54EB8 800DDD18 00804825 */ move $t1, $a0 -/* B54EBC 800DDD1C 304EFFFF */ andi $t6, $v0, 0xffff -/* B54EC0 800DDD20 3C0105C0 */ lui $at, 0x5c0 -/* B54EC4 800DDD24 01C16825 */ or $t5, $t6, $at -/* B54EC8 800DDD28 371803C0 */ ori $t8, $t8, 0x3c0 -/* B54ECC 800DDD2C AD380000 */ sw $t8, ($t1) -/* B54ED0 800DDD30 AD2D0004 */ sw $t5, 4($t1) -/* B54ED4 800DDD34 10000017 */ b .L800DDD94 -/* B54ED8 800DDD38 24840008 */ addiu $a0, $a0, 8 -.L800DDD3C: -/* B54EDC 800DDD3C 00804825 */ move $t1, $a0 -/* B54EE0 800DDD40 3C0F0A00 */ lui $t7, (0x0A0005C0 >> 16) # lui $t7, 0xa00 -/* B54EE4 800DDD44 30E2FFFF */ andi $v0, $a3, 0xffff -/* B54EE8 800DDD48 0041C825 */ or $t9, $v0, $at -/* B54EEC 800DDD4C 35EF05C0 */ ori $t7, (0x0A0005C0 & 0xFFFF) # ori $t7, $t7, 0x5c0 -/* B54EF0 800DDD50 24840008 */ addiu $a0, $a0, 8 -/* B54EF4 800DDD54 AD2F0000 */ sw $t7, ($t1) -/* B54EF8 800DDD58 AD390004 */ sw $t9, 4($t1) -/* B54EFC 800DDD5C 00805025 */ move $t2, $a0 -/* B54F00 800DDD60 24840008 */ addiu $a0, $a0, 8 -/* B54F04 800DDD64 AD580000 */ sw $t8, ($t2) -/* B54F08 800DDD68 00805825 */ move $t3, $a0 -/* B54F0C 800DDD6C 246F05C0 */ addiu $t7, $v1, 0x5c0 -/* B54F10 800DDD70 AD430004 */ sw $v1, 4($t2) -/* B54F14 800DDD74 000FCC00 */ sll $t9, $t7, 0x10 -/* B54F18 800DDD78 3C0E0A00 */ lui $t6, (0x0A0003C0 >> 16) # lui $t6, 0xa00 -/* B54F1C 800DDD7C 35CE03C0 */ ori $t6, (0x0A0003C0 & 0xFFFF) # ori $t6, $t6, 0x3c0 -/* B54F20 800DDD80 0322C025 */ or $t8, $t9, $v0 -/* B54F24 800DDD84 AD780004 */ sw $t8, 4($t3) -/* B54F28 800DDD88 AD6E0000 */ sw $t6, ($t3) -/* B54F2C 800DDD8C 24840008 */ addiu $a0, $a0, 8 -/* B54F30 800DDD90 00602825 */ move $a1, $v1 -.L800DDD94: -/* B54F34 800DDD94 10600010 */ beqz $v1, .L800DDDD8 -/* B54F38 800DDD98 00801025 */ move $v0, $a0 -/* B54F3C 800DDD9C 24AE000F */ addiu $t6, $a1, 0xf -/* B54F40 800DDDA0 31CDFFF0 */ andi $t5, $t6, 0xfff0 -/* B54F44 800DDDA4 000D7903 */ sra $t7, $t5, 4 -/* B54F48 800DDDA8 31F900FF */ andi $t9, $t7, 0xff -/* B54F4C 800DDDAC 0019C400 */ sll $t8, $t9, 0x10 -/* B54F50 800DDDB0 24ED05C0 */ addiu $t5, $a3, 0x5c0 -/* B54F54 800DDDB4 3C011500 */ lui $at, 0x1500 -/* B54F58 800DDDB8 03017025 */ or $t6, $t8, $at -/* B54F5C 800DDDBC 31AFFFFF */ andi $t7, $t5, 0xffff -/* B54F60 800DDDC0 01CFC825 */ or $t9, $t6, $t7 -/* B54F64 800DDDC4 AC590000 */ sw $t9, ($v0) -/* B54F68 800DDDC8 8CD8000C */ lw $t8, 0xc($a2) -/* B54F6C 800DDDCC 24840008 */ addiu $a0, $a0, 8 -/* B54F70 800DDDD0 270D00A0 */ addiu $t5, $t8, 0xa0 -/* B54F74 800DDDD4 AC4D0004 */ sw $t5, 4($v0) -.L800DDDD8: -/* B54F78 800DDDD8 24EE003F */ addiu $t6, $a3, 0x3f -/* B54F7C 800DDDDC 31CFFFC0 */ andi $t7, $t6, 0xffc0 -/* B54F80 800DDDE0 000FC903 */ sra $t9, $t7, 4 -/* B54F84 800DDDE4 333800FF */ andi $t8, $t9, 0xff -/* B54F88 800DDDE8 00186C00 */ sll $t5, $t8, 0x10 -/* B54F8C 800DDDEC 3C010400 */ lui $at, 0x400 -/* B54F90 800DDDF0 01A17025 */ or $t6, $t5, $at -/* B54F94 800DDDF4 3C0105C0 */ lui $at, 0x5c0 -/* B54F98 800DDDF8 3119FFFF */ andi $t9, $t0, 0xffff -/* B54F9C 800DDDFC 0321C025 */ or $t8, $t9, $at -/* B54FA0 800DDE00 35CF7FFF */ ori $t7, $t6, 0x7fff -/* B54FA4 800DDE04 AC8F0000 */ sw $t7, ($a0) -/* B54FA8 800DDE08 AC980004 */ sw $t8, 4($a0) -/* B54FAC 800DDE0C 24820008 */ addiu $v0, $a0, 8 -/* B54FB0 800DDE10 03E00008 */ jr $ra -/* B54FB4 800DDE14 00000000 */ nop \ No newline at end of file diff --git a/include/z64audio.h b/include/z64audio.h index a11fa17d48..b9b5bb3830 100644 --- a/include/z64audio.h +++ b/include/z64audio.h @@ -73,17 +73,17 @@ typedef struct { } Portamento; // size = 0xC typedef struct { - /*?0x0 */ s16 delay; - /*?0x2 */ s16 arg; -} AdsrEnvelope; // size = 0x4? + /* 0x0 */ s16 delay; + /* 0x2 */ s16 arg; +} AdsrEnvelope; // size = 0x4 typedef struct { - /*?0x00 */ u32 start; + /* 0x00 */ u32 start; /* 0x04 */ u32 end; - /*?0x08 */ u32 count; + /* 0x08 */ u32 count; /*?0x0C */ char unk_0C[0x4]; /*?0x10 */ s16 state[16]; // only exists if count != 0. 8-byte aligned -} AdpcmLoop; // size = 0x30 +} AdpcmLoop; // size = 0x30 (or 0x10) typedef struct { /*?0x00 */ s32 order; @@ -206,7 +206,7 @@ typedef struct { /* 0x19 */ s8 value; } M64ScriptState; // size = 0x1C -// Also known as a Group, according to sm64 debug strings. +// Also known as a Group, according to debug strings. typedef struct { union { s32 playerState; @@ -332,7 +332,7 @@ typedef struct { /* 0x14 */ s16 unk_14[8]; } NoteAttributes; // size = 0x24 -// Also known as a SubTrack, according to sm64 debug strings. +// Also known as a SubTrack, according to debug strings. // Confusingly, a SubTrack is a container of Tracks. typedef struct SequenceChannel { union { @@ -402,7 +402,7 @@ typedef struct SequenceChannel { /* 0xD0 */ ReverbBits reverbBits; } SequenceChannel; // size = 0xD4 -// Also known as a Track, according to sm64 debug strings. +// Also known as a Track, according to debug strings. typedef struct SequenceChannelLayer { /* 0x00 */ u8 enabled : 1; /* 0x00 */ u8 finished : 1; @@ -454,17 +454,17 @@ typedef struct { } NoteSynthesisBuffers; // size = 0x110 typedef struct { - /*?0x00 */ u8 restart; + /* 0x00 */ u8 restart; /*?0x01 */ u8 sampleDmaIndex; /*?0x02 */ u8 prevHeadsetPanRight; /*?0x03 */ u8 prevHeadsetPanLeft; /*?0x04 */ u8 samplePosFrac; /* 0x05 */ u8 unk_05; /* 0x06 */ u16 unk_06; - /*?0x08 */ s32 samplePosInt; + /* 0x08 */ s32 samplePosInt; /* 0x0C */ NoteSynthesisBuffers* synthesisBuffers; - /*?0x10 */ s16 curVolLeft; - /*?0x12 */ s16 curVolRight; + /* 0x10 */ s16 curVolLeft; + /* 0x12 */ s16 curVolRight; /* 0x14 */ u16 unk_14; /* 0x16 */ u16 unk_16; /* 0x18 */ u16 unk_18; @@ -480,7 +480,7 @@ typedef struct { /* 0x0C */ f32 extent; /* 0x10 */ f32 rate; /* 0x14 */ u8 active; - /*!0x16 */ u16 rateChangeTimer; + /* 0x16 */ u16 rateChangeTimer; /* 0x18 */ u16 extentChangeTimer; /* 0x1A */ u16 delay; } VibratoState; // size = 0x1C @@ -495,7 +495,7 @@ typedef struct { /* 0x06 */ s16 adsrVolScale; // unused? /* 0x08 */ f32 portamentoFreqScale; /* 0x0C */ f32 vibratoFreqScale; - /*?0x10 */ SequenceChannelLayer* prevParentLayer; + /* 0x10 */ SequenceChannelLayer* prevParentLayer; /* 0x14 */ SequenceChannelLayer* parentLayer; /* 0x18 */ SequenceChannelLayer* wantedParentLayer; /* 0x1C */ NoteAttributes attributes; @@ -548,7 +548,7 @@ typedef struct { typedef struct Note { /* 0x00 */ AudioListItem listItem; - /*?0x10 */ NoteSynthesisState synthesisState; + /* 0x10 */ NoteSynthesisState synthesisState; /* 0x30 */ NotePlaybackState playbackState; /* 0x90 */ Portamento portamento; /* 0x9C */ VibratoState vibratoState; diff --git a/src/code/audio_synthesis.c b/src/code/audio_synthesis.c index 8e07ef0d89..a7cb1990af 100644 --- a/src/code/audio_synthesis.c +++ b/src/code/audio_synthesis.c @@ -8,7 +8,7 @@ Acmd* func_800DC384(s16* aiBuf, s32 aiBufLen, Acmd* cmd, s32 updateIdx); Acmd* func_800DC910(s32 noteIdx, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s16* aiBuf, s32 aiBufLen, Acmd* cmd, s32 updateIdx); Acmd* func_800DD9F4(Acmd* arg0, NoteSubEu* arg1, NoteSynthesisState* arg2, s32 arg3); -Acmd* func_800DDB64(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s32 arg3, s32 arg4, s32 arg5); +Acmd* func_800DDB64(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s32 bufLen, s32 flags, s32 side); Acmd* func_800DD6CC(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s32 aiBufLen, u16, s32, s32); Acmd* func_800DD62C(Acmd* cmd, NoteSynthesisState* synthState, s32 count, u16 pitch, u16 inpDmem, s32 resampleFlags); extern s16 D_8012FBAA[]; @@ -1139,57 +1139,55 @@ Acmd* func_800DD9F4(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisState* synthSt return cmd; } -#ifdef NON_MATCHING -Acmd* func_800DDB64(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s32 arg3, s32 arg4, s32 arg5) { - s32 phi_v0; - s32 phi_v1; - s32 phi_t0; +Acmd* func_800DDB64(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisState* synthState, s32 bufLen, s32 flags, s32 side) { + u16 dest; + u16 pitch; + u8 prevPanShift; + u8 panShift; - switch (arg5) { + switch (side) { case 1: - phi_t0 = 0x940; - phi_v1 = noteSubEu->headsetPanRight; - phi_v0 = synthState->prevHeadsetPanRight; + dest = 0x940; + panShift = noteSubEu->headsetPanRight; + prevPanShift = synthState->prevHeadsetPanRight; synthState->prevHeadsetPanLeft = 0; - synthState->prevHeadsetPanRight = phi_v1; + synthState->prevHeadsetPanRight = panShift; break; case 2: - phi_t0 = 0xAE0; - phi_v1 = noteSubEu->headsetPanLeft; - phi_v0 = synthState->prevHeadsetPanLeft; - synthState->prevHeadsetPanLeft = phi_v1; + dest = 0xAE0; + panShift = noteSubEu->headsetPanLeft; + prevPanShift = synthState->prevHeadsetPanLeft; + synthState->prevHeadsetPanLeft = panShift; synthState->prevHeadsetPanRight = 0; break; default: return cmd; } - if (arg4 != 1) { - if (phi_v0 != phi_v1) { - aSetBuffer(cmd++, 0, 0x5C0, 0x3C0, arg3 + phi_v1 - phi_v0); - aResampleZOH(cmd++, (u16)((((arg3 << 0xF) / 2) - 1) / ((arg3 + phi_v1 - phi_v0 - 2) / 2)), 0); + if (flags != 1) { + if (panShift != prevPanShift) { + pitch = (((bufLen << 0xF) / 2) - 1) / ((bufLen + panShift - prevPanShift - 2) / 2); + aSetBuffer(cmd++, 0, 0x5C0, 0x3C0, bufLen + panShift - prevPanShift); + aResampleZOH(cmd++, pitch, 0); } else { - aDMEMMove(cmd++, 0x5C0, 0x3C0, arg3); + aDMEMMove(cmd++, 0x5C0, 0x3C0, bufLen); } - if (phi_v0 != 0) { - aLoadBuffer(cmd++, &synthState->synthesisBuffers->panResampleState[0x8], 0x5C0, ALIGN16(phi_v0)); - aDMEMMove(cmd++, 0x3C0, 0x5C0 + phi_v0, arg3 + phi_v1 - phi_v0); + if (prevPanShift != 0) { + aLoadBuffer(cmd++, &synthState->synthesisBuffers->panResampleState[0x8], 0x5C0, ALIGN16(prevPanShift)); + aDMEMMove(cmd++, 0x3C0, 0x5C0 + prevPanShift, bufLen + panShift - prevPanShift); } else { - aDMEMMove(cmd++, 0x3C0, 0x5C0, arg3 + phi_v1); + aDMEMMove(cmd++, 0x3C0, 0x5C0, bufLen + panShift); } } else { - aDMEMMove(cmd++, 0x5C0, 0x3C0, arg3); - aClearBuffer(cmd++, 0x5C0, phi_v1); - aDMEMMove(cmd++, 0x3C0, 0x5C0 + phi_v1, arg3); + aDMEMMove(cmd++, 0x5C0, 0x3C0, bufLen); + aClearBuffer(cmd++, 0x5C0, panShift); + aDMEMMove(cmd++, 0x3C0, 0x5C0 + panShift, bufLen); } - if (phi_v1 != 0) { - aSaveBuffer(cmd++, 0x5C0 + arg3, &synthState->synthesisBuffers->panResampleState[0x8], ALIGN16(phi_v1)); + if (panShift) { + aSaveBuffer(cmd++, 0x5C0 + bufLen, &synthState->synthesisBuffers->panResampleState[0x8], ALIGN16(panShift)); } - aAddMixer(cmd++, ((arg3 + 0x3F) & ~0x3F), 0x5C0, phi_t0, 0x7FFF); + aAddMixer(cmd++, ((bufLen + 0x3F) & ~0x3F), 0x5C0, dest, 0x7FFF); return cmd; } -#else -#pragma GLOBAL_ASM("asm/non_matchings/code/audio_synthesis/func_800DDB64.s") -#endif