diff --git a/docs/user/CFW.md b/docs/user/CFW.md index ea224d3d36..8f37672eb1 100644 --- a/docs/user/CFW.md +++ b/docs/user/CFW.md @@ -9,3 +9,11 @@ At the moment of writing, we do not support CFW such as Atmosphere, due to: We do however, maintain HLE compatibility with the former mentioned CFW, applications that require Atmosphere to run will run fine in the emulator without any adjustments. If they don't run - then that's a bug! + +## Atmosphere + +Fusee Galee, the bootloader and other low-level mechanisms are not emulated at the moment. + +Having OFW is recommended, but may not be required (untested). + +Extract the contents of Atmosphere into `sdmc`. Then to launch simply use `-hlaunch` instead (orthogonal to `-qlaunch`). diff --git a/docs/user/CommandLine.md b/docs/user/CommandLine.md index 41f8d3d711..6e1f0f237c 100644 --- a/docs/user/CommandLine.md +++ b/docs/user/CommandLine.md @@ -10,6 +10,9 @@ There are two main applications, an SDL-based app (`eden-cli`) and a Qt based ap - `-u `: Select the index of the user to load as. - `-input-profile `: Specifies input profile name to use (for player #0 only). - `-qlaunch`: Launch QLaunch. +- `-hlaunch`: Launch homebrew launcher `nx-hbloader`. + - Requires a copy of Atmosphere to be extracted onto `sdmc`. + - This is a shorthand for `/sdmc/atmosphere/hbl.nsp`. - `-setup`: Launch setup applet. ## eden-cli diff --git a/src/core/hle/kernel/k_capabilities.cpp b/src/core/hle/kernel/k_capabilities.cpp index d2288c30d1..90f41dd1fc 100644 --- a/src/core/hle/kernel/k_capabilities.cpp +++ b/src/core/hle/kernel/k_capabilities.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -268,7 +271,8 @@ Result KCapabilities::SetHandleTableCapability(const u32 cap) { Result KCapabilities::SetDebugFlagsCapability(const u32 cap) { // Validate. const DebugFlags pack{cap}; - R_UNLESS(pack.reserved == 0, ResultReservedUsed); + // TODO: Enabling this breaks compatibility with HBloader and such + //R_UNLESS(pack.reserved == 0, ResultReservedUsed); DebugFlags debug_capabilities{m_debug_capabilities}; debug_capabilities.allow_debug.Assign(pack.allow_debug); diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index 2bb83fa189..a43a06cd31 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -3,6 +3,7 @@ // Qt on macOS doesn't define VMA shit #include +#include "common/fs/path_util.h" #include "common/settings.h" #include "common/settings_enums.h" #include "frontend_common/settings_generator.h" @@ -635,6 +636,7 @@ MainWindow::MainWindow(bool has_broken_vulkan) QString game_path; bool should_launch_qlaunch = false; + bool should_launch_hlaunch = false; bool should_launch_setup = false; bool has_gamepath = false; bool is_fullscreen = false; @@ -676,6 +678,8 @@ MainWindow::MainWindow(bool has_broken_vulkan) players[0].profile_name = args[++i].toStdString(); } else if (args[i] == QStringLiteral("-qlaunch")) { should_launch_qlaunch = true; + } else if (args[i] == QStringLiteral("-hlaunch")) { + should_launch_hlaunch = true; } else if (args[i] == QStringLiteral("-setup")) { should_launch_setup = true; } else { @@ -694,10 +698,12 @@ MainWindow::MainWindow(bool has_broken_vulkan) } else { if (!game_path.isEmpty()) { BootGame(game_path, ApplicationAppletParameters()); - } else { - if (should_launch_qlaunch) { - LaunchFirmwareApplet(u64(Service::AM::AppletProgramId::QLaunch), std::nullopt); - } + } else if (should_launch_qlaunch) { + LaunchFirmwareApplet(u64(Service::AM::AppletProgramId::QLaunch), std::nullopt); + } else if (should_launch_hlaunch) { + std::filesystem::path const sd_dir = Common::FS::GetEdenPathString(Common::FS::EdenPath::SDMCDir); + auto const hbl_path = (sd_dir / "atmosphere" / "hbl.nsp").string(); + BootGame(QString::fromStdString(hbl_path), ApplicationAppletParameters()); } } }