25 static void vortex_fifo_setwtvalid(
vortex_t * vortex,
int fifo,
int en);
26 static void vortex_connection_adb_mixin(
vortex_t * vortex,
int en,
30 static void vortex_connection_mixin_mix(
vortex_t * vortex,
int en,
32 unsigned char mix,
int a);
33 static void vortex_fifo_wtinitialize(
vortex_t * vortex,
int fifo,
int j);
34 static int vortex_wt_SetReg(
vortex_t * vortex,
unsigned char reg,
int wt,
40 static void vortex_wt_setstereo(
vortex_t * vortex,
u32 wt,
u32 stereo)
46 temp = (temp & 0xfe) | (stereo & 1);
52 static void vortex_wt_setdsout(
vortex_t * vortex,
u32 wt,
int en)
59 temp |= (1 << (wt & 0x1f));
61 temp &= (1 << ~(wt & 0x1f));
66 static int vortex_wt_allocroute(
vortex_t * vortex,
int wt,
int nr_ch)
73 vortex_fifo_wtinitialize(vortex, wt, 1);
74 vortex_fifo_setwtvalid(vortex, wt, 1);
75 vortex_wt_setstereo(vortex, wt, nr_ch - 1);
77 vortex_fifo_setwtvalid(vortex, wt, 0);
80 vortex_wt_setdsout(vortex, wt, 1);
114 static void vortex_wt_connect(
vortex_t * vortex,
int en)
118 #define NR_WTROUTES 6
120 #define NR_WTBLOCKS 2
122 #define NR_WTBLOCKS 1
128 vortex_adb_checkinout(vortex,
131 vortex->
mixwt[(i * NR_WTROUTES) + ii] = mix;
133 vortex_route(vortex, en, 0x11,
136 vortex_connection_mixin_mix(vortex, en, mix,
139 vortex_connection_mixin_mix(vortex, en,
145 for (i = 0; i <
NR_WT; i++) {
152 static int vortex_wt_GetReg(
vortex_t * vortex,
char reg,
int wt)
168 vortex_wt_SetReg2(
vortex_t * vortex,
unsigned char reg,
int wt,
192 vortex_wt_SetReg(
vortex_t * vortex,
unsigned char reg,
int wt,
197 if ((reg == 5) || ((reg >= 7) && (reg <= 10)) || (reg == 0
xc)) {
200 (
"vortex: WT SetReg: bank out of range. reg=0x%x, wt=%d\n",
303 static void vortex_wt_init(
vortex_t * vortex)
305 u32 var4, var8, varc, var10 = 0, edi;
321 for (edi = 0; edi < (NR_WT /
NR_WT_PB); edi++) {
322 vortex_wt_SetReg(vortex, 0
xc, edi, 0);
323 vortex_wt_SetReg(vortex, 0xa, edi, var10);
324 vortex_wt_SetReg(vortex, 0x9, edi, var4);
325 vortex_wt_SetReg(vortex, 0x8, edi, varc);
326 vortex_wt_SetReg(vortex, 0x5, edi, var8);
329 for (edi = 0; edi <
NR_WT; edi++) {
330 vortex_wt_SetReg(vortex, 0x4, edi, 0);
331 vortex_wt_SetReg(vortex, 0x3, edi, 0);
332 vortex_wt_SetReg(vortex, 0x2, edi, 0);
333 vortex_wt_SetReg(vortex, 0x1, edi, 0);
334 vortex_wt_SetReg(vortex, 0
xb, edi, 0);
337 for (edi = 0; edi < (NR_WT /
NR_WT_PB); edi++)
338 vortex_wt_SetReg(vortex, 0xa, edi, var10);
343 static void vortex_wt_SetVolume(
vortex_t * vortex,
int wt,
int vol[])
346 int ecx = vol[1], eax = vol[0];
349 voice->
parm0 &= 0xff00ffff;
350 voice->
parm0 |= (vol[0] & 0xff) << 0x10;
351 voice->
parm1 &= 0xff00ffff;
352 voice->
parm1 |= (vol[1] & 0xff) << 0x10;
363 voice->
parm3 &= 0xFFFFC07F;
364 voice->
parm3 |= (ecx & 0x7f) << 7;
365 voice->
parm3 &= 0xFFFFFF80;
366 voice->
parm3 |= (eax & 0x7f);
368 voice->
parm3 &= 0xFFE03FFF;
369 voice->
parm3 |= (eax & 0xFE00) << 5;
376 static void vortex_wt_SetFrequency(
vortex_t * vortex,
int wt,
unsigned int sr)
382 eax = ((sr << 0xf) * 0x57619F1) & 0xffffffff;
383 edx = (((sr << 0xf) * 0x57619F1)) >> 0x20;
388 if (edx & 0x0FFF80000)
393 while ((edx & 0x80000000) == 0) {
407 voice->
parm0 &= 0xffff0001;
408 voice->
parm0 |= (eax & 0x7fff) << 1;