PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
vm_f.c
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
11#include "libsnd2_internal.h"
12
13u16 _svm_okon1;
14int _svm_envx_ptr;
15unsigned int _svm_envx_hist[16];
16libsnd2_spu_voice_t _svm_voice[24];
17u16 _svm_okof1;
18u16 _svm_okof2;
19u16 _svm_okon2;
20libsnd2_auto_vol_pan_callback _autovol;
21libsnd2_auto_vol_pan_callback _autopan;
22char _svm_sreg_dirty[24];
23libsnd2_reg_buffer_struct_t _svm_sreg_buf[24];
24libsnd2_reg_buffer_struct_2_t _svm_sreg_buf2[24];
25u16 _svm_orev2;
26u16 _svm_orev1;
27u16 _svm_onos2;
28u16 _svm_onos1;
29
30void __attribute__((optimize("no-unroll-loops"))) wait1fsa(void)
31{
32 int i;
33 int curdum;
34
35 curdum = 13;
36 for ( i = 0; i < 1000; i += 1 )
37 {
38 curdum *= 3;
39 __asm__ __volatile__("" : "+g"(curdum) : :);
40 }
41}
42
43void DumpSpu(void)
44{
45 int cur_i_1;
46 int cur_i_2;
47
48 for ( cur_i_1 = 0; (u16)cur_i_1 < 0x1A2u; cur_i_1 += 1 )
49 {
50 int curdata_1;
51
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);
54 }
55 for ( cur_i_2 = 944; (u16)cur_i_2 < 0x3C4u; cur_i_2 += 1 )
56 {
57 int curdata_2;
58
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);
61 }
62 printf(" ------------------------------------\n");
63}
64
65void DumpVoice(void)
66{
67 u16 i;
68 u16 cur_i_1;
69 u16 cur_j_1;
70
71 for ( i = 0; i < 0x10u; i += 1 )
72 {
73 if ( (((int)*((vu16 *)0xBF9001A0) >> i) & 1) != 0 )
74 {
75 printf("voice = %d\n", i);
76 for ( cur_i_1 = 0; cur_i_1 < 8u; cur_i_1 += 1 )
77 {
78 printf(" 0x%3x 0x%4x \n", cur_i_1, *(u16 *)(2 * cur_i_1 + 16 * i + 0xbf900000));
79 }
80 for ( cur_j_1 = 224; cur_j_1 < 0xE6u; cur_j_1 += 1 )
81 {
82 printf(" 0x%3x 0x%4x \n", cur_j_1, *(u16 *)(2 * cur_j_1 + 12 * i + 0xbf900000));
83 }
84 printf(" ------------------------------------\n");
85 }
86 }
87}
88
89void DumpVoice2(void)
90{
91 u16 i;
92 u16 cur_i_1;
93 u16 cur_j_1;
94
95 for ( i = 0; i < 0x10u; i += 1 )
96 {
97 if ( (((int)_svm_okon1 >> i) & 1) != 0 )
98 {
99 if ( i >= 5u )
100 {
101 *(u16 *)(16 * i + 0xbf900000) = 0;
102 *(u16 *)(16 * i + 0xbf900002) = 0;
103 }
104 printf("voice = %d\n", i);
105 for ( cur_i_1 = 0; cur_i_1 < 8u; cur_i_1 += 1 )
106 {
107 printf(" 0x%3x 0x%4x \n", cur_i_1, *(u16 *)(2 * cur_i_1 + 16 * i + 0xbf900000));
108 }
109 for ( cur_j_1 = 224; cur_j_1 < 0xE6u; cur_j_1 += 1 )
110 {
111 printf(" 0x%3x 0x%4x \n", cur_j_1, *(u16 *)(2 * cur_j_1 + 12 * i + 0xbf900000));
112 }
113 printf(" ------------------------------------\n");
114 }
115 }
116}
117
118void _SsVmFlush(void)
119{
120 int v1;
121 signed int v4;
122 int v12;
123 int mask;
124 SpuVoiceAttr voice_attr;
125
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 )
129 {
130 libsnd2_spu_voice_t *voice_struct;
131
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;
136 }
137 if ( !_svm_auto_kof_mode )
138 {
139 int voiceBits;
140 int v7;
141
142 voiceBits = -1;
143 for ( v4 = 0; v4 < 15; v4 += 1 )
144 {
145 voiceBits &= _svm_envx_hist[v4];
146 }
147 for ( v7 = 0; v7 < _SsVmMaxVoice; v7 += 1 )
148 {
149 libsnd2_spu_voice_t *voice_struct;
150
151 voice_struct = &_svm_voice[v7];
152 if ( (voiceBits & (1 << v7)) != 0 )
153 {
154 if ( voice_struct->m_unk1d == 2 )
155 {
156 int mask_1;
157 int mask2;
158
159 mask_1 = 1 << v7;
160 mask2 = 0;
161 if ( v7 >= 16 )
162 {
163 mask_1 = 0;
164 mask2 = 1 << (v7 - 16);
165 }
166 SpuSetNoiseVoice(SPU_OFF, ((u8)mask2 << 16) | (s16)mask_1);
167 }
168 voice_struct->m_unk1d = 0;
169 }
170 }
171 }
172 _svm_okon1 &= ~_svm_okof1;
173 _svm_okon2 &= ~_svm_okof2;
174 for ( v4 = 0; v4 < 24; v4 += 1 )
175 {
176 const libsnd2_spu_voice_t *voice_struct;
177
178 voice_struct = &_svm_voice[v4];
179 if ( voice_struct->m_b_auto_vol )
180 _autovol(v4);
181 if ( voice_struct->m_b_auto_pan )
182 _autopan(v4);
183 }
184 for ( v12 = 0; v12 < 24; v12 += 1 )
185 {
186 voice_attr.mask = 0;
187 voice_attr.voice = 1 << v12;
188 if ( (_svm_sreg_dirty[v12] & 1) != 0 )
189 {
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;
197 }
198 if ( (_svm_sreg_dirty[v12] & 4) != 0 )
199 {
200 voice_attr.mask |= SPU_VOICE_PITCH;
201 voice_attr.pitch = _svm_sreg_buf[v12].m_pitch;
202 }
203 if ( (_svm_sreg_dirty[v12] & 8) != 0 )
204 {
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);
207 }
208 if ( (_svm_sreg_dirty[v12] & 0x10) != 0 )
209 {
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;
213 }
214 if ( voice_attr.mask )
215 SpuSetVoiceAttr(&voice_attr);
216 _svm_sreg_dirty[v12] = 0;
217 }
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);
221 // cppcheck-suppress badBitmaskCheck
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));
224 _svm_okof1 = 0;
225 _svm_okof2 = 0;
226 _svm_okon1 = 0;
227 _svm_okon2 = 0;
228 _svm_onos1 = 0;
229 _svm_onos2 = 0;
230}
typedef __attribute__
Definition tlbfunc.c:60