mirror of
https://github.com/DarkStore-3DS/Project_CTR.git
synced 2026-07-04 08:49:03 +00:00
Fixed handling of writable region calculation
This commit is contained in:
+15
-8
@@ -425,7 +425,8 @@ u64 GetUnusedSize(u64 MediaSize, u8 CardType)
|
|||||||
case (u64)GB*2: return (u64)147324928;
|
case (u64)GB*2: return (u64)147324928;
|
||||||
case (u64)GB*4: return (u64)294649856;
|
case (u64)GB*4: return (u64)294649856;
|
||||||
case (u64)GB*8: return (u64)587202560;
|
case (u64)GB*8: return (u64)587202560;
|
||||||
default: return (u64)((MediaSize/MB)*0x11800); // Aprox
|
//default: return (u64)((MediaSize/MB)*0x11800); // Aprox
|
||||||
|
default: return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(CardType == CARD2){
|
else if(CardType == CARD2){
|
||||||
@@ -435,7 +436,8 @@ u64 GetUnusedSize(u64 MediaSize, u8 CardType)
|
|||||||
case (u64)GB*2: return (u64)147324928;
|
case (u64)GB*2: return (u64)147324928;
|
||||||
case (u64)GB*4: return (u64)294649856;
|
case (u64)GB*4: return (u64)294649856;
|
||||||
case (u64)GB*8: return (u64)587202560;
|
case (u64)GB*8: return (u64)587202560;
|
||||||
default: return (u64)((MediaSize/MB)*0x11800); // Aprox
|
//default: return (u64)((MediaSize/MB)*0x11800); // Aprox
|
||||||
|
default: return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@@ -512,10 +514,10 @@ int GetNCSDFlags(cci_settings *cciset, rsf_settings *yaml)
|
|||||||
|
|
||||||
int GetWriteableAddress(cci_settings *cciset, user_settings *usrset)
|
int GetWriteableAddress(cci_settings *cciset, user_settings *usrset)
|
||||||
{
|
{
|
||||||
int result = GetSaveDataSizeFromString(&cciset->option.savedataSize,usrset->common.rsfSet.SystemControlInfo.SaveDataSize,"NCSD");
|
int result = GetSaveDataSizeFromString(&cciset->option.savedataSize,usrset->common.rsfSet.SystemControlInfo.SaveDataSize,"CCI");
|
||||||
if(result) return result;
|
if(result) return result;
|
||||||
|
|
||||||
char *WriteableAddressStr = usrset->common.rsfSet.CardInfo.WritableAddress;;
|
char *WriteableAddressStr = usrset->common.rsfSet.CardInfo.WritableAddress;
|
||||||
|
|
||||||
cciset->cardinfo.writableAddress = -1;
|
cciset->cardinfo.writableAddress = -1;
|
||||||
if(cciset->header.flags[MediaTypeIndex] != CARD2) return 0; // Can only be set for Card2 Media
|
if(cciset->header.flags[MediaTypeIndex] != CARD2) return 0; // Can only be set for Card2 Media
|
||||||
@@ -525,7 +527,7 @@ int GetWriteableAddress(cci_settings *cciset, user_settings *usrset)
|
|||||||
fprintf(stderr,"[CCI ERROR] WritableAddress requires a Hexadecimal value\n");
|
fprintf(stderr,"[CCI ERROR] WritableAddress requires a Hexadecimal value\n");
|
||||||
return INVALID_YAML_OPT;
|
return INVALID_YAML_OPT;
|
||||||
}
|
}
|
||||||
cciset->cardinfo.writableAddress = strtoull((WriteableAddressStr+2),NULL,16);
|
cciset->cardinfo.writableAddress = strtoull(WriteableAddressStr,NULL,16);
|
||||||
}
|
}
|
||||||
if(cciset->cardinfo.writableAddress == -1){ // If not set manually or is max size
|
if(cciset->cardinfo.writableAddress == -1){ // If not set manually or is max size
|
||||||
if ((cciset->header.mediaSize / 2) < cciset->option.savedataSize){ // If SaveData size is greater than half the MediaSize
|
if ((cciset->header.mediaSize / 2) < cciset->option.savedataSize){ // If SaveData size is greater than half the MediaSize
|
||||||
@@ -539,10 +541,15 @@ int GetWriteableAddress(cci_settings *cciset, user_settings *usrset)
|
|||||||
return SAVE_DATA_TOO_LARGE;
|
return SAVE_DATA_TOO_LARGE;
|
||||||
}
|
}
|
||||||
if(usrset->cci.closeAlignWritableRegion)
|
if(usrset->cci.closeAlignWritableRegion)
|
||||||
cciset->cardinfo.writableAddress = align(cciset->cardinfo.cciTotalSize, cciset->option.mediaUnit);
|
cciset->cardinfo.writableAddress = align(cciset->cardinfo.cciTotalSize, cciset->option.mediaUnit); // invalid for "real" chips
|
||||||
else{
|
else{
|
||||||
u64 UnusedSize = GetUnusedSize(cciset->header.mediaSize,cciset->header.flags[MediaTypeIndex]); // Need to look into this
|
u64 UnusedSize = GetUnusedSize(cciset->header.mediaSize,cciset->header.flags[MediaTypeIndex]); // Some value related to the physical implementation of gamecards
|
||||||
cciset->cardinfo.writableAddress = cciset->header.mediaSize - UnusedSize - cciset->option.savedataSize;
|
if(UnusedSize > 0)
|
||||||
|
cciset->cardinfo.writableAddress = cciset->header.mediaSize - UnusedSize - cciset->option.savedataSize; // Nintendo's method for calculating writable region offset
|
||||||
|
else{
|
||||||
|
fprintf(stderr,"[CCI WARNING] Nintendo has no CARD2 writable region configurations for this media size, writable region will be aligned to last ncch partition\n");
|
||||||
|
cciset->cardinfo.writableAddress = align(cciset->cardinfo.cciTotalSize, cciset->option.mediaUnit); // invalid for "real" chips
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user