diff --git a/src/xenia/kernel/xam/xam_state.cc b/src/xenia/kernel/xam/xam_state.cc index 80ab51460..2317e2e0d 100644 --- a/src/xenia/kernel/xam/xam_state.cc +++ b/src/xenia/kernel/xam/xam_state.cc @@ -31,6 +31,7 @@ XamState::XamState(Emulator* emulator, KernelState* kernel_state) achievement_manager_ = std::make_unique(); LoadLanguageLocaleFallback(); + LoadIptvServiceName(); AppManager::RegisterApps(kernel_state, app_manager_.get()); } @@ -60,6 +61,17 @@ void XamState::LoadLanguageLocaleFallback() { } } +void XamState::LoadIptvServiceName() { + constexpr uint32_t address = 0x80D10000; + + if (kernel_state_->memory() + ->LookupHeap(0x80000000) + ->AllocFixed(address, 0x78, 0x1000, kMemoryAllocationCommit, + kMemoryProtectRead | kMemoryProtectWrite)) { + iptv_name_address_ = address; + } +} + UserProfile* XamState::GetUserProfile(uint32_t user_index) const { if (user_index >= XUserMaxUserCount && user_index < XUserIndexLatest) { return nullptr; diff --git a/src/xenia/kernel/xam/xam_state.h b/src/xenia/kernel/xam/xam_state.h index f8f3daac9..f07122ca9 100644 --- a/src/xenia/kernel/xam/xam_state.h +++ b/src/xenia/kernel/xam/xam_state.h @@ -66,6 +66,8 @@ class XamState { return language_fallback_address_[index]; } + uint32_t GetIptvNameAddress() const { return iptv_name_address_; } + X_DASH_APP_INFO dash_app_info_ = {}; uint32_t dash_backstack_nodes_count_ = 0; X_DASH_BACKSTACK_DATA dash_backstack_data_[2] = {}; @@ -76,6 +78,7 @@ class XamState { private: void LoadLanguageLocaleFallback(); + void LoadIptvServiceName(); KernelState* kernel_state_; @@ -89,6 +92,7 @@ class XamState { // Custom XAM stuff std::array language_fallback_address_{}; + uint32_t iptv_name_address_{}; }; } // namespace xam diff --git a/src/xenia/kernel/xconfig.cc b/src/xenia/kernel/xconfig.cc index c623a7761..57cc50f95 100644 --- a/src/xenia/kernel/xconfig.cc +++ b/src/xenia/kernel/xconfig.cc @@ -14,6 +14,7 @@ #include "xenia/base/filesystem.h" #include "xenia/base/byte_order.h" +#include "xenia/base/string_util.h" #include "xenia/xbox.h" #include @@ -113,6 +114,10 @@ void XConfig::SetDefaults() { memcpy(xconfig_data_.user.tz_dlt_date.data(), tz.tz_dlt_date.data(), 4); xconfig_data_.user.tz_std_bias = tz.tz_std_bias; xconfig_data_.user.tz_dlt_bias = tz.tz_dlt_bias; + + xe::string_util::copy_and_swap_truncating( + xconfig_data_.iptv.service_provider_name.data(), u"Xenia TV", + xconfig_data_.iptv.service_provider_name.size()); } void XConfig::FlushToFile() { diff --git a/src/xenia/kernel/xconfig.h b/src/xenia/kernel/xconfig.h index 4df66451f..82b35e070 100644 --- a/src/xenia/kernel/xconfig.h +++ b/src/xenia/kernel/xconfig.h @@ -799,7 +799,7 @@ struct XConfigData { struct Iptv { xe::be checksum; // 0x000 xe::be version; // 0x004 - std::array service_provider_name; // 0x008 wchar + std::array service_provider_name; // 0x008 wchar std::array provisioning_server_url; // 0x080 wchar std::array support_info; // 0x100 wchar std::array bootstrap_server_url; // 0x180 wchar @@ -1033,6 +1033,10 @@ class XConfig { // XCONFIG_CONSOLE_PC_TITLE_EXEMPTIONS, // Console, keyboard_layout), + // -- XCONFIG_IPTV (0x7) -------------------------------------------- + XCONFIG_FIELD(XCONFIG_IPTV_CATEGORY, XCONFIG_IPTV_SERVICE_PROVIDER_NAME, + Iptv, service_provider_name), + // -- XCONFIG_SYSTEM (0xA) --------------------------------------------- XCONFIG_FIELD(XCONFIG_SYSTEM_CATEGORY, XCONFIG_SYSTEM_ALARM_TIME, System, alarm_time),