35#define CD_SERVER_INIT 0x80000592
36#define CD_SERVER_SEARCHFILE 0x80000597
37#define CD_SERVER_DISKREADY 0x8000059A
39#define CD_SERVER_POFF 0x80000596
45void _CdSemaExit(
void);
52 int m_cdvdfsv_version;
53 int m_cdvdman_version;
54 int m_cdvdfsv_isverbose;
66int initVersionCdvdfsv;
67int initVersionCdvdman;
72SifRpcClientData_t clientDiskReady
__attribute__((aligned(64)));
74SifRpcClientData_t clientSearchFile
__attribute__((aligned(64)));
86volatile int CdCallbackNum;
90int callbackThreadId = 0;
91ee_thread_t callbackThreadParam;
104extern int initVersionCdvdfsv;
105extern int initVersionCdvdman;
106extern SifRpcClientData_t clientInit;
107extern SifRpcClientData_t clientDiskReady;
108extern SifRpcClientData_t clientSearchFile;
112extern volatile int CdCallbackNum;
114extern int callbackThreadId;
115extern ee_thread_t callbackThreadParam;
116extern s32 diskReadyMode;
123s32 sceCdInit(s32 mode)
128 memset(&clientInit, 0,
sizeof(clientInit));
131 if (sceSifBindRpc(&clientInit, CD_SERVER_INIT, 0) < 0) {
133 printf(
"Libcdvd bind err CD_Init\n");
134 }
else if (clientInit.server != 0)
141 if (sceSifCallRpc(&clientInit, 0, 0, &initMode,
sizeof(initMode), &cdInitRecvBuff,
sizeof(cdInitRecvBuff), 0, 0) < 0)
143 initVersionCdvdfsv = cdInitRecvBuff.m_cdvdfsv_version;
144 initVersionCdvdman = cdInitRecvBuff.m_cdvdman_version;
147 printf(
"Libcdvd Exit\n");
161 p->
minute = (((((i + 150) / 75) / 60) / 10) * 16) + ((((i + 150) / 75) / 60) % 10);
162 p->second = (((((i + 150) / 75) % 60) / 10) * 16) + ((((i + 150) / 75) % 60) % 10);
163 p->sector = ((((i + 150) % 75) / 10) * 16) + (((i + 150) % 75) % 10);
169 return ((((p->minute / 16) * 10) + (p->minute & 0xF)) * 60 + ((p->second / 16) * 10) + (p->second & 0xF)) * 75 + (p->sector / 16) * 10 + (p->sector & 0xF) - 150;
177 nCmdNum = CD_SERVER_SEARCHFILE;
183 if (HasIopRebootedSinceLastCall())
184 memset(&clientSearchFile, 0,
sizeof(clientSearchFile));
185 if (!clientSearchFile.server) {
187 if (sceSifBindRpc(&clientSearchFile, CD_SERVER_SEARCHFILE, 0) < 0) {
189 printf(
"libsceCdvd bind err sceCdSearchFile\n");
191 if (clientSearchFile.server != 0)
198 strlcpy(searchFileSendBuff.name, name,
sizeof(searchFileSendBuff.name));
199 searchFileSendBuff.dest = &searchFileSendBuff;
202 printf(
"ee call cmd search %s\n", searchFileSendBuff.name);
203 if (sceSifCallRpc(&clientSearchFile, 0, 0, &searchFileSendBuff,
sizeof(
SearchFilePkt), nCmdRecvBuff, 4, NULL, NULL) < 0) {
208 memcpy(file, UNCACHED_SEG(&searchFileSendBuff), 32);
211 printf(
"search name %s\n", file->
name);
212 printf(
"search size %d\n", file->
size);
213 printf(
"search loc lnn %d\n", file->
lsn);
214 printf(
"search loc date %02X %02X %02X %02X %02X %02X %02X %02X\n",
217 printf(
"search loc date %02d %02d %02d %02d %02d %02d %02d %02d\n",
223 return *(s32 *)UNCACHED_SEG(nCmdRecvBuff);
226s32 sceCdDiskReady(s32 mode)
229 printf(
"DiskReady 0\n");
232 if (PollSema(sCmdSemaId) != sCmdSemaId)
235 SignalSema(sCmdSemaId);
240 if (HasIopRebootedSinceLastCall())
241 memset(&clientDiskReady, 0,
sizeof(clientDiskReady));
242 if (!clientDiskReady.server) {
244 if (sceSifBindRpc(&clientDiskReady, CD_SERVER_DISKREADY, 0) < 0) {
246 printf(
"Libcdvd bind err CdDiskReady\n");
248 if (clientDiskReady.server != 0)
254 diskReadyMode = mode;
256 if (sceSifCallRpc(&clientDiskReady, 0, 0, &diskReadyMode, 4, sCmdRecvBuff, 4, NULL, NULL) < 0) {
257 SignalSema(sCmdSemaId);
261 printf(
"DiskReady ended\n");
263 SignalSema(sCmdSemaId);
264 return *(s32 *)UNCACHED_SEG(sCmdRecvBuff);
267void _CdSemaInit(
void)
275 semaParam.init_count = 1;
276 semaParam.max_count = 1;
277 semaParam.option = 0;
281 sCmdSemaId = CreateSema(&semaParam);
285 semaParam.init_count = 0;
293void _CdSemaExit(
void)
295 if (callbackThreadId) {
300 DeleteSema(sCmdSemaId);
304static void _CdCallbackLoop(
void);
305s32 sceCdInitEeCB(s32 priority,
void *stackAddr, s32 stackSize)
308 if (callbackThreadId != 0) {
309 ChangeThreadPriority(callbackThreadId, priority);
313 callbackThreadParam.stack_size = stackSize;
314 callbackThreadParam.gp_reg = &
_gp;
315 callbackThreadParam.func = &_CdCallbackLoop;
316 callbackThreadParam.stack = stackAddr;
317 callbackThreadParam.initial_priority = priority;
318 callbackThreadId = CreateThread(&callbackThreadParam);
319 StartThread(callbackThreadId, NULL);
331 sceCdCallbackFunc = newFunc;
343static void _CdCallbackLoop(
void)
349 if (CdCallbackNum == -1)
353 printf(
"sceCdCallbackFunc = %08X CdCallbackNum = %d\n", (u32)sceCdCallbackFunc, CdCallbackNum);
356 if (sceCdCallbackFunc && CdCallbackNum)
357 sceCdCallbackFunc(CdCallbackNum);
367 CdCallbackNum = *(s32 *)funcNum;
371 if (callbackThreadId) {
372 if (sceCdCallbackFunc) {
void _CdGenericCallbackFunction(void *funcNum)
void(*) sceCdCBFunc(int reason)
sceCdCBFunc sceCdCallback(sceCdCBFunc newFunc)
u32 sceCdPosToInt(sceCdlLOCCD *p)
sceCdlLOCCD * sceCdIntToPos(u32 i, sceCdlLOCCD *p)
s32 sceCdSearchFile(sceCdlFILE *file, const char *name)