Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d7bdf3fc19 | ||
|
|
c4e5f4410c | ||
|
|
f5039dca56 | ||
|
|
de6f9789cb | ||
|
|
4376a1093f | ||
|
|
a413ed01f3 | ||
|
|
05bb831321 | ||
|
|
6e0f1e5235 |
@@ -77,19 +77,39 @@ static void loadCustomVerString(u16 *out, u32 *verStringSize)
|
|||||||
{
|
{
|
||||||
u64 fileSize;
|
u64 fileSize;
|
||||||
|
|
||||||
if(R_SUCCEEDED(IFile_GetSize(&file, &fileSize)) && fileSize <= 19)
|
if(R_SUCCEEDED(IFile_GetSize(&file, &fileSize)) && fileSize <= 60)
|
||||||
{
|
{
|
||||||
u8 buf[19];
|
u8 buf[fileSize];
|
||||||
u64 total;
|
u64 total;
|
||||||
|
|
||||||
if(R_SUCCEEDED(IFile_Read(&file, &total, buf, fileSize)))
|
if(R_SUCCEEDED(IFile_Read(&file, &total, buf, fileSize)))
|
||||||
{
|
{
|
||||||
*verStringSize = (u32)fileSize;
|
static const u8 bom[] = {0xEF, 0xBB, 0xBF};
|
||||||
|
u32 finalSize = 0;
|
||||||
|
|
||||||
for(u32 i = 0; i < *verStringSize; i++)
|
//Convert from UTF-8 to UTF-16 (Nintendo doesn't support 4-byte UTF-16, so 4-byte UTF-8 is unsupported)
|
||||||
((u8 *)out)[2 * i] = buf[i];
|
for(u32 increase, fileSizeTmp = (u32)fileSize, i = (fileSizeTmp > 2 && memcmp(buf, bom, 3) == 0) ? 3 : 0;
|
||||||
|
i < fileSizeTmp && finalSize < 19; i += increase, finalSize++)
|
||||||
|
{
|
||||||
|
if((buf[i] & 0x80) == 0)
|
||||||
|
{
|
||||||
|
increase = 1;
|
||||||
|
out[finalSize] = (u16)buf[i];
|
||||||
|
}
|
||||||
|
else if((buf[i] & 0xE0) == 0xC0 && i + 1 < fileSizeTmp && (buf[i + 1] & 0xC0) == 0x80)
|
||||||
|
{
|
||||||
|
increase = 2;
|
||||||
|
out[finalSize] = (u16)(((buf[i] & 0x1F) << 6) | (buf[i + 1] & 0x3F));
|
||||||
|
}
|
||||||
|
else if((buf[i] & 0xF0) == 0xE0 && i + 2 < fileSizeTmp && (buf[i + 1] & 0xC0) == 0x80 && (buf[i + 2] & 0xC0) == 0x80)
|
||||||
|
{
|
||||||
|
increase = 3;
|
||||||
|
out[finalSize] = (u16)(((buf[i] & 0xF) << 12) | ((buf[i + 1] & 0x3F) << 6) | (buf[i + 2] & 0x3F));
|
||||||
|
}
|
||||||
|
else break;
|
||||||
|
}
|
||||||
|
|
||||||
*verStringSize *= 2;
|
if(finalSize > 0) *verStringSize = finalSize * 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,7 +172,7 @@ static void loadTitleLocaleConfig(u64 progId, u8 *regionId, u8 *languageId)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(u32 i = 0; i < 12; i++)
|
for(u32 i = 0; i < 12; i++)
|
||||||
{
|
{
|
||||||
static const char *languages[] = {"JP", "EN", "FR", "DE", "IT", "ES", "ZH", "KO", "NL", "PT", "RU", "TW"};
|
static const char *languages[] = {"JP", "EN", "FR", "DE", "IT", "ES", "ZH", "KO", "NL", "PT", "RU", "TW"};
|
||||||
@@ -378,12 +398,12 @@ void patchCode(u64 progId, u8 *code, u32 size)
|
|||||||
{
|
{
|
||||||
static const u16 verPattern[] = u"Ver.";
|
static const u16 verPattern[] = u"Ver.";
|
||||||
static u16 *verString;
|
static u16 *verString;
|
||||||
u32 verStringSize;
|
u32 verStringSize = 0;
|
||||||
|
|
||||||
u16 customVerString[19] = {0};
|
u16 customVerString[19];
|
||||||
loadCustomVerString(customVerString, &verStringSize);
|
loadCustomVerString(customVerString, &verStringSize);
|
||||||
|
|
||||||
if(customVerString[0] != 0) verString = customVerString;
|
if(verStringSize != 0) verString = customVerString;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
verStringSize = 8;
|
verStringSize = 8;
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ void main(void)
|
|||||||
|
|
||||||
/* If L and R/A/Select or one of the single payload buttons are pressed,
|
/* If L and R/A/Select or one of the single payload buttons are pressed,
|
||||||
chainload an external payload */
|
chainload an external payload */
|
||||||
bool shouldLoadPayload = ((pressed & SINGLE_PAYLOAD_BUTTONS) && !(pressed & (BUTTON_L1 | BUTTON_R1))) ||
|
bool shouldLoadPayload = ((pressed & SINGLE_PAYLOAD_BUTTONS) && !(pressed & (BUTTON_L1 | BUTTON_R1 | BUTTON_A))) ||
|
||||||
((pressed & L_PAYLOAD_BUTTONS) && (pressed & BUTTON_L1));
|
((pressed & L_PAYLOAD_BUTTONS) && (pressed & BUTTON_L1));
|
||||||
|
|
||||||
if(shouldLoadPayload) loadPayload(pressed);
|
if(shouldLoadPayload) loadPayload(pressed);
|
||||||
|
|||||||
@@ -169,7 +169,7 @@ u32 firmRead(void *dest, u32 firmType)
|
|||||||
while(f_readdir(&dir, &info) == FR_OK && info.fname[0])
|
while(f_readdir(&dir, &info) == FR_OK && info.fname[0])
|
||||||
{
|
{
|
||||||
//Not a cxi
|
//Not a cxi
|
||||||
if(info.altname[9] != 'A') continue;
|
if(info.fname[9] != 'a') continue;
|
||||||
|
|
||||||
//Convert the .app name to an integer
|
//Convert the .app name to an integer
|
||||||
u32 tempVersion = 0;
|
u32 tempVersion = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user