diff --git a/Source/Core/Core/CMakeLists.txt b/Source/Core/Core/CMakeLists.txt index b4437747e8..09b69a620e 100644 --- a/Source/Core/Core/CMakeLists.txt +++ b/Source/Core/Core/CMakeLists.txt @@ -203,6 +203,8 @@ add_library(core HW/EXI/EXI_DeviceAD16.h HW/EXI/EXI_DeviceAGP.cpp HW/EXI/EXI_DeviceAGP.h + HW/EXI/EXI_DeviceBaseboard.cpp + HW/EXI/EXI_DeviceBaseboard.h HW/EXI/EXI_DeviceDummy.cpp HW/EXI/EXI_DeviceDummy.h HW/EXI/EXI_DeviceEthernet.cpp diff --git a/Source/Core/Core/ConfigManager.cpp b/Source/Core/Core/ConfigManager.cpp index a480c7622d..e005e78341 100644 --- a/Source/Core/Core/ConfigManager.cpp +++ b/Source/Core/Core/ConfigManager.cpp @@ -307,6 +307,7 @@ void SConfig::LoadDefaults() auto& system = Core::System::GetInstance(); system.SetIsWii(false); + system.SetIsTriforce(false); ResetRunningGameMetadata(); } @@ -330,6 +331,7 @@ struct SetGameMetadata { *region = disc.volume->GetRegion(); system.SetIsWii(disc.volume->GetVolumeType() == DiscIO::Platform::WiiDisc); + system.SetIsTriforce(disc.volume->GetVolumeType() == DiscIO::Platform::Triforce); config->m_disc_booted_from_game_list = true; config->SetRunningGameMetadata(*disc.volume, disc.volume->GetGamePartition()); return true; diff --git a/Source/Core/Core/HW/EXI/EXI.cpp b/Source/Core/Core/HW/EXI/EXI.cpp index 303191c574..d676dc4845 100644 --- a/Source/Core/Core/HW/EXI/EXI.cpp +++ b/Source/Core/Core/HW/EXI/EXI.cpp @@ -66,6 +66,18 @@ void ExpansionInterfaceManager::AddMemoryCard(Slot slot) m_channels[SlotToEXIChannel(slot)]->AddDevice(memorycard_device, SlotToEXIDevice(slot)); } +void ExpansionInterfaceManager::AddSP1Device() +{ + EXIDeviceType sp1_device = EXIDeviceType::Baseboard; + auto& system = Core::System::GetInstance(); + if (system.IsTriforce()) + { + sp1_device = Config::Get(Config::MAIN_SERIAL_PORT_1); + } + + m_channels[0]->AddDevice(sp1_device, SlotToEXIDevice(Slot::SP1)); +} + u8 SlotToEXIChannel(Slot slot) { switch (slot) @@ -145,6 +157,7 @@ void ExpansionInterfaceManager::Init(const Sram* override_sram) AddMemoryCard(slot); m_channels[0]->AddDevice(EXIDeviceType::MaskROM, 1); + AddSP1Device(); m_channels[SlotToEXIChannel(Slot::SP1)]->AddDevice(Config::Get(Config::MAIN_SERIAL_PORT_1), SlotToEXIDevice(Slot::SP1)); m_channels[SlotToEXIChannel(Slot::SP2)]->AddDevice(Config::Get(Config::MAIN_SERIAL_PORT_2), diff --git a/Source/Core/Core/HW/EXI/EXI.h b/Source/Core/Core/HW/EXI/EXI.h index 7ded905b98..f0ea5fbfb5 100644 --- a/Source/Core/Core/HW/EXI/EXI.h +++ b/Source/Core/Core/HW/EXI/EXI.h @@ -89,6 +89,7 @@ public: private: void AddMemoryCard(Slot slot); + void AddSP1Device(); static void ChangeDeviceCallback(Core::System& system, u64 userdata, s64 cycles_late); static void UpdateInterruptsCallback(Core::System& system, u64 userdata, s64 cycles_late); diff --git a/Source/Core/Core/HW/EXI/EXI_Device.cpp b/Source/Core/Core/HW/EXI/EXI_Device.cpp index 6c416d5387..ac92c7b723 100644 --- a/Source/Core/Core/HW/EXI/EXI_Device.cpp +++ b/Source/Core/Core/HW/EXI/EXI_Device.cpp @@ -9,6 +9,7 @@ #include "Common/MsgHandler.h" #include "Core/HW/EXI/EXI_DeviceAD16.h" #include "Core/HW/EXI/EXI_DeviceAGP.h" +#include "Core/HW/EXI/EXI_DeviceBaseboard.h" #include "Core/HW/EXI/EXI_DeviceDummy.h" #include "Core/HW/EXI/EXI_DeviceEthernet.h" #include "Core/HW/EXI/EXI_DeviceGecko.h" @@ -171,7 +172,10 @@ std::unique_ptr EXIDevice_Create(Core::System& system, const EXIDevi result = std::make_unique(system, slot); break; - case EXIDeviceType::AMBaseboard: + case EXIDeviceType::Baseboard: + result = std::make_unique(system); + break; + case EXIDeviceType::None: default: result = std::make_unique(system); diff --git a/Source/Core/Core/HW/EXI/EXI_Device.h b/Source/Core/Core/HW/EXI/EXI_Device.h index db74306df0..25263af425 100644 --- a/Source/Core/Core/HW/EXI/EXI_Device.h +++ b/Source/Core/Core/HW/EXI/EXI_Device.h @@ -30,9 +30,7 @@ enum class EXIDeviceType : int AD16, Microphone, Ethernet, - // Was used for Triforce in the past, but the implementation is no longer in Dolphin. - // It's kept here so that values below will stay constant. - AMBaseboard, + Baseboard, Gecko, // Only used when creating a device by EXIDevice_Create. // Converted to MemoryCard internally. @@ -98,7 +96,7 @@ struct fmt::formatter _trans("AD16"), _trans("Microphone"), _trans("Broadband Adapter (TAP)"), - _trans("Triforce AM Baseboard"), + _trans("Triforce Baseboard"), _trans("USB Gecko"), _trans("GCI Folder"), _trans("Advance Game Port"), diff --git a/Source/Core/Core/HW/EXI/EXI_DeviceBaseboard.cpp b/Source/Core/Core/HW/EXI/EXI_DeviceBaseboard.cpp new file mode 100644 index 0000000000..a9200ac85a --- /dev/null +++ b/Source/Core/Core/HW/EXI/EXI_DeviceBaseboard.cpp @@ -0,0 +1,57 @@ +// Copyright 2013 Dolphin Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "Core/HW/EXI/EXI_DeviceBaseboard.h" + +#include "Common/Assert.h" +#include "Common/ChunkFile.h" +#include "Common/CommonTypes.h" +#include "Common/Logging/Log.h" + +namespace ExpansionInterface +{ +CEXIBaseboard::CEXIBaseboard(Core::System& system) : IEXIDevice(system) +{ +} + +void CEXIBaseboard::SetCS(int cs) +{ + if (cs) + m_position = 0; +} + +bool CEXIBaseboard::IsPresent() const +{ + return true; +} + +void CEXIBaseboard::TransferByte(u8& byte) +{ + if (m_position == 0) + { + m_command = byte; + } + else + { + switch (m_command) + { + case 0x00: + { + static constexpr std::array ID = {0x06, 0x04, 0x10, 0x00}; + byte = ID[(m_position - 2) & 3]; + break; + } + default: + ERROR_LOG_FMT(EXPANSIONINTERFACE, "EXI BASEBOARD: Unhandled command {:#x} {:#x}", m_command, + m_position); + } + } + m_position++; +} + +void CEXIBaseboard::DoState(PointerWrap& p) +{ + p.Do(m_position); + p.Do(m_command); +} +} // namespace ExpansionInterface diff --git a/Source/Core/Core/HW/EXI/EXI_DeviceBaseboard.h b/Source/Core/Core/HW/EXI/EXI_DeviceBaseboard.h new file mode 100644 index 0000000000..4c534428c9 --- /dev/null +++ b/Source/Core/Core/HW/EXI/EXI_DeviceBaseboard.h @@ -0,0 +1,27 @@ +// Copyright 2013 Dolphin Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "Core/HW/EXI/EXI_Device.h" + +class PointerWrap; + +namespace ExpansionInterface +{ +class CEXIBaseboard : public IEXIDevice +{ +public: + CEXIBaseboard(Core::System& system); + void SetCS(int cs) override; + bool IsPresent() const override; + void DoState(PointerWrap& p) override; + +private: + // STATE_TO_SAVE + u32 m_position = 0; + u32 m_command = 0; + + void TransferByte(u8& byte) override; +}; +} // namespace ExpansionInterface diff --git a/Source/Core/Core/State.cpp b/Source/Core/Core/State.cpp index 44465b3f42..9620cfccd4 100644 --- a/Source/Core/Core/State.cpp +++ b/Source/Core/Core/State.cpp @@ -99,7 +99,7 @@ static size_t s_state_writes_in_queue; static std::condition_variable s_state_write_queue_is_empty; // Don't forget to increase this after doing changes on the savestate system -constexpr u32 STATE_VERSION = 172; // Last changed in PR 13385 +constexpr u32 STATE_VERSION = 173; // Last changed in PR 10084 // Increase this if the StateExtendedHeader definition changes constexpr u32 EXTENDED_HEADER_VERSION = 1; // Last changed in PR 12217 diff --git a/Source/Core/Core/System.h b/Source/Core/Core/System.h index 9ec8391ff0..0ab86e658d 100644 --- a/Source/Core/Core/System.h +++ b/Source/Core/Core/System.h @@ -141,10 +141,12 @@ public: bool IsMMUMode() const { return m_mmu_enabled; } bool IsPauseOnPanicMode() const { return m_pause_on_panic_enabled; } bool IsMIOS() const { return m_is_mios; } + bool IsTriforce() const { return m_is_triforce; } bool IsWii() const { return m_is_wii; } bool IsBranchWatchIgnoreApploader() { return m_branch_watch_ignore_apploader; } void SetIsMIOS(bool is_mios) { m_is_mios = is_mios; } + void SetIsTriforce(bool is_triforce) { m_is_triforce = is_triforce; } void SetIsWii(bool is_wii) { m_is_wii = is_wii; } void SetIsBranchWatchIgnoreApploader(bool enable) { m_branch_watch_ignore_apploader = enable; } @@ -205,6 +207,7 @@ private: bool m_mmu_enabled = false; bool m_pause_on_panic_enabled = false; bool m_is_mios = false; + bool m_is_triforce = false; bool m_is_wii = false; bool m_branch_watch_ignore_apploader = false; }; diff --git a/Source/Core/DolphinLib.props b/Source/Core/DolphinLib.props index 388367afd1..4c7764202d 100644 --- a/Source/Core/DolphinLib.props +++ b/Source/Core/DolphinLib.props @@ -281,6 +281,7 @@ + @@ -948,6 +949,7 @@ +