11#include "libsnd2_internal.h"
15unsigned int _svm_envx_hist[16];
20libsnd2_auto_vol_pan_callback _autovol;
21libsnd2_auto_vol_pan_callback _autopan;
22char _svm_sreg_dirty[24];
30void __attribute__((optimize(
"no-unroll-loops"))) wait1fsa(
void)
36 for ( i = 0; i < 1000; i += 1 )
39 __asm__ __volatile__(
"" :
"+g"(curdum) : :);
48 for ( cur_i_1 = 0; (u16)cur_i_1 < 0x1A2u; cur_i_1 += 1 )
52 curdata_1 = *(u16 *)(2 * (u16)cur_i_1 + (SpuGetCore() << 10) + 0xbf900000);
53 printf(
" 0x%3x 0x%4x \n", (u16)cur_i_1, curdata_1);
55 for ( cur_i_2 = 944; (u16)cur_i_2 < 0x3C4u; cur_i_2 += 1 )
59 curdata_2 = *(u16 *)(2 * (u16)cur_i_2 + 40 * SpuGetCore() + 0xbf900000);
60 printf(
" 0x%3x 0x%4x \n", (u16)cur_i_2, curdata_2);
62 printf(
" ------------------------------------\n");
71 for ( i = 0; i < 0x10u; i += 1 )
73 if ( (((
int)*((vu16 *)0xBF9001A0) >> i) & 1) != 0 )
75 printf(
"voice = %d\n", i);
76 for ( cur_i_1 = 0; cur_i_1 < 8u; cur_i_1 += 1 )
78 printf(
" 0x%3x 0x%4x \n", cur_i_1, *(u16 *)(2 * cur_i_1 + 16 * i + 0xbf900000));
80 for ( cur_j_1 = 224; cur_j_1 < 0xE6u; cur_j_1 += 1 )
82 printf(
" 0x%3x 0x%4x \n", cur_j_1, *(u16 *)(2 * cur_j_1 + 12 * i + 0xbf900000));
84 printf(
" ------------------------------------\n");
95 for ( i = 0; i < 0x10u; i += 1 )
97 if ( (((
int)_svm_okon1 >> i) & 1) != 0 )
101 *(u16 *)(16 * i + 0xbf900000) = 0;
102 *(u16 *)(16 * i + 0xbf900002) = 0;
104 printf(
"voice = %d\n", i);
105 for ( cur_i_1 = 0; cur_i_1 < 8u; cur_i_1 += 1 )
107 printf(
" 0x%3x 0x%4x \n", cur_i_1, *(u16 *)(2 * cur_i_1 + 16 * i + 0xbf900000));
109 for ( cur_j_1 = 224; cur_j_1 < 0xE6u; cur_j_1 += 1 )
111 printf(
" 0x%3x 0x%4x \n", cur_j_1, *(u16 *)(2 * cur_j_1 + 12 * i + 0xbf900000));
113 printf(
" ------------------------------------\n");
126 _svm_envx_ptr = ((u8)_svm_envx_ptr + 1) & 0xF;
127 _svm_envx_hist[_svm_envx_ptr] = 0;
128 for ( v1 = 0; v1 < _SsVmMaxVoice; v1 += 1 )
132 voice_struct = &_svm_voice[v1];
133 SpuGetVoiceEnvelope(v1, &(voice_struct->m_key_stat));
134 if ( !voice_struct->m_key_stat )
135 _svm_envx_hist[_svm_envx_ptr] |= 1 << v1;
137 if ( !_svm_auto_kof_mode )
143 for ( v4 = 0; v4 < 15; v4 += 1 )
145 voiceBits &= _svm_envx_hist[v4];
147 for ( v7 = 0; v7 < _SsVmMaxVoice; v7 += 1 )
151 voice_struct = &_svm_voice[v7];
152 if ( (voiceBits & (1 << v7)) != 0 )
154 if ( voice_struct->m_unk1d == 2 )
164 mask2 = 1 << (v7 - 16);
166 SpuSetNoiseVoice(SPU_OFF, ((u8)mask2 << 16) | (s16)mask_1);
168 voice_struct->m_unk1d = 0;
172 _svm_okon1 &= ~_svm_okof1;
173 _svm_okon2 &= ~_svm_okof2;
174 for ( v4 = 0; v4 < 24; v4 += 1 )
178 voice_struct = &_svm_voice[v4];
179 if ( voice_struct->m_b_auto_vol )
181 if ( voice_struct->m_b_auto_pan )
184 for ( v12 = 0; v12 < 24; v12 += 1 )
187 voice_attr.voice = 1 << v12;
188 if ( (_svm_sreg_dirty[v12] & 1) != 0 )
190 voice_attr.mask |= SPU_VOICE_VOLL | SPU_VOICE_VOLR;
191 voice_attr.volume.left = _svm_sreg_buf[v12].m_vol_left;
192 voice_attr.volume.right = _svm_sreg_buf[v12].m_vol_right;
193 if ( voice_attr.volume.left == 614 )
194 voice_attr.volume.left = 615;
195 if ( voice_attr.volume.right == 614 )
196 voice_attr.volume.right = 615;
198 if ( (_svm_sreg_dirty[v12] & 4) != 0 )
200 voice_attr.mask |= SPU_VOICE_PITCH;
201 voice_attr.pitch = _svm_sreg_buf[v12].m_pitch;
203 if ( (_svm_sreg_dirty[v12] & 8) != 0 )
205 voice_attr.mask |= SPU_VOICE_WDSA;
206 voice_attr.addr = (_svm_sreg_buf2[v12].m_vag_spu_addr << 4) + (_svm_sreg_buf2[v12].m_vab_spu_offset << 20);
208 if ( (_svm_sreg_dirty[v12] & 0x10) != 0 )
210 voice_attr.mask |= SPU_VOICE_ADSR_ADSR1 | SPU_VOICE_ADSR_ADSR2;
211 voice_attr.adsr1 = _svm_sreg_buf[v12].m_adsr1;
212 voice_attr.adsr2 = _svm_sreg_buf[v12].m_adsr2;
214 if ( voice_attr.mask )
215 SpuSetVoiceAttr(&voice_attr);
216 _svm_sreg_dirty[v12] = 0;
218 SpuSetKey(SPU_OFF, ((u8)_svm_okof2 << 16) | _svm_okof1);
219 SpuSetKey(SPU_ON, ((u8)_svm_okon2 << 16) | _svm_okon1);
220 mask = 0xFFFFFF >> (24 - _SsVmMaxVoice);
222 SpuSetReverbVoice(SPU_BIT, ((((u32)_svm_orev2 << 16) | _svm_orev1) & mask) | (SpuGetReverbVoice() & ~mask));
223 SpuSetNoiseVoice(SPU_BIT, ((((u32)_svm_onos2 << 16) | _svm_onos1) & mask) | (SpuGetNoiseVoice() & ~mask));