diff --git a/src/xenia/emulator.cc b/src/xenia/emulator.cc index 1fc04e34b..c323273c5 100644 --- a/src/xenia/emulator.cc +++ b/src/xenia/emulator.cc @@ -534,7 +534,14 @@ X_STATUS Emulator::LaunchXexFile(const std::filesystem::path& path) { // Launch the game. auto fs_path = "game:\\" + xe::path_to_utf8(file_name); X_STATUS result = CompleteLaunch(path, fs_path); - kernel_state_->deployment_type_ = XDeploymentType::kHardDrive; + + if (XSUCCEEDED(result)) { + kernel_state_->deployment_type_ = XDeploymentType::kHardDrive; + if (!kernel_state_->is_title_system_type(title_id())) { + // Assumption that any loaded game is loaded as a disc. + kernel_state_->deployment_type_ = XDeploymentType::kOpticalDisc; + } + } return result; } @@ -575,7 +582,14 @@ X_STATUS Emulator::LaunchDefaultModule(const std::filesystem::path& path) { cvars::launch_module = ""; std::string module_path = FindLaunchModule(); X_STATUS result = CompleteLaunch(path, module_path); - kernel_state_->deployment_type_ = XDeploymentType::kHardDrive; + + if (XSUCCEEDED(result)) { + kernel_state_->deployment_type_ = XDeploymentType::kHardDrive; + if (!kernel_state_->is_title_system_type(title_id())) { + // Assumption that any loaded game is loaded as a disc. + kernel_state_->deployment_type_ = XDeploymentType::kOpticalDisc; + } + } return result; } diff --git a/src/xenia/kernel/kernel_state.cc b/src/xenia/kernel/kernel_state.cc index b5820ab2f..1f766ea65 100644 --- a/src/xenia/kernel/kernel_state.cc +++ b/src/xenia/kernel/kernel_state.cc @@ -129,6 +129,18 @@ uint32_t KernelState::title_id() const { return 0; } +bool KernelState::is_title_system_type(uint32_t title_id) { + if (!title_id) { + return true; + } + + if ((title_id & 0xFF000000) == 0x58000000u) { + return (title_id & 0xFF0000) != 0x410000; // if 'X' but not 'XA' (XBLA) + } + + return (title_id >> 16) == 0xFFFE; +} + util::XdbfGameData KernelState::title_xdbf() const { return module_xdbf(executable_module_); } diff --git a/src/xenia/kernel/kernel_state.h b/src/xenia/kernel/kernel_state.h index 370eae04d..587569f00 100644 --- a/src/xenia/kernel/kernel_state.h +++ b/src/xenia/kernel/kernel_state.h @@ -181,6 +181,7 @@ class KernelState { vfs::VirtualFileSystem* file_system() const { return file_system_; } uint32_t title_id() const; + static bool is_title_system_type(uint32_t title_id); util::XdbfGameData title_xdbf() const; util::XdbfGameData module_xdbf(object_ref exec_module) const;