CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
Path: blob/master/Core/HLE/sceCcc.cpp
Views: 1401
// Copyright (c) 2012- PPSSPP Project.12// This program is free software: you can redistribute it and/or modify3// it under the terms of the GNU General Public License as published by4// the Free Software Foundation, version 2.0 or later versions.56// This program is distributed in the hope that it will be useful,7// but WITHOUT ANY WARRANTY; without even the implied warranty of8// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the9// GNU General Public License 2.0 for more details.1011// A copy of the GPL 2.0 should have been included with the program.12// If not, see http://www.gnu.org/licenses/1314// Official git repository and contact information can be found at15// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.1617#include "Common/Data/Encoding/Utf8.h"18#include "Common/Data/Encoding/Utf16.h"19#include "Common/Data/Encoding/Shiftjis.h"2021#include "Common/Serialize/Serializer.h"22#include "Common/Serialize/SerializeFuncs.h"23#include "Core/Debugger/MemBlockInfo.h"24#include "Core/MemMap.h"25#include "Core/HLE/HLE.h"26#include "Core/HLE/FunctionWrappers.h"27#include "Core/HLE/sceCcc.h"28#include "Core/Reporting.h"2930typedef PSPPointer<char> PSPCharPointer;31typedef PSPPointer<char16_t> PSPWCharPointer;32typedef PSPPointer<const char> PSPConstCharPointer;33typedef PSPPointer<const char16_t> PSPConstWCharPointer;3435static u16 errorUTF8;36static u16 errorUTF16;37static u16 errorSJIS;3839// These tables point directly to PSP memory and map all 64k possible u16 values.40static PSPWCharPointer ucs2jisTable;41static PSPWCharPointer jis2ucsTable;4243void __CccInit()44{45errorUTF8 = 0;46errorUTF16 = 0;47errorSJIS = 0;48ucs2jisTable = 0;49jis2ucsTable = 0;50}5152void __CccDoState(PointerWrap &p)53{54auto s = p.Section("sceCcc", 1);55if (!s)56return;5758Do(p, errorUTF8);59Do(p, errorUTF16);60Do(p, errorSJIS);61Do(p, ucs2jisTable);62Do(p, jis2ucsTable);63}6465static u32 __CccUCStoJIS(u32 c, u32 alt)66{67// JIS can only be 16-bit at most, UCS can be 32 (even if the table only supports UCS-2.)68alt &= 0xFFFF;6970// If it's outside the table or blank in the table, return alt.71if (c > 0xFFFF || ucs2jisTable[c] == 0)72return alt;73return ucs2jisTable[c];74}7576static u32 __CccJIStoUCS(u32 c, u32 alt)77{78// JIS can only be 16-bit at most, UCS can be 32 (even if the table only supports UCS-2.)79c &= 0xFFFF;80if (jis2ucsTable[c] == 0)81return alt;82return jis2ucsTable[c];83}8485static void sceCccSetTable(u32 jis2ucs, u32 ucs2jis)86{87// Both tables jis2ucs and ucs2jis have a size of 0x20000 bytes.88DEBUG_LOG(Log::sceMisc, "sceCccSetTable(%08x, %08x)", jis2ucs, ucs2jis);89ucs2jisTable = ucs2jis;90jis2ucsTable = jis2ucs;91}9293static int sceCccUTF8toUTF16(u32 dstAddr, u32 dstSize, u32 srcAddr)94{95const auto src = PSPConstCharPointer::Create(srcAddr);96auto dst = PSPWCharPointer::Create(dstAddr);97if (!dst.IsValid() || !src.IsValid())98{99ERROR_LOG(Log::sceMisc, "sceCccUTF8toUTF16(%08x, %d, %08x): invalid pointers", dstAddr, dstSize, srcAddr);100return 0;101}102103// Round dstSize down if it represents half a character.104const auto dstEnd = PSPWCharPointer::Create(dstAddr + (dstSize & ~1));105106DEBUG_LOG(Log::sceMisc, "sceCccUTF8toUTF16(%08x, %d, %08x)", dstAddr, dstSize, srcAddr);107UTF8 utf(src);108int n = 0;109while (u32 c = utf.next())110{111if (dst + UTF16LE::encodeUnits(c) >= dstEnd)112break;113dst += UTF16LE::encode(dst, c);114n++;115}116117if (dst < dstEnd)118*dst++ = 0;119120NotifyMemInfo(MemBlockFlags::READ, srcAddr, utf.byteIndex(), "sceCcc");121NotifyMemInfo(MemBlockFlags::WRITE, dstAddr, dst.ptr - dstAddr, "sceCcc");122return n;123}124125static int sceCccUTF8toSJIS(u32 dstAddr, u32 dstSize, u32 srcAddr)126{127const auto src = PSPConstCharPointer::Create(srcAddr);128auto dst = PSPCharPointer::Create(dstAddr);129if (!dst.IsValid() || !src.IsValid())130{131ERROR_LOG(Log::sceMisc, "sceCccUTF8toSJIS(%08x, %d, %08x): invalid pointers", dstAddr, dstSize, srcAddr);132return 0;133}134if (!ucs2jisTable.IsValid())135{136ERROR_LOG(Log::sceMisc, "sceCccUTF8toSJIS(%08x, %d, %08x): table not loaded", dstAddr, dstSize, srcAddr);137return 0;138}139140const auto dstEnd = PSPCharPointer::Create(dstAddr + dstSize);141142DEBUG_LOG(Log::sceMisc, "sceCccUTF8toSJIS(%08x, %d, %08x)", dstAddr, dstSize, srcAddr);143UTF8 utf(src);144int n = 0;145while (u32 c = utf.next())146{147if (dst + ShiftJIS::encodeUnits(c) >= dstEnd)148break;149dst += ShiftJIS::encode(dst, __CccUCStoJIS(c, errorSJIS));150n++;151}152153if (dst < dstEnd)154*dst++ = 0;155156NotifyMemInfo(MemBlockFlags::READ, srcAddr, utf.byteIndex(), "sceCcc");157NotifyMemInfo(MemBlockFlags::WRITE, dstAddr, dst.ptr - dstAddr, "sceCcc");158return n;159}160161static int sceCccUTF16toUTF8(u32 dstAddr, u32 dstSize, u32 srcAddr)162{163const auto src = PSPConstWCharPointer::Create(srcAddr);164auto dst = PSPCharPointer::Create(dstAddr);165if (!dst.IsValid() || !src.IsValid())166{167ERROR_LOG(Log::sceMisc, "sceCccUTF16toUTF8(%08x, %d, %08x): invalid pointers", dstAddr, dstSize, srcAddr);168return 0;169}170171const auto dstEnd = PSPCharPointer::Create(dstAddr + dstSize);172173DEBUG_LOG(Log::sceMisc, "sceCccUTF16toUTF8(%08x, %d, %08x)", dstAddr, dstSize, srcAddr);174UTF16LE utf(src);175int n = 0;176while (u32 c = utf.next())177{178if (dst + UTF8::encodeUnits(c) >= dstEnd)179break;180dst += UTF8::encode(dst, c);181n++;182}183184if (dst < dstEnd)185*dst++ = 0;186187NotifyMemInfo(MemBlockFlags::READ, srcAddr, utf.shortIndex() * sizeof(uint16_t), "sceCcc");188NotifyMemInfo(MemBlockFlags::WRITE, dstAddr, dst.ptr - dstAddr, "sceCcc");189return n;190}191192static int sceCccUTF16toSJIS(u32 dstAddr, u32 dstSize, u32 srcAddr)193{194const auto src = PSPConstWCharPointer::Create(srcAddr);195auto dst = PSPCharPointer::Create(dstAddr);196if (!dst.IsValid() || !src.IsValid())197{198ERROR_LOG(Log::sceMisc, "sceCccUTF16toSJIS(%08x, %d, %08x): invalid pointers", dstAddr, dstSize, srcAddr);199return 0;200}201if (!ucs2jisTable.IsValid())202{203ERROR_LOG(Log::sceMisc, "sceCccUTF16toSJIS(%08x, %d, %08x): table not loaded", dstAddr, dstSize, srcAddr);204return 0;205}206207const auto dstEnd = PSPCharPointer::Create(dstAddr + dstSize);208209DEBUG_LOG(Log::sceMisc, "sceCccUTF16toSJIS(%08x, %d, %08x)", dstAddr, dstSize, srcAddr);210UTF16LE utf(src);211int n = 0;212while (u32 c = utf.next())213{214if (dst + ShiftJIS::encodeUnits(c) >= dstEnd)215break;216dst += ShiftJIS::encode(dst, __CccUCStoJIS(c, errorSJIS));217n++;218}219220if (dst < dstEnd)221*dst++ = 0;222223NotifyMemInfo(MemBlockFlags::READ, srcAddr, utf.shortIndex() * sizeof(uint16_t), "sceCcc");224NotifyMemInfo(MemBlockFlags::WRITE, dstAddr, dst.ptr - dstAddr, "sceCcc");225return n;226}227228static int sceCccSJIStoUTF8(u32 dstAddr, u32 dstSize, u32 srcAddr)229{230const auto src = PSPConstCharPointer::Create(srcAddr);231auto dst = PSPCharPointer::Create(dstAddr);232if (!dst.IsValid() || !src.IsValid())233{234ERROR_LOG(Log::sceMisc, "sceCccSJIStoUTF8(%08x, %d, %08x): invalid pointers", dstAddr, dstSize, srcAddr);235return 0;236}237if (!jis2ucsTable.IsValid())238{239ERROR_LOG(Log::sceMisc, "sceCccSJIStoUTF8(%08x, %d, %08x): table not loaded", dstAddr, dstSize, srcAddr);240return 0;241}242243const auto dstEnd = PSPCharPointer::Create(dstAddr + dstSize);244245DEBUG_LOG(Log::sceMisc, "sceCccSJIStoUTF8(%08x, %d, %08x)", dstAddr, dstSize, srcAddr);246ShiftJIS sjis(src);247int n = 0;248while (u32 c = sjis.next())249{250if (dst + UTF8::encodeUnits(c) >= dstEnd)251break;252dst += UTF8::encode(dst, __CccJIStoUCS(c, errorUTF8));253n++;254}255256if (dst < dstEnd)257*dst++ = 0;258259NotifyMemInfo(MemBlockFlags::READ, srcAddr, sjis.byteIndex(), "sceCcc");260NotifyMemInfo(MemBlockFlags::WRITE, dstAddr, dst.ptr - dstAddr, "sceCcc");261return n;262}263264static int sceCccSJIStoUTF16(u32 dstAddr, u32 dstSize, u32 srcAddr)265{266const auto src = PSPConstCharPointer::Create(srcAddr);267auto dst = PSPWCharPointer::Create(dstAddr);268if (!dst.IsValid() || !src.IsValid())269{270ERROR_LOG(Log::sceMisc, "sceCccSJIStoUTF16(%08x, %d, %08x): invalid pointers", dstAddr, dstSize, srcAddr);271return 0;272}273if (!jis2ucsTable.IsValid())274{275ERROR_LOG(Log::sceMisc, "sceCccSJIStoUTF16(%08x, %d, %08x): table not loaded", dstAddr, dstSize, srcAddr);276return 0;277}278279const auto dstEnd = PSPWCharPointer::Create(dstAddr + (dstSize & ~1));280281DEBUG_LOG(Log::sceMisc, "sceCccSJIStoUTF16(%08x, %d, %08x)", dstAddr, dstSize, srcAddr);282ShiftJIS sjis(src);283int n = 0;284while (u32 c = sjis.next())285{286if (dst + UTF16LE::encodeUnits(c) >= dstEnd)287break;288dst += UTF16LE::encode(dst, __CccJIStoUCS(c, errorUTF16));289n++;290}291292if (dst < dstEnd)293*dst++ = 0;294295NotifyMemInfo(MemBlockFlags::READ, srcAddr, sjis.byteIndex(), "sceCcc");296NotifyMemInfo(MemBlockFlags::WRITE, dstAddr, dst.ptr - dstAddr, "sceCcc");297return n;298}299300static int sceCccStrlenUTF8(u32 strAddr)301{302const auto str = PSPConstCharPointer::Create(strAddr);303if (!str.IsValid())304{305ERROR_LOG(Log::sceMisc, "sceCccStrlenUTF8(%08x): invalid pointer", strAddr);306return 0;307}308DEBUG_LOG(Log::sceMisc, "sceCccStrlenUTF8(%08x): invalid pointer", strAddr);309return UTF8(str).length();310}311312static int sceCccStrlenUTF16(u32 strAddr)313{314const auto str = PSPConstWCharPointer::Create(strAddr);315if (!str.IsValid())316{317ERROR_LOG(Log::sceMisc, "sceCccStrlenUTF16(%08x): invalid pointer", strAddr);318return 0;319}320DEBUG_LOG(Log::sceMisc, "sceCccStrlenUTF16(%08x): invalid pointer", strAddr);321return UTF16LE(str).length();322}323324static int sceCccStrlenSJIS(u32 strAddr)325{326const auto str = PSPCharPointer::Create(strAddr);327if (!str.IsValid())328{329ERROR_LOG(Log::sceMisc, "sceCccStrlenSJIS(%08x): invalid pointer", strAddr);330return 0;331}332DEBUG_LOG(Log::sceMisc, "sceCccStrlenSJIS(%08x): invalid pointer", strAddr);333return ShiftJIS(str).length();334}335336static u32 sceCccEncodeUTF8(u32 dstAddrAddr, u32 ucs)337{338auto dstp = PSPPointer<PSPCharPointer>::Create(dstAddrAddr);339340if (!dstp.IsValid() || !dstp->IsValid())341{342ERROR_LOG(Log::sceMisc, "sceCccEncodeUTF8(%08x, U+%04x): invalid pointer", dstAddrAddr, ucs);343return 0;344}345DEBUG_LOG(Log::sceMisc, "sceCccEncodeUTF8(%08x, U+%04x)", dstAddrAddr, ucs);346*dstp += UTF8::encode(*dstp, ucs);347return dstp->ptr;348}349350static void sceCccEncodeUTF16(u32 dstAddrAddr, u32 ucs)351{352auto dstp = PSPPointer<PSPWCharPointer>::Create(dstAddrAddr);353354if (!dstp.IsValid() || !dstp->IsValid())355{356ERROR_LOG(Log::sceMisc, "sceCccEncodeUTF16(%08x, U+%04x): invalid pointer", dstAddrAddr, ucs);357return;358}359DEBUG_LOG(Log::sceMisc, "sceCccEncodeUTF16(%08x, U+%04x)", dstAddrAddr, ucs);360// Anything above 0x10FFFF is unencodable, and 0xD800 - 0xDFFF are reserved for surrogate pairs.361if (ucs > 0x10FFFF || (ucs & 0xD800) == 0xD800)362ucs = errorUTF16;363*dstp += UTF16LE::encode(*dstp, ucs);364}365366static u32 sceCccEncodeSJIS(u32 dstAddrAddr, u32 jis)367{368auto dstp = PSPPointer<PSPCharPointer>::Create(dstAddrAddr);369370if (!dstp.IsValid() || !dstp->IsValid())371{372ERROR_LOG(Log::sceMisc, "sceCccEncodeSJIS(%08x, U+%04x): invalid pointer", dstAddrAddr, jis);373return 0;374}375DEBUG_LOG(Log::sceMisc, "sceCccEncodeSJIS(%08x, U+%04x)", dstAddrAddr, jis);376*dstp += ShiftJIS::encode(*dstp, jis);377return dstp->ptr;378}379380static u32 sceCccDecodeUTF8(u32 dstAddrAddr)381{382auto dstp = PSPPointer<PSPConstCharPointer>::Create(dstAddrAddr);383384if (!dstp.IsValid() || !dstp->IsValid()) {385ERROR_LOG(Log::sceMisc, "sceCccDecodeUTF8(%08x): invalid pointer", dstAddrAddr);386// Should crash?387return 0;388}389390DEBUG_LOG(Log::sceMisc, "sceCccDecodeUTF8(%08x)", dstAddrAddr);391UTF8 utf(*dstp);392u32 result = utf.next();393*dstp += utf.byteIndex();394395if (result == UTF8::INVALID)396return errorUTF8;397return result;398}399400static u32 sceCccDecodeUTF16(u32 dstAddrAddr)401{402auto dstp = PSPPointer<PSPConstWCharPointer>::Create(dstAddrAddr);403404if (!dstp.IsValid() || !dstp->IsValid()) {405ERROR_LOG(Log::sceMisc, "sceCccDecodeUTF16(%08x): invalid pointer", dstAddrAddr);406// Should crash?407return 0;408}409410DEBUG_LOG(Log::sceMisc, "sceCccDecodeUTF16(%08x)", dstAddrAddr);411// TODO: Does it do any detection of BOM?412UTF16LE utf(*dstp);413u32 result = utf.next();414*dstp += utf.shortIndex();415416if (result == UTF16LE::INVALID)417return errorUTF16;418return result;419}420421static u32 sceCccDecodeSJIS(u32 dstAddrAddr)422{423auto dstp = PSPPointer<PSPConstCharPointer>::Create(dstAddrAddr);424425if (!dstp.IsValid() || !dstp->IsValid()) {426ERROR_LOG(Log::sceMisc, "sceCccDecodeSJIS(%08x): invalid pointer", dstAddrAddr);427// Should crash?428return 0;429}430431DEBUG_LOG(Log::sceMisc, "sceCccDecodeSJIS(%08x)", dstAddrAddr);432ShiftJIS sjis(*dstp);433u32 result = sjis.next();434*dstp += sjis.byteIndex();435436if (result == ShiftJIS::INVALID)437return errorSJIS;438return result;439}440441static int sceCccIsValidUTF8(u32 c)442{443WARN_LOG(Log::sceMisc, "UNIMPL sceCccIsValidUTF8(%08x)", c);444return c != 0;445}446447static int sceCccIsValidUTF16(u32 c)448{449WARN_LOG(Log::sceMisc, "UNIMPL sceCccIsValidUTF16(%08x)", c);450return c != 0;451}452453static int sceCccIsValidSJIS(u32 c)454{455WARN_LOG(Log::sceMisc, "UNIMPL sceCccIsValidSJIS(%08x)", c);456return c != 0;457}458459static int sceCccIsValidUCS2(u32 c)460{461WARN_LOG(Log::sceMisc, "UNIMPL sceCccIsValidUCS2(%08x)", c);462return c != 0;463}464465static int sceCccIsValidUCS4(u32 c)466{467WARN_LOG(Log::sceMisc, "UNIMPL sceCccIsValidUCS4(%08x)", c);468return c != 0;469}470471static int sceCccIsValidJIS(u32 c)472{473WARN_LOG(Log::sceMisc, "UNIMPL sceCccIsValidJIS(%08x)", c);474return c != 0;475}476477static int sceCccIsValidUnicode(u32 c)478{479WARN_LOG(Log::sceMisc, "UNIMPL sceCccIsValidUnicode(%08x)", c);480return c != 0;481}482483static u32 sceCccSetErrorCharUTF8(u32 c)484{485DEBUG_LOG(Log::sceMisc, "sceCccSetErrorCharUTF8(%08x)", c);486int result = errorUTF8;487errorUTF8 = c;488return result;489}490491static u32 sceCccSetErrorCharUTF16(u32 c)492{493DEBUG_LOG(Log::sceMisc, "sceCccSetErrorCharUTF16(%08x)", c);494int result = errorUTF16;495errorUTF16 = c;496return result;497}498499static u32 sceCccSetErrorCharSJIS(u32 c)500{501DEBUG_LOG(Log::sceMisc, "sceCccSetErrorCharSJIS(%04x)", c);502int result = errorSJIS;503errorSJIS = c;504return result;505}506507static u32 sceCccUCStoJIS(u32 c, u32 alt)508{509if (ucs2jisTable.IsValid())510{511DEBUG_LOG(Log::sceMisc, "sceCccUCStoJIS(%08x, %08x)", c, alt);512return __CccUCStoJIS(c, alt);513}514else515{516ERROR_LOG(Log::sceMisc, "sceCccUCStoJIS(%08x, %08x): table not loaded", c, alt);517return alt;518}519}520521static u32 sceCccJIStoUCS(u32 c, u32 alt)522{523if (jis2ucsTable.IsValid())524{525DEBUG_LOG(Log::sceMisc, "sceCccUCStoJIS(%08x, %08x)", c, alt);526return __CccJIStoUCS(c, alt);527}528else529{530ERROR_LOG(Log::sceMisc, "sceCccUCStoJIS(%08x, %08x): table not loaded", c, alt);531return alt;532}533}534535const HLEFunction sceCcc[] =536{537{0XB4D1CBBF, &WrapV_UU<sceCccSetTable>, "sceCccSetTable", 'v', "xx" },538{0X00D1378F, &WrapI_UUU<sceCccUTF8toUTF16>, "sceCccUTF8toUTF16", 'i', "xxx"},539{0X6F82EE03, &WrapI_UUU<sceCccUTF8toSJIS>, "sceCccUTF8toSJIS", 'i', "xxx"},540{0X41B724A5, &WrapI_UUU<sceCccUTF16toUTF8>, "sceCccUTF16toUTF8", 'i', "xxx"},541{0XF1B73D12, &WrapI_UUU<sceCccUTF16toSJIS>, "sceCccUTF16toSJIS", 'i', "xxx"},542{0XA62E6E80, &WrapI_UUU<sceCccSJIStoUTF8>, "sceCccSJIStoUTF8", 'i', "xxx"},543{0XBEB47224, &WrapI_UUU<sceCccSJIStoUTF16>, "sceCccSJIStoUTF16", 'i', "xxx"},544{0XB7D3C112, &WrapI_U<sceCccStrlenUTF8>, "sceCccStrlenUTF8", 'i', "x" },545{0X4BDEB2A8, &WrapI_U<sceCccStrlenUTF16>, "sceCccStrlenUTF16", 'i', "x" },546{0XD9392CCB, &WrapI_U<sceCccStrlenSJIS>, "sceCccStrlenSJIS", 'i', "x" },547{0X92C05851, &WrapU_UU<sceCccEncodeUTF8>, "sceCccEncodeUTF8", 'x', "xx" },548{0X8406F469, &WrapV_UU<sceCccEncodeUTF16>, "sceCccEncodeUTF16", 'v', "xx" },549{0X068C4320, &WrapU_UU<sceCccEncodeSJIS>, "sceCccEncodeSJIS", 'x', "xx" },550{0XC6A8BEE2, &WrapU_U<sceCccDecodeUTF8>, "sceCccDecodeUTF8", 'x', "x" },551{0XE0CF8091, &WrapU_U<sceCccDecodeUTF16>, "sceCccDecodeUTF16", 'x', "x" },552{0X953E6C10, &WrapU_U<sceCccDecodeSJIS>, "sceCccDecodeSJIS", 'x', "x" },553{0X90521AC5, &WrapI_U<sceCccIsValidUTF8>, "sceCccIsValidUTF8", 'i', "x" },554{0XCC0A8BDA, &WrapI_U<sceCccIsValidUTF16>, "sceCccIsValidUTF16", 'i', "x" },555{0X67BF0D19, &WrapI_U<sceCccIsValidSJIS>, "sceCccIsValidSJIS", 'i', "x" },556{0X76E33E9C, &WrapI_U<sceCccIsValidUCS2>, "sceCccIsValidUCS2", 'i', "x" },557{0XD2B18485, &WrapI_U<sceCccIsValidUCS4>, "sceCccIsValidUCS4", 'i', "x" },558{0XA2D5D209, &WrapI_U<sceCccIsValidJIS>, "sceCccIsValidJIS", 'i', "x" },559{0XBD11EEF3, &WrapI_U<sceCccIsValidUnicode>, "sceCccIsValidUnicode", 'i', "x" },560{0X17E1D813, &WrapU_U<sceCccSetErrorCharUTF8>, "sceCccSetErrorCharUTF8", 'x', "x" },561{0XB8476CF4, &WrapU_U<sceCccSetErrorCharUTF16>, "sceCccSetErrorCharUTF16", 'x', "x" },562{0XC56949AD, &WrapU_U<sceCccSetErrorCharSJIS>, "sceCccSetErrorCharSJIS", 'x', "x" },563{0X70ECAA10, &WrapU_UU<sceCccUCStoJIS>, "sceCccUCStoJIS", 'x', "xx" },564{0XFB7846E2, &WrapU_UU<sceCccJIStoUCS>, "sceCccJIStoUCS", 'x', "xx" },565};566567void Register_sceCcc()568{569RegisterModule("sceCcc", ARRAY_SIZE(sceCcc), sceCcc);570}571572573