[Xam/Locale] - Sketchy Implementation of XamGetLanguageTypefacePatch

- Sketchy Implementation of XamGetLanguageTypefacePatch
This commit is contained in:
The-Little-Wolf
2026-07-07 11:36:46 -07:00
committed by Radosław Gliński
parent d119505289
commit d804cf828a
3 changed files with 54 additions and 3 deletions

View File

@@ -649,9 +649,10 @@ dword_result_t XamGetLanguageTypeface_entry(dword_t language,
DECLARE_XAM_EXPORT1(XamGetLanguageTypeface, kNone, kImplemented);
pointer_result_t XamGetLanguageTypefacePatch_entry(dword_t language) {
return 0;
assert_false(language >= static_cast<uint32_t>(XLanguage::kMaxLanguages));
return kernel_state()->xam_state()->GetLanguageTypefacePatch(language);
}
DECLARE_XAM_EXPORT1(XamGetLanguageTypefacePatch, kNone, kStub);
DECLARE_XAM_EXPORT1(XamGetLanguageTypefacePatch, kNone, kSketchy);
dword_result_t XamGetCountry_entry() {
return kernel_state()->xconfig()->ReadSetting<uint32_t>(

View File

@@ -31,6 +31,7 @@ XamState::XamState(Emulator* emulator, KernelState* kernel_state)
achievement_manager_ = std::make_unique<AchievementManager>();
LoadLanguageLocaleFallback();
LoadLanguageTypefacePatch();
LoadIptvServiceName();
AppManager::RegisterApps(kernel_state, app_manager_.get());
@@ -61,8 +62,53 @@ void XamState::LoadLanguageLocaleFallback() {
}
}
void XamState::LoadLanguageTypefacePatch() {
const std::array<std::u16string, 7> patch_data = {
u"",
u"file://media:/XenonSCLatin.xttp2",
u"file://media:/XenonCLatin.xttp2",
u"file://media:/XenonJKLatin.xttp2",
u"file://media:/XenonSCLatin.xttp1",
u"file://media:/XenonCLatin.xttp1",
u"file://media:/XenonJKLatin.xttp1"};
constexpr uint32_t array_start = 0x80D10000;
if (kernel_state_->memory()
->LookupHeap(0x80000000)
->AllocFixed(array_start, 0x168, 0x1000, kMemoryAllocationCommit,
kMemoryProtectRead | kMemoryProtectWrite)) {
char16_t* ptr =
kernel_state_->memory()->TranslateVirtual<char16_t*>(array_start);
for (size_t i = 1; i < patch_data.size(); i++) {
language_type_face_patch_[i] =
kernel_state_->memory()->HostToGuestVirtual(ptr);
ptr += xe::string_util::copy_and_swap_truncating(
ptr, patch_data.at(i), patch_data.at(i).size() + 1) +
1;
}
}
}
uint32_t XamState::GetLanguageTypefacePatch(uint32_t language) const {
// checks an out of bounds address to see if either a flag of 0x1000 or 0x2000
// is set. If first then use xttp1, if other use xttp2, else just return empty
// pointer. for now only usng xttp2
uint32_t index = 0;
if (language == 17) { // kSChinese
index = 1;
} else if (language == 8) { // kTChinese
index = 2;
} else {
index = 3;
}
return language_type_face_patch_[index];
}
void XamState::LoadIptvServiceName() {
constexpr uint32_t address = 0x80D10000;
constexpr uint32_t address = 0x80D20000;
if (kernel_state_->memory()
->LookupHeap(0x80000000)

View File

@@ -66,6 +66,8 @@ class XamState {
return language_fallback_address_[index];
}
uint32_t GetLanguageTypefacePatch(uint32_t language) const;
uint32_t GetIptvNameAddress() const { return iptv_name_address_; }
X_DASH_APP_INFO dash_app_info_ = {};
@@ -78,6 +80,7 @@ class XamState {
private:
void LoadLanguageLocaleFallback();
void LoadLanguageTypefacePatch();
void LoadIptvServiceName();
KernelState* kernel_state_;
@@ -92,6 +95,7 @@ class XamState {
// Custom XAM stuff
std::array<uint32_t, 0x12> language_fallback_address_{};
std::array<uint32_t, 0x7> language_type_face_patch_{};
uint32_t iptv_name_address_{};
};