IOS: boot original BootMii through MINI

This commit is contained in:
2026-08-25 19:46:28 +02:00
parent 08c9886169
commit 5387658e0c
6 changed files with 194 additions and 10 deletions
@@ -178,6 +178,41 @@ TEST(StarletTimer, ZeroDelayAlarmMatchesImmediatelyAndUsesIRQW1C)
EXPECT_EQ(system.GetWiiIPC().ReadStarletRegister(0x38) & INT_CAUSE_TIMER, INT_CAUSE_TIMER);
}
TEST(StarletGPIO, InterruptFlagIsWriteOneToClear)
{
constexpr u32 hardware_base = 0x0d800000;
constexpr u32 gpio_interrupt_level = hardware_base + 0xec;
constexpr u32 gpio_interrupt_flag = hardware_base + 0xf0;
constexpr u32 gpio_interrupt_mask = hardware_base + 0xf4;
constexpr u32 gpio_owner = hardware_base + 0xfc;
constexpr u32 power = 1;
Core::DeclareAsCPUThread();
auto& system = Core::System::GetInstance();
system.GetWiiIPC().Reset();
StarletMemory memory(system);
memory.Reset();
const auto read_word = [&memory](u32 address) {
return static_cast<u32>(memory.Read8(address)) << 24 |
static_cast<u32>(memory.Read8(address + 1)) << 16 |
static_cast<u32>(memory.Read8(address + 2)) << 8 | memory.Read8(address + 3);
};
const auto write_word = [&memory](u32 address, u32 value) {
memory.Write8(address, static_cast<u8>(value >> 24));
memory.Write8(address + 1, static_cast<u8>(value >> 16));
memory.Write8(address + 2, static_cast<u8>(value >> 8));
memory.Write8(address + 3, static_cast<u8>(value));
};
// BootMii selects POWER as active-high, waits, then clears the pending flag.
// With the emulated front-panel button idle-low this must read back cleared.
write_word(gpio_interrupt_level, power);
write_word(gpio_interrupt_mask, power);
write_word(gpio_owner, 0);
write_word(gpio_interrupt_flag, power);
EXPECT_EQ(read_word(gpio_interrupt_flag), 0u);
EXPECT_EQ(system.GetWiiIPC().ReadStarletRegister(0x38) & INT_CAUSE_GPIO_STARLET, 0u);
}
TEST(StarletAHBPROT, OriginalIOSMaskIsPreservedForBroadway)
{
constexpr u32 ahbprot = 0x0d800064;