// Copyright 2026 Dolphin Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include "Core/Core.h" #include "Core/HW/WII_IPC.h" #include "Core/System.h" namespace IOS { namespace { constexpr u32 PPCCTRL = 0x04; constexpr u32 ARMCTRL = 0x0c; constexpr u32 ARM_IRQMASK = 0x3c; constexpr u32 IX1 = 0x10; constexpr u32 X1 = 0x01; WiiIPC& Fresh(bool attached) { Core::DeclareAsCPUThread(); auto& ipc = Core::System::GetInstance().GetWiiIPC(); ipc.Reset(); ipc.SetStarletAttached(attached); ipc.WriteStarletRegister(ARM_IRQMASK, INT_CAUSE_IPC_STARLET); return ipc; } TEST(StarletProbeInterrupt, WithoutTheFlagX1NeverReachesTheStarlet) { // master's behaviour, with no Starlet object in the system. auto& ipc = Fresh(false); ipc.WriteStarletRegister(ARMCTRL, IX1); ipc.WriteStarletRegister(PPCCTRL, X1); EXPECT_FALSE(ipc.IsStarletIRQAsserted()); } TEST(StarletProbeInterrupt, WithTheFlagTheModelRaisesItOnX1AndIX1) { auto& ipc = Fresh(true); ipc.WriteStarletRegister(ARMCTRL, IX1); EXPECT_FALSE(ipc.IsStarletIRQAsserted()); ipc.WriteStarletRegister(PPCCTRL, X1); EXPECT_TRUE(ipc.IsStarletIRQAsserted()); } TEST(StarletProbeInterrupt, WithoutIX1TheCauseWaitsForIt) { auto& ipc = Fresh(true); ipc.WriteStarletRegister(PPCCTRL, X1); EXPECT_FALSE(ipc.IsStarletIRQAsserted()); // The same model line, on the Starlet's first ARMCTRL write. ipc.WriteStarletRegister(ARMCTRL, IX1); EXPECT_TRUE(ipc.IsStarletIRQAsserted()); } TEST(StarletProbeInterrupt, ResetClearsTheFlag) { auto& ipc = Fresh(true); ipc.Reset(); ipc.WriteStarletRegister(ARM_IRQMASK, INT_CAUSE_IPC_STARLET); ipc.WriteStarletRegister(ARMCTRL, IX1); ipc.WriteStarletRegister(PPCCTRL, X1); EXPECT_FALSE(ipc.IsStarletIRQAsserted()); } } // namespace } // namespace IOS