diff --git a/src/xenia/emulator.cc b/src/xenia/emulator.cc index 1b2695e98..3ad0c6958 100644 --- a/src/xenia/emulator.cc +++ b/src/xenia/emulator.cc @@ -589,6 +589,7 @@ X_STATUS Emulator::LaunchXexFile(const std::filesystem::path& path) { file_system_->RegisterSymbolicLink("font:", mount_path); auto module = kernel_state_->LoadUserModule("xam.xex"); + if (!module) { module = kernel_state_->LoadUserModule("$flash_xam.xex"); } @@ -596,6 +597,7 @@ X_STATUS Emulator::LaunchXexFile(const std::filesystem::path& path) { if (module) { result = kernel_state_->FinishLoadingUserModule(module, false); } + return result; } diff --git a/src/xenia/kernel/user_module.cc b/src/xenia/kernel/user_module.cc index f9ec20cb4..2020e987c 100644 --- a/src/xenia/kernel/user_module.cc +++ b/src/xenia/kernel/user_module.cc @@ -35,6 +35,22 @@ uint32_t UserModule::title_id() const { return 0; } +std::string UserModule::bounding_filename() const { + std::string bounding_filename = ""; + + if (module_format_ != kModuleFormatXex) { + return bounding_filename; + } + + xex2_opt_bound_path* bounding_path = nullptr; + if (xex_module()->GetOptHeader(XEX_HEADER_BOUNDING_PATH, &bounding_path)) { + bounding_filename = + utf8::find_base_name_from_guest_path(std::string(bounding_path->path)); + } + + return bounding_filename; +} + uint32_t UserModule::disc_number() const { if (module_format_ != kModuleFormatXex) { return 1; diff --git a/src/xenia/kernel/user_module.h b/src/xenia/kernel/user_module.h index 85d7e0864..f89e8f9b3 100644 --- a/src/xenia/kernel/user_module.h +++ b/src/xenia/kernel/user_module.h @@ -61,6 +61,7 @@ class UserModule : public XModule { uint32_t guest_xex_header() const { return guest_xex_header_; } // The title ID in the xex header or 0 if this is not a xex. uint32_t title_id() const; + std::string bounding_filename() const; uint32_t disc_number() const; bool is_multi_disc_title() const; @@ -68,7 +69,7 @@ class UserModule : public XModule { bool is_dll_module() const { return is_dll_module_; } bool is_attached() const { // Special case for skipping real XAM initialization as it will fail. - if (name_ == "xam" || name_ == "$flash_xam") { + if (bounding_filename() == "xam") { return true; } return is_attached_;