sdk-world v2026.11.05
PS2 SDK - world tier (copyleft-allowed, non-essential packages)
Loading...
Searching...
No Matches
sdr_main.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 <sdr_i.h>
12
14{
15 int m_sbuff[16] __attribute__((__aligned__(64)));
16 SifRpcClientData_t m_cd __attribute__((__aligned__(64)));
17 SifRpcEndFunc_t m_endfunc;
18};
19
20static struct libsdr_data g_libsdr_data;
21
22int sceSdRemoteInit(void)
23{
24 if (HasIopRebootedSinceLastCall())
25 memset(&g_libsdr_data.m_cd, 0, sizeof(g_libsdr_data.m_cd));
26 for (;;)
27 {
28 if (sceSifBindRpc(&g_libsdr_data.m_cd, sce_SDR_DEV, 0) < 0)
29 return -1;
30
31 if (g_libsdr_data.m_cd.server != NULL)
32 break;
33
34 nopdelay();
35 }
36 return 0;
37}
38
39int sceSdTransToIOP(void *eeaddr, void *iopaddr, u32 size, u32 blocking)
40{
41 SifDmaTransfer_t dmat[1];
42 int trid;
43 if (!blocking)
44 return -1;
45
46 dmat[0].src = eeaddr;
47 dmat[0].dest = iopaddr;
48 dmat[0].size = size;
49 dmat[0].attr = 0;
50
51 while (!(trid = sceSifSetDma(dmat, sizeof(dmat)/sizeof(dmat[0]))));
52
53 if (blocking == 1)
54 while (sceSifDmaStat(trid) >= 0);
55
56 return 0;
57}
58
59SifRpcEndFunc_t sceSdCallBack(SifRpcEndFunc_t endfunc)
60{
61 SifRpcEndFunc_t old_endfunc;
62
63 old_endfunc = g_libsdr_data.m_endfunc;
64 g_libsdr_data.m_endfunc = endfunc;
65
66 return old_endfunc;
67}
68
69int sceSdRemote(int arg0, ...)
70{
71 va_list ap;
72 int blocking;
73 int cmd;
74 SifRpcEndFunc_t endfunc;
75 int i;
76 int ret;
77 const void *old_handler;
78
79 va_start(ap, arg0);
80 blocking = arg0;
81 cmd = va_arg(ap, int);
82 g_libsdr_data.m_sbuff[0] = (uiptr)g_libsdr_data.m_sbuff;
83 for (i = 1; i < 7; i += 1)
84 g_libsdr_data.m_sbuff[i] = va_arg(ap, int);
85 va_end(ap);
86 blocking = blocking ? 0 : SIF_RPC_M_NOWAIT;
87 endfunc = blocking ? g_libsdr_data.m_endfunc : NULL;
88
89 switch (cmd)
90 {
91 case rSdSetTransCallback:
92 old_handler = SdrSetTransInterruptCallback(g_libsdr_data.m_sbuff[1] ? 1 : 0, (void *)(uiptr)g_libsdr_data.m_sbuff[2]);
93 break;
94 case rSdSetIRQCallback:
95 old_handler = SdrSetIRQInterruptCallback((void *)(uiptr)g_libsdr_data.m_sbuff[1]);
96 break;
97 case rSdSetTransIntrHandler:
98 old_handler = SdrSetTransInterruptHandler(g_libsdr_data.m_sbuff[1] ? 1 : 0, (void *)(uiptr)g_libsdr_data.m_sbuff[2], (void *)(uiptr)g_libsdr_data.m_sbuff[3]);
99 break;
100 case rSdSetSpu2IntrHandler:
101 old_handler = SdrSetIRQInterruptHandler((void *)(uiptr)g_libsdr_data.m_sbuff[1], (void *)(uiptr)g_libsdr_data.m_sbuff[2]);
102 break;
103 default:
104 old_handler = NULL;
105 break;
106 }
107
108 ret = 0;
109 switch (cmd)
110 {
111 case rSdSetEffectAttr:
112 case rSdSetEffectMode:
113 case rSdSetEffectModeParams:
114 sceSifCallRpc(&g_libsdr_data.m_cd, cmd | g_libsdr_data.m_sbuff[1], blocking, (void *)(uiptr)g_libsdr_data.m_sbuff[2], 64, &g_libsdr_data.m_sbuff[0], sizeof(g_libsdr_data.m_sbuff), endfunc, &g_libsdr_data.m_sbuff[0]);
115 ret = g_libsdr_data.m_sbuff[0];
116 break;
117 case rSdGetEffectAttr:
118 sceSifCallRpc(&g_libsdr_data.m_cd, cmd | g_libsdr_data.m_sbuff[1], blocking, &g_libsdr_data.m_sbuff[0], sizeof(g_libsdr_data.m_sbuff), (void *)(uiptr)g_libsdr_data.m_sbuff[2], 64, endfunc, (void *)(uiptr)g_libsdr_data.m_sbuff[2]);
119 break;
120 case rSdProcBatch2:
121 case rSdProcBatchEx2:
122 {
123 sceSdBatch *batch_p;
124 int *retptr;
125 int retptr_sz;
126 batch_p = (sceSdBatch *)g_libsdr_data.m_sbuff[1];
127 batch_p[0].entry = g_libsdr_data.m_sbuff[2];
128 if (cmd == rSdProcBatchEx2)
129 batch_p[0].value = g_libsdr_data.m_sbuff[5];
130 retptr = (void *)(uiptr)g_libsdr_data.m_sbuff[3];
131 retptr_sz = retptr ? g_libsdr_data.m_sbuff[4] : (int)sizeof(ret);
132 if (!retptr)
133 retptr = &ret;
134 sceSifCallRpc(&g_libsdr_data.m_cd, cmd, blocking, &g_libsdr_data.m_sbuff[1], sizeof(sceSdBatch) * (g_libsdr_data.m_sbuff[2] + 1), retptr, retptr_sz, endfunc, &g_libsdr_data.m_sbuff[0]);
135 ret = *retptr;
136 break;
137 }
138 case rSdUserCommand0:
139 case rSdUserCommand1:
140 case rSdUserCommand2:
141 case rSdUserCommand3:
142 case rSdUserCommand4:
143 case rSdUserCommand5:
144 case rSdUserCommand6:
145 case rSdUserCommand7:
146 case rSdUserCommand8:
147 case rSdUserCommand9:
148 case rSdUserCommandA:
149 case rSdUserCommandB:
150 case rSdUserCommandC:
151 case rSdUserCommandD:
152 case rSdUserCommandE:
153 case rSdUserCommandF:
154 sceSifCallRpc(&g_libsdr_data.m_cd, cmd, blocking, &g_libsdr_data.m_sbuff[1], g_libsdr_data.m_sbuff[2], &g_libsdr_data.m_sbuff[0], 16, endfunc, &g_libsdr_data.m_sbuff[0]);
155 ret = g_libsdr_data.m_sbuff[0];
156 break;
157 default:
158 sceSifCallRpc(&g_libsdr_data.m_cd, cmd, blocking, &g_libsdr_data.m_sbuff[0], sizeof(g_libsdr_data.m_sbuff), &g_libsdr_data.m_sbuff[0], 16, endfunc, &g_libsdr_data.m_sbuff[0]);
159 ret = g_libsdr_data.m_sbuff[0];
160 break;
161 }
162
163 switch (cmd)
164 {
165 case rSdSetTransCallback:
166 case rSdSetIRQCallback:
167 case rSdSetTransIntrHandler:
168 case rSdSetSpu2IntrHandler:
169 ret = (int)(uiptr)old_handler;
170 break;
171 default:
172 break;
173 }
174
175 return ret;
176}