ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/ps2launchargs/source/uLaunchELF/cd.c
Revision: 1101
Committed: Wed Feb 7 05:08:54 2018 UTC (7 years, 8 months ago) by iritscen
Content type: text/x-csrc
File size: 4361 byte(s)
Log Message:
Added following to ps2launchargs:\n-Source code.\n-DLL needed to run ps2client.\n-Instructions for building uLaunchELF.

File Contents

# Content
1 //---------------------------------------------------------------------------
2 //File name: cd.c
3 //---------------------------------------------------------------------------
4 #include "launchelf.h"
5
6 #define CD_SERVER_INIT 0x80000592
7 #define CD_SERVER_SCMD 0x80000593
8 #define CD_SCMD_GETDISCTYPE 0x03
9
10 SifRpcClientData_t clientInit __attribute__ ((aligned(64)));
11 u32 initMode __attribute__ ((aligned(64)));
12 s32 cdThreadId = 0;
13 s32 bindSearchFile = -1;
14 s32 bindDiskReady = -1;
15 s32 bindInit = -1;
16 s32 bindNCmd = -1;
17 s32 bindSCmd = -1;
18 s32 nCmdSemaId = -1; // n-cmd semaphore id
19 s32 sCmdSemaId = -1; // s-cmd semaphore id
20 s32 callbackSemaId = -1; // callback semaphore id
21 s32 cdDebug = 0;
22 s32 sCmdNum = 0;
23 SifRpcClientData_t clientSCmd __attribute__ ((aligned(64)));
24 u8 sCmdRecvBuff[48] __attribute__ ((aligned(64)));
25 volatile s32 cbSema = 0;
26 ee_thread_t cdThreadParam; // Iritscen: changed "ee_thread_status_t" (used in later ps2sdk versions) to earlier name "ee_thread_t"
27 s32 callbackThreadId = 0;
28 volatile s32 cdCallbackNum __attribute__ ((aligned(64)));
29
30 void cdSemaInit(void);
31 s32 cdCheckSCmd(s32 cur_cmd);
32 s32 cdSyncS(s32 mode);
33 void cdSemaExit(void);
34
35 //---------------------------------------------------------------------------
36 s32 cdInit(s32 mode)
37 {
38 s32 i;
39
40 if (cdSyncS(1))
41 return 0;
42 SifInitRpc(0);
43 cdThreadId = GetThreadId();
44 bindSearchFile = -1;
45 bindNCmd = -1;
46 bindSCmd = -1;
47 bindDiskReady = -1;
48 bindInit = -1;
49
50 while (1) {
51 if (SifBindRpc(&clientInit, CD_SERVER_INIT, 0) >= 0)
52 if (clientInit.server != 0) break;
53 i = 0x10000;
54 while (i--);
55 }
56
57 bindInit = 0;
58 initMode = mode;
59 SifWriteBackDCache(&initMode, 4);
60 if (SifCallRpc(&clientInit, 0, 0, &initMode, 4, 0, 0, 0, 0) < 0)
61 return 0;
62 if (mode == CDVD_INIT_EXIT) {
63 cdSemaExit();
64 nCmdSemaId = -1;
65 sCmdSemaId = -1;
66 callbackSemaId = -1;
67 } else {
68 cdSemaInit();
69 }
70 return 1;
71 }
72
73 //---------------------------------------------------------------------------
74 void cdSemaExit(void)
75 {
76 if (callbackThreadId) {
77 cdCallbackNum = -1;
78 SignalSema(callbackSemaId);
79 }
80 DeleteSema(nCmdSemaId);
81 DeleteSema(sCmdSemaId);
82 DeleteSema(callbackSemaId);
83 }
84
85 //---------------------------------------------------------------------------
86 void cdSemaInit(void)
87 {
88 struct t_ee_sema semaParam;
89
90 // return if both semaphores are already inited
91 if (nCmdSemaId != -1 && sCmdSemaId != -1)
92 return;
93
94 semaParam.init_count = 1;
95 semaParam.max_count = 1;
96 semaParam.option = 0;
97 nCmdSemaId = CreateSema(&semaParam);
98 sCmdSemaId = CreateSema(&semaParam);
99
100 semaParam.init_count = 0;
101 callbackSemaId = CreateSema(&semaParam);
102
103 cbSema = 0;
104 }
105
106 //---------------------------------------------------------------------------
107 s32 cdCheckSCmd(s32 cur_cmd)
108 {
109 s32 i;
110 cdSemaInit();
111 if (PollSema(sCmdSemaId) != sCmdSemaId) {
112 if (cdDebug > 0)
113 printf("Scmd fail sema cur_cmd:%d keep_cmd:%d\n", cur_cmd, sCmdNum);
114 return 0;
115 }
116 sCmdNum = cur_cmd;
117 ReferThreadStatus(cdThreadId, &cdThreadParam);
118 if (cdSyncS(1)) {
119 SignalSema(sCmdSemaId);
120 return 0;
121 }
122
123 SifInitRpc(0);
124 if (bindSCmd >= 0)
125 return 1;
126 while (1) {
127 if (SifBindRpc(&clientSCmd, CD_SERVER_SCMD, 0) < 0) {
128 if (cdDebug > 0)
129 printf("Libcdvd bind err S cmd\n");
130 }
131 if (clientSCmd.server != 0)
132 break;
133
134 i = 0x10000;
135 while (i--)
136 ;
137 }
138
139 bindSCmd = 0;
140 return 1;
141 }
142
143 //---------------------------------------------------------------------------
144 s32 cdSyncS(s32 mode)
145 {
146 if (mode == 0) {
147 if (cdDebug > 0)
148 printf("S cmd wait\n");
149 while (SifCheckStatRpc(&clientSCmd))
150 ;
151 return 0;
152 }
153 return SifCheckStatRpc(&clientSCmd);
154 }
155
156 //---------------------------------------------------------------------------
157 CdvdDiscType_t cdGetDiscType(void)
158 {
159 if (cdCheckSCmd(CD_SCMD_GETDISCTYPE) == 0)
160 return 0;
161
162 if (SifCallRpc(&clientSCmd, CD_SCMD_GETDISCTYPE, 0, 0, 0, sCmdRecvBuff, 4, 0, 0) < 0) {
163 SignalSema(sCmdSemaId);
164 return 0;
165 }
166
167 SignalSema(sCmdSemaId);
168 return *(s32 *) UNCACHED_SEG(sCmdRecvBuff);
169 }
170 //------------------------------
171 //endfunc cdGetDiscType
172 //---------------------------------------------------------------------------
173 //End of file: cd.c
174 //---------------------------------------------------------------------------

Properties

Name Value
svn:executable *