mirror of
https://github.com/izzy2lost/dolphin.git
synced 2026-06-19 01:16:48 -07:00
Added Triforce support
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
# GEYJ6E - Virtua Striker 2002 (Japan)
|
||||
|
||||
[Core]
|
||||
FPRF = True
|
||||
@@ -0,0 +1,4 @@
|
||||
# GEYP6E - Virtua Striker 2002 (Export, Type3)
|
||||
|
||||
[Core]
|
||||
FPRF = True
|
||||
@@ -0,0 +1,5 @@
|
||||
# GGGE6E - F-ZERO AX
|
||||
|
||||
[Core]
|
||||
FPRF = True
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
# GHAE6E - F-ZERO AX (Monster)
|
||||
|
||||
[Core]
|
||||
FPRF = True
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
# GHZW6E - VIRTUA STRIKER 4 (Asia)
|
||||
|
||||
[Core]
|
||||
FPRF = True
|
||||
@@ -0,0 +1,4 @@
|
||||
# GJAP6E - VIRTUA STRIKER 4 (Export)
|
||||
|
||||
[Core]
|
||||
FPRF = True
|
||||
@@ -0,0 +1,4 @@
|
||||
# GLKJ6E - VIRTUA STRIKER 4 Ver.2006 (Japan)
|
||||
|
||||
[Core]
|
||||
FPRF = True
|
||||
@@ -0,0 +1,4 @@
|
||||
# GLLP6E - VIRTUA STRIKER 4 Ver.2006 (Export)
|
||||
|
||||
[Core]
|
||||
FPRF = True
|
||||
@@ -41,11 +41,13 @@
|
||||
#define USA_DIR "USA"
|
||||
#define JAP_DIR "JAP"
|
||||
#define JPN_DIR "JPN"
|
||||
#define DEV_DIR "DEV"
|
||||
|
||||
// Subdirs in the User dir returned by GetUserPath(D_USER_IDX)
|
||||
#define GC_USER_DIR "GC"
|
||||
#define GBA_USER_DIR "GBA"
|
||||
#define WII_USER_DIR "Wii"
|
||||
#define TRI_USER_DIR "Triforce"
|
||||
#define CONFIG_DIR "Config"
|
||||
#define GAMESETTINGS_DIR "GameSettings"
|
||||
#define MAPS_DIR "Maps"
|
||||
@@ -155,6 +157,7 @@
|
||||
// Subdirs in Sys
|
||||
#define GC_SYS_DIR "GC"
|
||||
#define WII_SYS_DIR "Wii"
|
||||
#define TRI_SYS_DIR "Triforce"
|
||||
|
||||
// Subdirs in Config
|
||||
#define GRAPHICSMOD_CONFIG_DIR "GraphicMods"
|
||||
|
||||
@@ -838,6 +838,7 @@ static void RebuildUserDirectories(unsigned int dir_index)
|
||||
case D_USER_IDX:
|
||||
s_user_paths[D_GCUSER_IDX] = s_user_paths[D_USER_IDX] + GC_USER_DIR DIR_SEP;
|
||||
s_user_paths[D_WIIROOT_IDX] = s_user_paths[D_USER_IDX] + WII_USER_DIR DIR_SEP;
|
||||
s_user_paths[D_TRIUSER_IDX] = s_user_paths[D_USER_IDX] + TRI_USER_DIR DIR_SEP;
|
||||
s_user_paths[D_CONFIG_IDX] = s_user_paths[D_USER_IDX] + CONFIG_DIR DIR_SEP;
|
||||
s_user_paths[D_GAMESETTINGS_IDX] = s_user_paths[D_USER_IDX] + GAMESETTINGS_DIR DIR_SEP;
|
||||
s_user_paths[D_MAPS_IDX] = s_user_paths[D_USER_IDX] + MAPS_DIR DIR_SEP;
|
||||
|
||||
@@ -26,7 +26,8 @@ enum
|
||||
{
|
||||
D_USER_IDX,
|
||||
D_GCUSER_IDX,
|
||||
D_WIIROOT_IDX, // always points to User/Wii or global user-configured directory
|
||||
D_WIIROOT_IDX, // always points to User/Wii or global user-configured directory
|
||||
D_TRIUSER_IDX,
|
||||
D_SESSION_WIIROOT_IDX, // may point to minimal temporary directory for determinism
|
||||
D_CONFIG_IDX, // global settings
|
||||
D_GAMESETTINGS_IDX, // user-specified settings which override both the global and the default
|
||||
|
||||
@@ -27,6 +27,8 @@ enum class LogType : int
|
||||
DSP_MAIL,
|
||||
DSPINTERFACE,
|
||||
DVDINTERFACE,
|
||||
AMMEDIABOARD,
|
||||
AMMEDIABOARD_NET,
|
||||
DYNA_REC,
|
||||
EXPANSIONINTERFACE,
|
||||
FILEMON,
|
||||
@@ -58,6 +60,9 @@ enum class LogType : int
|
||||
PROCESSORINTERFACE,
|
||||
POWERPC,
|
||||
SERIALINTERFACE,
|
||||
SERIALINTERFACE_AMBB,
|
||||
SERIALINTERFACE_CARD,
|
||||
SERIALINTERFACE_JVSIO,
|
||||
SP1,
|
||||
SYMBOLS,
|
||||
VIDEO,
|
||||
|
||||
@@ -111,6 +111,8 @@ LogManager::LogManager()
|
||||
m_log[LogType::DSP_MAIL] = {"DSPMails", "DSP Mails"};
|
||||
m_log[LogType::DSPINTERFACE] = {"DSP", "DSP Interface"};
|
||||
m_log[LogType::DVDINTERFACE] = {"DVD", "DVD Interface"};
|
||||
m_log[LogType::AMMEDIABOARD] = {"AMMB", "AMMB Interface"};
|
||||
m_log[LogType::AMMEDIABOARD_NET] = {"AMMB_NET", "AMMB - Network"};
|
||||
m_log[LogType::DYNA_REC] = {"JIT", "JIT Dynamic Recompiler"};
|
||||
m_log[LogType::EXPANSIONINTERFACE] = {"EXI", "Expansion Interface"};
|
||||
m_log[LogType::FILEMON] = {"FileMon", "File Monitor"};
|
||||
@@ -142,6 +144,9 @@ LogManager::LogManager()
|
||||
m_log[LogType::PROCESSORINTERFACE] = {"PI", "Processor Interface"};
|
||||
m_log[LogType::POWERPC] = {"PowerPC", "PowerPC IBM CPU"};
|
||||
m_log[LogType::SERIALINTERFACE] = {"SI", "Serial Interface"};
|
||||
m_log[LogType::SERIALINTERFACE_AMBB] = {"SI_AMBB", "AMBB Interface"};
|
||||
m_log[LogType::SERIALINTERFACE_CARD] = {"SI_CARD", "CARD Interface"};
|
||||
m_log[LogType::SERIALINTERFACE_JVSIO] = {"SI_JVS", "JVS-I/O"};
|
||||
m_log[LogType::SP1] = {"SP1", "Serial Port 1"};
|
||||
m_log[LogType::SYMBOLS] = {"SYMBOLS", "Symbols"};
|
||||
m_log[LogType::VIDEO] = {"Video", "Video Backend"};
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
#include "Core/ConfigManager.h"
|
||||
#include "Core/FifoPlayer/FifoPlayer.h"
|
||||
#include "Core/HLE/HLE.h"
|
||||
#include "Core/HW/DVD/AMMediaboard.h"
|
||||
#include "Core/HW/DVD/DVDInterface.h"
|
||||
#include "Core/HW/EXI/EXI_DeviceIPL.h"
|
||||
#include "Core/HW/Memmap.h"
|
||||
@@ -373,7 +374,8 @@ bool CBoot::Load_BS2(Core::System& system, const std::string& boot_rom_filename)
|
||||
constexpr u32 PAL_v1_0 = 0x4F319F43;
|
||||
// DOL-101(EUR) (PAL Revision 1.2)
|
||||
constexpr u32 PAL_v1_2 = 0xAD1B7F16;
|
||||
constexpr u32 Triforce = 0xD1883221; // The Triforce's special IPL
|
||||
// Triforce Arcade IPL (DEV Revision 1.0)
|
||||
constexpr u32 Triforce = 0xD1883221;
|
||||
|
||||
// Load the IPL ROM dump, limited to 2MiB which is the size of the official IPLs.
|
||||
constexpr size_t max_ipl_size = 2 * 1024 * 1024;
|
||||
@@ -407,6 +409,7 @@ bool CBoot::Load_BS2(Core::System& system, const std::string& boot_rom_filename)
|
||||
break;
|
||||
case Triforce:
|
||||
known_ipl = true;
|
||||
break;
|
||||
default:
|
||||
PanicAlertFmtT("The IPL file is not a known good dump. (CRC32: {0:x})", ipl_hash);
|
||||
break;
|
||||
@@ -457,6 +460,14 @@ bool CBoot::Load_BS2(Core::System& system, const std::string& boot_rom_filename)
|
||||
ppc_state.spr[SPR_DBAT3L] = 0xfff00001;
|
||||
SetupBAT(system, /*is_wii*/ false);
|
||||
|
||||
if (ipl_hash == Triforce)
|
||||
{
|
||||
HLE::Patch(system, 0x813048B8, "OSReport");
|
||||
HLE::Patch(system, 0x8130095C, "OSReport"); // Apploader
|
||||
|
||||
AMMediaboard::FirmwareMap(true);
|
||||
}
|
||||
|
||||
ppc_state.pc = 0x81200150;
|
||||
|
||||
system.GetPowerPC().MSRUpdated();
|
||||
@@ -490,6 +501,12 @@ bool CBoot::BootUp(Core::System& system, const Core::CPUThreadGuard& guard,
|
||||
{
|
||||
SConfig& config = SConfig::GetInstance();
|
||||
|
||||
// Triforce systems are region free and always must use the NTSC video mode
|
||||
if (system.IsTriforce())
|
||||
{
|
||||
config.m_region = DiscIO::Region::NTSC_J;
|
||||
}
|
||||
|
||||
// PAL Wii uses NTSC framerate and linecount in 60Hz modes
|
||||
system.GetVideoInterface().Preset(DiscIO::IsNTSC(config.m_region) ||
|
||||
(system.IsWii() && Config::Get(Config::SYSCONF_PAL60)));
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "Core/Core.h"
|
||||
#include "Core/Debugger/BranchWatch.h"
|
||||
#include "Core/HLE/HLE.h"
|
||||
#include "Core/HW/DVD/AMMediaboard.h"
|
||||
#include "Core/HW/DVD/DVDInterface.h"
|
||||
#include "Core/HW/EXI/EXI_DeviceIPL.h"
|
||||
#include "Core/HW/Memmap.h"
|
||||
@@ -228,12 +229,20 @@ bool CBoot::RunApploader(Core::System& system, const Core::CPUThreadGuard& guard
|
||||
ppc_state.pc = ppc_state.gpr[3];
|
||||
|
||||
branch_watch.SetRecordingActive(guard, resume_branch_watch);
|
||||
// Blank out session key (https://debugmo.de/2008/05/part-2-dumping-the-media-board/)
|
||||
if (volume.GetVolumeType() == DiscIO::Platform::Triforce)
|
||||
|
||||
if (system.IsTriforce())
|
||||
{
|
||||
auto& memory = system.GetMemory();
|
||||
const u32 disc_size = volume.GetDataSize();
|
||||
|
||||
memory.Memset(0, 0, 12);
|
||||
// Load game into RAM, like on the actual Triforce
|
||||
u8* dimm = AMMediaboard::InitDIMM(disc_size);
|
||||
|
||||
volume.Read(0, disc_size, dimm, DiscIO::PARTITION_NONE);
|
||||
|
||||
// Triforce disc register obfuscation
|
||||
AMMediaboard::InitKeys(memory.Read_U32(0), memory.Read_U32(4), memory.Read_U32(8));
|
||||
AMMediaboard::FirmwareMap(false);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@@ -181,6 +181,8 @@ add_library(core
|
||||
HW/DSPLLE/DSPSymbols.h
|
||||
HW/DVD/DVDInterface.cpp
|
||||
HW/DVD/DVDInterface.h
|
||||
HW/DVD/AMMediaboard.cpp
|
||||
HW/DVD/AMMediaboard.h
|
||||
HW/DVD/DVDMath.cpp
|
||||
HW/DVD/DVDMath.h
|
||||
HW/DVD/DVDThread.cpp
|
||||
@@ -274,6 +276,8 @@ add_library(core
|
||||
HW/SI/SI_DeviceGCSteeringWheel.h
|
||||
HW/SI/SI_DeviceKeyboard.cpp
|
||||
HW/SI/SI_DeviceKeyboard.h
|
||||
HW/SI/SI_DeviceAMBaseboard.cpp
|
||||
HW/SI/SI_DeviceAMBaseboard.h
|
||||
HW/SI/SI_DeviceNull.cpp
|
||||
HW/SI/SI_DeviceNull.h
|
||||
HW/SI/SI.cpp
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include "Common/Version.h"
|
||||
#include "Core/AchievementManager.h"
|
||||
#include "Core/Config/DefaultLocale.h"
|
||||
#include "Core/Core.h"
|
||||
#include "Core/HW/EXI/EXI.h"
|
||||
#include "Core/HW/EXI/EXI_Device.h"
|
||||
#include "Core/HW/GCMemcard/GCMemcard.h"
|
||||
@@ -27,6 +28,7 @@
|
||||
#include "Core/HW/Memmap.h"
|
||||
#include "Core/HW/SI/SI_Device.h"
|
||||
#include "Core/PowerPC/PowerPC.h"
|
||||
#include "Core/System.h"
|
||||
#include "Core/USBUtils.h"
|
||||
#include "DiscIO/Enums.h"
|
||||
#include "VideoCommon/VideoBackendBase.h"
|
||||
@@ -672,6 +674,9 @@ const char* GetDirectoryForRegion(DiscIO::Region region, RegionDirectoryStyle st
|
||||
ASSERT_MSG(BOOT, false, "NTSC-K is not a valid GameCube region");
|
||||
return style == RegionDirectoryStyle::Legacy ? JAP_DIR : JPN_DIR;
|
||||
|
||||
case DiscIO::Region::DEV:
|
||||
return DEV_DIR;
|
||||
|
||||
default:
|
||||
ASSERT_MSG(BOOT, false, "Default case should not be reached");
|
||||
return EUR_DIR;
|
||||
@@ -725,6 +730,7 @@ std::string GetMemcardPath(std::string configured_filename, ExpansionInterface::
|
||||
constexpr std::string_view us_region = "." USA_DIR;
|
||||
constexpr std::string_view jp_region = "." JAP_DIR;
|
||||
constexpr std::string_view eu_region = "." EUR_DIR;
|
||||
constexpr std::string_view dv_region = "." DEV_DIR;
|
||||
std::optional<DiscIO::Region> path_region = std::nullopt;
|
||||
if (name.ends_with(us_region))
|
||||
{
|
||||
@@ -741,6 +747,11 @@ std::string GetMemcardPath(std::string configured_filename, ExpansionInterface::
|
||||
name = name.substr(0, name.size() - eu_region.size());
|
||||
path_region = DiscIO::Region::PAL;
|
||||
}
|
||||
else if (name.ends_with(dv_region))
|
||||
{
|
||||
name = name.substr(0, name.size() - dv_region.size());
|
||||
path_region = DiscIO::Region::DEV;
|
||||
}
|
||||
|
||||
const DiscIO::Region used_region =
|
||||
region ? *region : (path_region ? *path_region : Config::Get(Config::MAIN_FALLBACK_REGION));
|
||||
@@ -784,6 +795,7 @@ std::string GetGCIFolderPath(std::string configured_folder, ExpansionInterface::
|
||||
constexpr std::string_view us_region = "/" USA_DIR;
|
||||
constexpr std::string_view jp_region = "/" JPN_DIR;
|
||||
constexpr std::string_view eu_region = "/" EUR_DIR;
|
||||
constexpr std::string_view dv_region = "/" DEV_DIR;
|
||||
std::string_view base_path = configured_folder;
|
||||
std::optional<DiscIO::Region> path_region = std::nullopt;
|
||||
if (base_path.ends_with(us_region))
|
||||
@@ -801,6 +813,11 @@ std::string GetGCIFolderPath(std::string configured_folder, ExpansionInterface::
|
||||
base_path = base_path.substr(0, base_path.size() - eu_region.size());
|
||||
path_region = DiscIO::Region::PAL;
|
||||
}
|
||||
else if (base_path.ends_with(dv_region))
|
||||
{
|
||||
base_path = base_path.substr(0, base_path.size() - dv_region.size());
|
||||
path_region = DiscIO::Region::DEV;
|
||||
}
|
||||
|
||||
const DiscIO::Region used_region =
|
||||
region ? *region : (path_region ? *path_region : Config::Get(Config::MAIN_FALLBACK_REGION));
|
||||
|
||||
@@ -142,12 +142,6 @@ const std::string SConfig::GetTitleDescription() const
|
||||
return m_title_description;
|
||||
}
|
||||
|
||||
std::string SConfig::GetTriforceID() const
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> lock(m_metadata_lock);
|
||||
return m_triforce_id;
|
||||
}
|
||||
|
||||
u64 SConfig::GetTitleID() const
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> lock(m_metadata_lock);
|
||||
@@ -163,7 +157,7 @@ u16 SConfig::GetRevision() const
|
||||
void SConfig::ResetRunningGameMetadata()
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> lock(m_metadata_lock);
|
||||
SetRunningGameMetadata("00000000", "", "", 0, 0, DiscIO::Region::Unknown);
|
||||
SetRunningGameMetadata("00000000", "", 0, 0, DiscIO::Region::Unknown);
|
||||
}
|
||||
|
||||
void SConfig::SetRunningGameMetadata(const DiscIO::Volume& volume,
|
||||
@@ -172,14 +166,14 @@ void SConfig::SetRunningGameMetadata(const DiscIO::Volume& volume,
|
||||
std::lock_guard<std::recursive_mutex> lock(m_metadata_lock);
|
||||
if (partition == volume.GetGamePartition())
|
||||
{
|
||||
SetRunningGameMetadata(volume.GetGameID(), volume.GetGameTDBID(), volume.GetTriforceID(),
|
||||
SetRunningGameMetadata(volume.GetGameID(), volume.GetGameTDBID(),
|
||||
volume.GetTitleID().value_or(0), volume.GetRevision().value_or(0),
|
||||
volume.GetRegion());
|
||||
}
|
||||
else
|
||||
{
|
||||
SetRunningGameMetadata(volume.GetGameID(partition), volume.GetGameTDBID(partition),
|
||||
volume.GetTriforceID(), volume.GetTitleID(partition).value_or(0),
|
||||
volume.GetTitleID(partition).value_or(0),
|
||||
volume.GetRevision(partition).value_or(0), volume.GetRegion());
|
||||
}
|
||||
}
|
||||
@@ -197,28 +191,25 @@ void SConfig::SetRunningGameMetadata(const IOS::ES::TMDReader& tmd, DiscIO::Plat
|
||||
!Core::System::GetInstance().GetDVDInterface().UpdateRunningGameMetadata(tmd_title_id))
|
||||
{
|
||||
// If not launching a disc game, just read everything from the TMD.
|
||||
SetRunningGameMetadata(tmd.GetGameID(), tmd.GetGameTDBID(), "", tmd_title_id,
|
||||
tmd.GetTitleVersion(), tmd.GetRegion());
|
||||
SetRunningGameMetadata(tmd.GetGameID(), tmd.GetGameTDBID(), tmd_title_id, tmd.GetTitleVersion(),
|
||||
tmd.GetRegion());
|
||||
}
|
||||
}
|
||||
|
||||
void SConfig::SetRunningGameMetadata(const std::string& game_id)
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> lock(m_metadata_lock);
|
||||
SetRunningGameMetadata(game_id, "", "", 0, 0, DiscIO::Region::Unknown);
|
||||
SetRunningGameMetadata(game_id, "", 0, 0, DiscIO::Region::Unknown);
|
||||
}
|
||||
|
||||
void SConfig::SetRunningGameMetadata(const std::string& game_id, const std::string& gametdb_id,
|
||||
std::string triforce_id, u64 title_id, u16 revision,
|
||||
DiscIO::Region region)
|
||||
u64 title_id, u16 revision, DiscIO::Region region)
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> lock(m_metadata_lock);
|
||||
const bool was_changed = m_game_id != game_id || m_gametdb_id != gametdb_id ||
|
||||
m_triforce_id != triforce_id || m_title_id != title_id ||
|
||||
m_revision != revision;
|
||||
m_title_id != title_id || m_revision != revision;
|
||||
m_game_id = game_id;
|
||||
m_gametdb_id = gametdb_id;
|
||||
m_triforce_id = triforce_id;
|
||||
m_title_id = title_id;
|
||||
m_revision = revision;
|
||||
|
||||
@@ -251,7 +242,7 @@ void SConfig::SetRunningGameMetadata(const std::string& game_id, const std::stri
|
||||
const Core::TitleDatabase title_database;
|
||||
auto& system = Core::System::GetInstance();
|
||||
const DiscIO::Language language = GetLanguageAdjustedForRegion(system.IsWii(), region);
|
||||
m_title_name = title_database.GetTitleName(m_gametdb_id, m_triforce_id, language);
|
||||
m_title_name = title_database.GetTitleName(m_gametdb_id, language);
|
||||
m_title_description = title_database.Describe(m_gametdb_id, language);
|
||||
NOTICE_LOG_FMT(CORE, "Active title: {}", m_title_description);
|
||||
Host_TitleChanged();
|
||||
@@ -458,6 +449,9 @@ bool SConfig::SetPathsAndGameMetadata(Core::System& system, const BootParameters
|
||||
if (m_region == DiscIO::Region::Unknown)
|
||||
m_region = Config::Get(Config::MAIN_FALLBACK_REGION);
|
||||
|
||||
if (system.IsTriforce())
|
||||
m_region = DiscIO::Region::DEV;
|
||||
|
||||
// Set up paths
|
||||
const std::string region_dir = Config::GetDirectoryForRegion(Config::ToGameCubeRegion(m_region));
|
||||
m_strSRAM = File::GetUserPath(F_GCSRAM_IDX);
|
||||
|
||||
@@ -54,7 +54,6 @@ struct SConfig
|
||||
// files
|
||||
std::string m_strBootROM;
|
||||
std::string m_strSRAM;
|
||||
|
||||
std::string m_debugger_game_id;
|
||||
|
||||
// TODO: remove this as soon as the ticket view hack in IOS/ES/Views is dropped.
|
||||
@@ -64,7 +63,6 @@ struct SConfig
|
||||
const std::string GetGameTDBID() const;
|
||||
const std::string GetTitleName() const;
|
||||
const std::string GetTitleDescription() const;
|
||||
std::string GetTriforceID() const;
|
||||
u64 GetTitleID() const;
|
||||
u16 GetRevision() const;
|
||||
void ResetRunningGameMetadata();
|
||||
@@ -121,15 +119,13 @@ private:
|
||||
static void ReloadTextures(Core::System& system);
|
||||
|
||||
void SetRunningGameMetadata(const std::string& game_id, const std::string& gametdb_id,
|
||||
std::string triforce_id, u64 title_id, u16 revision,
|
||||
DiscIO::Region region);
|
||||
u64 title_id, u16 revision, DiscIO::Region region);
|
||||
|
||||
static SConfig* m_Instance;
|
||||
mutable std::recursive_mutex m_metadata_lock;
|
||||
|
||||
std::string m_game_id;
|
||||
std::string m_gametdb_id;
|
||||
std::string m_triforce_id;
|
||||
std::string m_title_name;
|
||||
std::string m_title_description;
|
||||
u64 m_title_id;
|
||||
|
||||
@@ -51,6 +51,7 @@
|
||||
#include "Core/HLE/HLE.h"
|
||||
#include "Core/HW/CPU.h"
|
||||
#include "Core/HW/DSP.h"
|
||||
#include "Core/HW/DVD/AMMediaboard.h"
|
||||
#include "Core/HW/EXI/EXI.h"
|
||||
#include "Core/HW/GBAPad.h"
|
||||
#include "Core/HW/GCKeyboard.h"
|
||||
@@ -288,6 +289,13 @@ void Stop(Core::System& system) // - Hammertime!
|
||||
// Stop the CPU
|
||||
INFO_LOG_FMT(CONSOLE, "{}", StopMessage(true, "Stop CPU"));
|
||||
system.GetCPU().Stop();
|
||||
|
||||
const ExpansionInterface::EXIDeviceType type = Config::Get(Config::MAIN_SERIAL_PORT_1);
|
||||
|
||||
if ((type == ExpansionInterface::EXIDeviceType::Baseboard))
|
||||
{
|
||||
AMMediaboard::Shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
void DeclareAsCPUThread()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user