mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-21 05:21:16 +01:00
fdfe57a49b
This implements MIOS's PPC bootstrapping functionality, which enables users to start a GameCube game from the Wii System Menu. Because we aren't doing Starlet LLE (and don't have a boot1), we can just jump to MIOS when the emulated software does an ES_LAUNCH or uses ioctlv 0x25 to launch BC. Note that the process is more complex on a real Wii and goes through several more steps before getting to MIOS: * The System Menu detects a GameCube disc and launches BC (1-100) instead of the game. [Dolphin does this too.] * BC, which is reportedly very similar to boot1, lowers the Hollywood clock speed to the Flipper's and then launches boot2. * boot2 sees the lowered clock speed and launches MIOS (1-101) instead of the System Menu. MIOS runs instead of IOS in GC mode and has an embedded GC IPL (which is the code actually responsible for loading the disc game) and a PPC bootstrap code. To get things working properly, we simply need to load both to memory, then jump to the bootstrap code at 0x3400. Obviously, because of the way this works, a real MIOS is required.
57 lines
1.2 KiB
C++
57 lines
1.2 KiB
C++
// Copyright 2008 Dolphin Emulator Project
|
|
// Licensed under GPLv2+
|
|
// Refer to the license.txt file included.
|
|
|
|
#pragma once
|
|
|
|
#include "Common/CommonTypes.h"
|
|
|
|
namespace SystemTimers
|
|
{
|
|
/*
|
|
GameCube MHz
|
|
flipper <-> ARAM bus: 81 (DSP)
|
|
gekko <-> flipper bus: 162
|
|
flipper <-> 1T-SRAM bus: 324
|
|
gekko: 486
|
|
|
|
These contain some guesses:
|
|
Wii MHz
|
|
hollywood <-> GDDR3 RAM bus: ??? no idea really
|
|
broadway <-> hollywood bus: 243
|
|
hollywood <-> 1T-SRAM bus: 486
|
|
broadway: 729
|
|
*/
|
|
// Ratio of TB and Decrementer to clock cycles.
|
|
// TB clk is 1/4 of BUS clk. And it seems BUS clk is really 1/3 of CPU clk.
|
|
// So, ratio is 1 / (1/4 * 1/3 = 1/12) = 12.
|
|
// note: ZWW is ok and faster with TIMER_RATIO=8 though.
|
|
// !!! POSSIBLE STABLE PERF BOOST HACK THERE !!!
|
|
|
|
enum
|
|
{
|
|
TIMER_RATIO = 12
|
|
};
|
|
|
|
enum class Mode
|
|
{
|
|
GC,
|
|
Wii,
|
|
};
|
|
|
|
u32 GetTicksPerSecond();
|
|
void PreInit();
|
|
void Init();
|
|
void Shutdown();
|
|
void ChangePPCClock(Mode mode);
|
|
|
|
// Notify timing system that somebody wrote to the decrementer
|
|
void DecrementerSet();
|
|
u32 GetFakeDecrementer();
|
|
|
|
void TimeBaseSet();
|
|
u64 GetFakeTimeBase();
|
|
// Custom RTC
|
|
s64 GetLocalTimeRTCOffset();
|
|
}
|