7
7
8
8
namespace coreinit
9
9
{
10
-
11
- /* coreinit logging and string format */
12
-
13
- sint32 ppcSprintf (const char * formatStr, char * strOut, sint32 maxLength, PPCInterpreter_t* hCPU, sint32 initialParamIndex)
10
+ sint32 ppc_vprintf (const char * formatStr, char * strOut, sint32 maxLength, ppc_va_list* vargs)
14
11
{
15
12
char tempStr[4096 ];
16
- sint32 integerParamIndex = initialParamIndex;
17
- sint32 floatParamIndex = 0 ;
18
13
sint32 writeIndex = 0 ;
19
14
while (*formatStr)
20
15
{
@@ -101,8 +96,7 @@ namespace coreinit
101
96
tempFormat[(formatStr - formatStart)] = ' \0 ' ;
102
97
else
103
98
tempFormat[sizeof (tempFormat) - 1 ] = ' \0 ' ;
104
- sint32 tempLen = sprintf (tempStr, tempFormat, PPCInterpreter_getCallParamU32 (hCPU, integerParamIndex));
105
- integerParamIndex++;
99
+ sint32 tempLen = sprintf (tempStr, tempFormat, (uint32)*(uint32be*)_ppc_va_arg (vargs, ppc_va_type::INT32));
106
100
for (sint32 i = 0 ; i < tempLen; i++)
107
101
{
108
102
if (writeIndex >= maxLength)
@@ -120,13 +114,12 @@ namespace coreinit
120
114
tempFormat[(formatStr - formatStart)] = ' \0 ' ;
121
115
else
122
116
tempFormat[sizeof (tempFormat) - 1 ] = ' \0 ' ;
123
- MPTR strOffset = PPCInterpreter_getCallParamU32 (hCPU, integerParamIndex );
117
+ MPTR strOffset = *(uint32be*) _ppc_va_arg (vargs, ppc_va_type::INT32 );
124
118
sint32 tempLen = 0 ;
125
119
if (strOffset == MPTR_NULL)
126
120
tempLen = sprintf (tempStr, " NULL" );
127
121
else
128
122
tempLen = sprintf (tempStr, tempFormat, memory_getPointerFromVirtualOffset (strOffset));
129
- integerParamIndex++;
130
123
for (sint32 i = 0 ; i < tempLen; i++)
131
124
{
132
125
if (writeIndex >= maxLength)
@@ -136,17 +129,16 @@ namespace coreinit
136
129
}
137
130
strOut[std::min (maxLength - 1 , writeIndex)] = ' \0 ' ;
138
131
}
139
- else if (*formatStr == ' f ' )
132
+ else if (*formatStr == ' c ' )
140
133
{
141
- // float
134
+ // character
142
135
formatStr++;
143
136
strncpy (tempFormat, formatStart, std::min ((std::ptrdiff_t )sizeof (tempFormat) - 1 , formatStr - formatStart));
144
137
if ((formatStr - formatStart) < sizeof (tempFormat))
145
138
tempFormat[(formatStr - formatStart)] = ' \0 ' ;
146
139
else
147
140
tempFormat[sizeof (tempFormat) - 1 ] = ' \0 ' ;
148
- sint32 tempLen = sprintf (tempStr, tempFormat, (float )hCPU->fpr [1 + floatParamIndex].fp0 );
149
- floatParamIndex++;
141
+ sint32 tempLen = sprintf (tempStr, tempFormat, (uint32)*(uint32be*)_ppc_va_arg (vargs, ppc_va_type::INT32));
150
142
for (sint32 i = 0 ; i < tempLen; i++)
151
143
{
152
144
if (writeIndex >= maxLength)
@@ -155,17 +147,15 @@ namespace coreinit
155
147
writeIndex++;
156
148
}
157
149
}
158
- else if (*formatStr == ' c ' )
150
+ else if (*formatStr == ' f ' || *formatStr == ' g ' || *formatStr == ' G ' )
159
151
{
160
- // character
161
152
formatStr++;
162
153
strncpy (tempFormat, formatStart, std::min ((std::ptrdiff_t )sizeof (tempFormat) - 1 , formatStr - formatStart));
163
154
if ((formatStr - formatStart) < sizeof (tempFormat))
164
155
tempFormat[(formatStr - formatStart)] = ' \0 ' ;
165
156
else
166
157
tempFormat[sizeof (tempFormat) - 1 ] = ' \0 ' ;
167
- sint32 tempLen = sprintf (tempStr, tempFormat, PPCInterpreter_getCallParamU32 (hCPU, integerParamIndex));
168
- integerParamIndex++;
158
+ sint32 tempLen = sprintf (tempStr, tempFormat, (double )*(betype<double >*)_ppc_va_arg (vargs, ppc_va_type::FLOAT_OR_DOUBLE));
169
159
for (sint32 i = 0 ; i < tempLen; i++)
170
160
{
171
161
if (writeIndex >= maxLength)
@@ -183,8 +173,7 @@ namespace coreinit
183
173
tempFormat[(formatStr - formatStart)] = ' \0 ' ;
184
174
else
185
175
tempFormat[sizeof (tempFormat) - 1 ] = ' \0 ' ;
186
- sint32 tempLen = sprintf (tempStr, tempFormat, (double )hCPU->fpr [1 + floatParamIndex].fp0 );
187
- floatParamIndex++;
176
+ sint32 tempLen = sprintf (tempStr, tempFormat, (double )*(betype<double >*)_ppc_va_arg (vargs, ppc_va_type::FLOAT_OR_DOUBLE));
188
177
for (sint32 i = 0 ; i < tempLen; i++)
189
178
{
190
179
if (writeIndex >= maxLength)
@@ -196,16 +185,13 @@ namespace coreinit
196
185
else if ((formatStr[0 ] == ' l' && formatStr[1 ] == ' l' && (formatStr[2 ] == ' x' || formatStr[2 ] == ' X' )))
197
186
{
198
187
formatStr += 3 ;
199
- // double ( 64bit)
188
+ // 64bit int
200
189
strncpy (tempFormat, formatStart, std::min ((std::ptrdiff_t )sizeof (tempFormat) - 1 , formatStr - formatStart));
201
190
if ((formatStr - formatStart) < sizeof (tempFormat))
202
191
tempFormat[(formatStr - formatStart)] = ' \0 ' ;
203
192
else
204
193
tempFormat[sizeof (tempFormat) - 1 ] = ' \0 ' ;
205
- if (integerParamIndex & 1 )
206
- integerParamIndex++;
207
- sint32 tempLen = sprintf (tempStr, tempFormat, PPCInterpreter_getCallParamU64 (hCPU, integerParamIndex));
208
- integerParamIndex += 2 ;
194
+ sint32 tempLen = sprintf (tempStr, tempFormat, (uint64)*(uint64be*)_ppc_va_arg (vargs, ppc_va_type::INT64));
209
195
for (sint32 i = 0 ; i < tempLen; i++)
210
196
{
211
197
if (writeIndex >= maxLength)
@@ -223,10 +209,7 @@ namespace coreinit
223
209
tempFormat[(formatStr - formatStart)] = ' \0 ' ;
224
210
else
225
211
tempFormat[sizeof (tempFormat) - 1 ] = ' \0 ' ;
226
- if (integerParamIndex & 1 )
227
- integerParamIndex++;
228
- sint32 tempLen = sprintf (tempStr, tempFormat, PPCInterpreter_getCallParamU64 (hCPU, integerParamIndex));
229
- integerParamIndex += 2 ;
212
+ sint32 tempLen = sprintf (tempStr, tempFormat, (sint64)*(sint64be*)_ppc_va_arg (vargs, ppc_va_type::INT64));
230
213
for (sint32 i = 0 ; i < tempLen; i++)
231
214
{
232
215
if (writeIndex >= maxLength)
@@ -255,9 +238,12 @@ namespace coreinit
255
238
return std::min (writeIndex, maxLength - 1 );
256
239
}
257
240
241
+ /* coreinit logging and string format */
242
+
258
243
sint32 __os_snprintf (char * outputStr, sint32 maxLength, const char * formatStr)
259
244
{
260
- sint32 r = ppcSprintf (formatStr, outputStr, maxLength, PPCInterpreter_getCurrentInstance (), 3 );
245
+ ppc_define_va_list (3 , 0 );
246
+ sint32 r = ppc_vprintf (formatStr, outputStr, maxLength, &vargs);
261
247
return r;
262
248
}
263
249
@@ -322,32 +308,40 @@ namespace coreinit
322
308
}
323
309
}
324
310
311
+ void COSVReport (COSReportModule module , COSReportLevel level, const char * format, ppc_va_list* vargs)
312
+ {
313
+ char tmpBuffer[1024 ];
314
+ sint32 len = ppc_vprintf (format, tmpBuffer, sizeof (tmpBuffer), vargs);
315
+ WriteCafeConsole (CafeLogType::OSCONSOLE, tmpBuffer, len);
316
+ }
317
+
325
318
void OSReport (const char * format)
326
319
{
327
- char buffer[1024 * 2 ];
328
- sint32 len = ppcSprintf (format, buffer, sizeof (buffer), PPCInterpreter_getCurrentInstance (), 1 );
329
- WriteCafeConsole (CafeLogType::OSCONSOLE, buffer, len);
320
+ ppc_define_va_list (1 , 0 );
321
+ COSVReport (COSReportModule::coreinit, COSReportLevel::Info, format, &vargs);
330
322
}
331
323
332
- void OSVReport (const char * format, MPTR vaArgs )
324
+ void OSVReport (const char * format, ppc_va_list* vargs )
333
325
{
334
- cemu_assert_unimplemented ( );
326
+ COSVReport (COSReportModule::coreinit, COSReportLevel::Info, format, vargs );
335
327
}
336
328
337
329
void COSWarn (int moduleId, const char * format)
338
330
{
339
- char buffer[1024 * 2 ];
340
- int prefixLen = sprintf (buffer, " [COSWarn-%d] " , moduleId);
341
- sint32 len = ppcSprintf (format, buffer + prefixLen, sizeof (buffer) - prefixLen, PPCInterpreter_getCurrentInstance (), 2 );
342
- WriteCafeConsole (CafeLogType::OSCONSOLE, buffer, len + prefixLen);
331
+ ppc_define_va_list (2 , 0 );
332
+ char tmpBuffer[1024 ];
333
+ int prefixLen = sprintf (tmpBuffer, " [COSWarn-%d] " , moduleId);
334
+ sint32 len = ppc_vprintf (format, tmpBuffer + prefixLen, sizeof (tmpBuffer) - prefixLen, &vargs);
335
+ WriteCafeConsole (CafeLogType::OSCONSOLE, tmpBuffer, len + prefixLen);
343
336
}
344
337
345
338
void OSLogPrintf (int ukn1, int ukn2, int ukn3, const char * format)
346
339
{
347
- char buffer[1024 * 2 ];
348
- int prefixLen = sprintf (buffer, " [OSLogPrintf-%d-%d-%d] " , ukn1, ukn2, ukn3);
349
- sint32 len = ppcSprintf (format, buffer + prefixLen, sizeof (buffer) - prefixLen, PPCInterpreter_getCurrentInstance (), 4 );
350
- WriteCafeConsole (CafeLogType::OSCONSOLE, buffer, len + prefixLen);
340
+ ppc_define_va_list (4 , 0 );
341
+ char tmpBuffer[1024 ];
342
+ int prefixLen = sprintf (tmpBuffer, " [OSLogPrintf-%d-%d-%d] " , ukn1, ukn2, ukn3);
343
+ sint32 len = ppc_vprintf (format, tmpBuffer + prefixLen, sizeof (tmpBuffer) - prefixLen, &vargs);
344
+ WriteCafeConsole (CafeLogType::OSCONSOLE, tmpBuffer, len + prefixLen);
351
345
}
352
346
353
347
void OSConsoleWrite (const char * strPtr, sint32 length)
@@ -562,9 +556,11 @@ namespace coreinit
562
556
s_transitionToForeground = false ;
563
557
564
558
cafeExportRegister (" coreinit" , __os_snprintf, LogType::Placeholder);
559
+
560
+ cafeExportRegister (" coreinit" , COSVReport, LogType::Placeholder);
561
+ cafeExportRegister (" coreinit" , COSWarn, LogType::Placeholder);
565
562
cafeExportRegister (" coreinit" , OSReport, LogType::Placeholder);
566
563
cafeExportRegister (" coreinit" , OSVReport, LogType::Placeholder);
567
- cafeExportRegister (" coreinit" , COSWarn, LogType::Placeholder);
568
564
cafeExportRegister (" coreinit" , OSLogPrintf, LogType::Placeholder);
569
565
cafeExportRegister (" coreinit" , OSConsoleWrite, LogType::Placeholder);
570
566
0 commit comments