13static void *sdrFunc(
int fno,
void *buffer,
int length);
18#if SDRDRV_IMPLEMENT_AUTODMA
20static volatile int g_AutoDmaIntrCount;
22static int g_AutoDmaInProcessing;
23static void *g_AutoDmaBuf;
24static int g_AutoDmaBufSize;
26static int AutoDmaStatusCB(
void *data)
30 if ( g_AutoDmaIntrCount < 4 && g_AutoDmaIntrCount >= 0 )
31 g_AutoDmaIntrCount += 1;
36void sce_sdr_loop(
void *arg)
46 si->m_rpc_qd = &rpc_qd;
47 si->m_rpc_sd = &rpc_sd;
49 sceSifSetRpcQueue(&rpc_qd, GetThreadId());
50 sceSifRegisterRpc(&rpc_sd, 0x80000701, sdrFunc, rpc_arg, 0, 0, &rpc_qd);
52 for ( i = 0; i < 16; i += 1 )
53 sceSdrSetUserCommandFunction(0x9000 + (i * 0x10), NULL);
54 sceSifRpcLoop(&rpc_qd);
57static void *sdrFunc(
int fno,
void *buffer,
int length)
62 switch ( fno & 0xFFF0 )
64#if SDRDRV_IMPLEMENT_LIBOSDS
78 ret = (s16)StVabOpen(*((u8 **)buffer + 1), *((u32 *)buffer + 2), *((u32 **)buffer + 3));
81 ret = (s16)StVabOpenFakeBody(*((u32 *)buffer + 1), *((u32 *)buffer + 2));
87 ret = (s16)StVabClose(*((u16 *)buffer + 2));
90 ret = (s16)StBgmOpen(*((u16 *)buffer + 2), *((u32 *)buffer + 2));
93 StSetTickMode(*((s16 *)buffer + 2));
96 ret = (s16)StBgmClose(*((u16 *)buffer + 2));
99 StSetReverbType(*((u16 *)buffer + 2), *((u16 *)buffer + 4));
102 StSetReverbDepth(*((s16 *)buffer + 2), *((s16 *)buffer + 4), *((s16 *)buffer + 6));
105 StSetReverbDelaytime(*((s16 *)buffer + 2), *((s16 *)buffer + 4));
108 StSetReverbFeedback(*((s16 *)buffer + 2), *((s16 *)buffer + 4));
111 ret = StGetSlotStatus(*((u16 *)buffer + 2));
114 StSetSbClear(*((u32 *)buffer + 1));
117 StSetMasterVol(*((s16 *)buffer + 2), *((s16 *)buffer + 4), *((s16 *)buffer + 6));
120 ret = (s16)StSetBgmVol(*((u16 *)buffer + 2), *((u16 *)buffer + 4));
123 StBgmPlay(*((u16 *)buffer + 2));
126 StBgmStop(*((u16 *)buffer + 2), *((u16 *)buffer + 4), *((u32 *)buffer + 3));
129 StSetBgmTempo(*((s16 *)buffer + 2), *((s16 *)buffer + 4));
132 ret = (s16)StGetBgmTempo(*((s16 *)buffer + 2));
135 ret = (s16)StGetBgmStatus(*((s16 *)buffer + 2));
138 ret = (s16)StGetBgmChStatus();
141 ret = (s16)StDmaWrite(*((u8 **)buffer + 1), *((u32 **)buffer + 2), *((u32 *)buffer + 3));
144 ret = (s16)StDmaRead(*((u32 **)buffer + 1), *((u8 **)buffer + 2), *((u32 *)buffer + 3));
147 ret = SetTimer(&g_timer_flag);
150 ret = ReleaseTimer();
153 ret = StSePlay(*((u16 *)buffer + 2), *((u16 *)buffer + 4));
156 ret = StSetSeVol(*((u16 *)buffer + 2), *((u16 *)buffer + 4));
160 ret = sceSdInit(*((u32 *)buffer + 1));
163 sceSdSetParam(*((u16 *)buffer + 2), *((u16 *)buffer + 4));
166 ret = sceSdGetParam(*((u16 *)buffer + 2));
169 sceSdSetSwitch(*((u16 *)buffer + 2), *((u32 *)buffer + 2));
172 ret = sceSdGetSwitch(*((u16 *)buffer + 2));
175 sceSdSetAddr(*((u16 *)buffer + 2), *((u32 *)buffer + 2));
178 ret = sceSdGetAddr(*((u16 *)buffer + 2));
181 sceSdSetCoreAttr(*((u16 *)buffer + 2), *((u16 *)buffer + 4));
184 ret = sceSdGetCoreAttr(*((u16 *)buffer + 2));
187 ret = sceSdNote2Pitch(*((u16 *)buffer + 2), *((u16 *)buffer + 4), *((u16 *)buffer + 6), *((u16 *)buffer + 8));
190 ret = sceSdPitch2Note(*((u16 *)buffer + 2), *((u16 *)buffer + 4), *((u16 *)buffer + 6));
193 ret = sceSdProcBatch(*((
sceSdBatch **)buffer + 1), *((u32 **)buffer + 2), *((u32 *)buffer + 3));
196 ret = sceSdProcBatchEx(
197 *((
sceSdBatch **)buffer + 1), *((u32 **)buffer + 2), *((u32 *)buffer + 3), *((u32 *)buffer + 4));
200 ret = sceSdVoiceTrans(
201 *((u16 *)buffer + 2), *((u16 *)buffer + 4), *((u8 **)buffer + 3), *((u32 **)buffer + 4), *((u32 *)buffer + 5));
204#if SDRDRV_IMPLEMENT_AUTODMA
210 if ( !g_AutoDmaInProcessing && *((u32 *)buffer + 2) != 2 )
214 sceSdSetTransCallback(1, AutoDmaStatusCB);
215 g_AutoDmaBuf = (
void *)(uiptr) * ((u32 *)buffer + 3);
216 g_AutoDmaBufSize = *((u32 *)buffer + 4);
217 buf_init_ptr = (u32 *)((u8 *)g_AutoDmaBuf + 0x3000);
218 memset(g_AutoDmaBuf, 0, 0x3000);
219 for ( i = 0; i < 512; i += 128 )
221 for ( j = 0; j < 128; j += 1 )
223 buf_init_ptr[j] = buf_init_ptr[j] / 512 * (i + j);
225 for ( k = 0; k < 128; k += 1 )
227 buf_init_ptr[k + 128] = buf_init_ptr[k + 128] / 512 * (i + k);
230 g_AutoDmaIntrCount = 10;
231 ret = sceSdBlockTrans(*((u16 *)buffer + 2), *((u16 *)buffer + 4), *((u8 **)buffer + 3), *((u32 *)buffer + 4));
232 g_AutoDmaInProcessing = 1;
234 else if ( g_AutoDmaInProcessing && *((u32 *)buffer + 2) == 2 )
241 cur_status_1 = sceSdBlockTransStatus(1, 0);
243 cur_status_2 = (cur_status_1 & 0xFFFFFF) - (uiptr)(u8 *)g_AutoDmaBuf
244 - ((cur_status_1 >> 24) == 1 ? (g_AutoDmaBufSize / 2) : 0);
247 (u32 *)((u8 *)g_AutoDmaBuf
248 + ((cur_status_1 >> 24) == ((cur_status_2 < 0xC000) ? 1 : 0) ? (g_AutoDmaBufSize / 2) : 0));
250 (u32 *)((u8 *)g_AutoDmaBuf
251 + ((cur_status_1 >> 24) == ((cur_status_2 < 0xC000) ? 0 : 1) ? (g_AutoDmaBufSize / 2) : 0));
252 while ( cur_status_2 < 0xF000 )
254 cur_status_2 = sceSdBlockTransStatus(1, 0);
256 cur_status_2 = (cur_status_2 & 0xFFFFFF) - (uiptr)(u8 *)g_AutoDmaBuf
257 - ((cur_status_2 >> 24) == 1 ? (g_AutoDmaBufSize / 2) : 0);
259 for ( i = 0; i < 0x2000; i += 128 )
261 for ( j = 0; j < 128; j += 1 )
263 buf_init_ptr[j] = buf_init_ptr[j] / 0x2000 * (0x2000 - i - j);
265 for ( k = 0; k < 128; k += 1 )
267 buf_init_ptr[k + 128] = buf_init_ptr[k + 128] / 0x2000 * (0x2000 - i - k);
270 memset(buf_cler_ptr, 0, g_AutoDmaBufSize / 2);
271 g_AutoDmaIntrCount = 0;
272 for ( i = 0; g_AutoDmaIntrCount < 2 && i <= 949999; i += 1 )
274 ret = sceSdBlockTrans(*((u16 *)buffer + 2), *((u16 *)buffer + 4), *((u8 **)buffer + 3), *((u32 *)buffer + 4));
275 g_AutoDmaInProcessing = 0;
280 ret = sceSdBlockTrans(
281 *((u16 *)buffer + 2), *((u16 *)buffer + 4), *((u8 **)buffer + 3), *((u32 *)buffer + 4), *((u32 *)buffer + 5));
285 ret = sceSdVoiceTransStatus(*((u16 *)buffer + 2), *((u16 *)buffer + 4));
288 ret = sceSdBlockTransStatus(*((u16 *)buffer + 2), *((u16 *)buffer + 4));
290#if SDRDRV_OBSOLETE_FUNCS
292 ret = (int)sceSdSetTransCallback(
293 *((u32 *)buffer + 1) ? 1 : 0,
294 *((u32 *)buffer + 2) ? (*((u32 *)buffer + 1) ? _sce_sdrDMA1CallBackProc : _sce_sdrDMA0CallBackProc) : 0);
297 ret = (int)sceSdSetIRQCallback(*((u32 *)buffer + 1) ? _sce_sdrIRQCallBackProc : 0);
304 sceSdGetEffectAttr(fno & 0xF, &g_sdrInfo.m_e_attr);
305 return &g_sdrInfo.m_e_attr;
307 ret = sceSdClearEffectWorkArea(*((u32 *)buffer + 1), *((u32 *)buffer + 2), *((u32 *)buffer + 3));
310 ret = (int)sceSdSetTransIntrHandler(
311 *((u32 *)buffer + 1) ? 1 : 0,
312 *((u32 *)buffer + 2) ? (*((u32 *)buffer + 1) ? _sce_sdrDMA1IntrHandler : 0) : _sce_sdrDMA0IntrHandler,
316 ret = (int)sceSdSetSpu2IntrHandler(*((u32 *)buffer + 1) ? _sce_sdrSpu2IntrHandler : 0, &g_eeCBInfo);
319 ret = sceSdStopTrans(*((u32 *)buffer + 1));
322 ret = sceSdCleanEffectWorkArea(*((u32 *)buffer + 1), *((u32 *)buffer + 2), *((u32 *)buffer + 3));
328 ret = sceSdProcBatch((
sceSdBatch *)buffer + 1, (u32 *)&g_sdrInfo.m_procbat_returns[1], *((u16 *)buffer + 1));
331 ret = sceSdProcBatchEx(
332 (
sceSdBatch *)buffer + 1, (u32 *)&g_sdrInfo.m_procbat_returns[1], *((u16 *)buffer + 1), *((u32 *)buffer + 1));
335 ret = sceSdrChangeThreadPriority(*((u32 *)buffer + 1), *((u32 *)buffer + 2));
354 ret = g_sdrInfo.m_sceSdr_vUserCommandFunction[(fno & 0xF0) >> 4] ?
355 g_sdrInfo.m_sceSdr_vUserCommandFunction[(fno & 0xF0) >> 4](fno, buffer, length) :
363 thparam.attr = 0x2000000;
364 thparam.thread = sce_sdrcb_loop;
365 thparam.stacksize = 2048;
367 thparam.priority = g_eeCBInfo.m_initial_priority_cb;
368 g_eeCBInfo.m_thid_cb = CreateThread(&thparam);
369 StartThread(g_eeCBInfo.m_thid_cb, &g_eeCBInfo);
370 Kprintf(
"SDR callback thread created\n");
375 if ( g_eeCBInfo.m_thid_cb > 0 )
377 TerminateThread(g_eeCBInfo.m_thid_cb);
378 DeleteThread(g_eeCBInfo.m_thid_cb);
379 g_eeCBInfo.m_thid_cb = 0;
380 Kprintf(
"SDR callback thread deleted\n");
385 Kprintf(
"SDR driver ERROR: unknown command %x \n", fno & 0xFFF0);
389 g_sdrInfo.m_procbat_returns[0] = ret;
390 return g_sdrInfo.m_procbat_returns;
393sceSdrUserCommandFunction sceSdrSetUserCommandFunction(
int command, sceSdrUserCommandFunction func)
395 sceSdrUserCommandFunction oldf;
397 if ( (command < 0x9000) || (command > 0x90F0) )
398 return (sceSdrUserCommandFunction)-1;
399 oldf = g_sdrInfo.m_sceSdr_vUserCommandFunction[(command & 0xF0) >> 4];
400 g_sdrInfo.m_sceSdr_vUserCommandFunction[(command & 0xF0) >> 4] = func;