From 3bb0e7e3f5190c3a4f7fa52f5c3ec17981accc3a Mon Sep 17 00:00:00 2001 From: JosJuice Date: Wed, 10 Aug 2016 19:23:21 +0200 Subject: [PATCH] Remove AM Baseboard Let's stop pretending that we support Triforce emulation. Keeping this code around just in case someone will make major improvements in the future isn't really worth it. I'm keeping the Triforce game INIs so users will know that the compatibility rating for Triforce games is 1 star (broken). --- CMakeLists.txt | 2 +- Readme.md | 8 +- Source/Core/Core/CMakeLists.txt | 2 - Source/Core/Core/Core.vcxproj | 4 - Source/Core/Core/Core.vcxproj.filters | 12 - Source/Core/Core/HW/DVDInterface.cpp | 219 +-------- Source/Core/Core/HW/EXI_Device.cpp | 6 +- Source/Core/Core/HW/EXI_Device.h | 7 +- Source/Core/Core/HW/EXI_DeviceAMBaseboard.cpp | 130 ----- Source/Core/Core/HW/EXI_DeviceAMBaseboard.h | 26 - Source/Core/Core/HW/SI_Device.cpp | 3 - Source/Core/Core/HW/SI_Device.h | 4 +- Source/Core/Core/HW/SI_DeviceAMBaseboard.cpp | 451 ------------------ Source/Core/Core/HW/SI_DeviceAMBaseboard.h | 31 -- .../DolphinWX/Config/GameCubeConfigPane.cpp | 7 - .../Core/DolphinWX/ControllerConfigDiag.cpp | 19 +- Source/Core/DolphinWX/ControllerConfigDiag.h | 2 +- 17 files changed, 28 insertions(+), 905 deletions(-) delete mode 100644 Source/Core/Core/HW/EXI_DeviceAMBaseboard.cpp delete mode 100644 Source/Core/Core/HW/EXI_DeviceAMBaseboard.h delete mode 100644 Source/Core/Core/HW/SI_DeviceAMBaseboard.cpp delete mode 100644 Source/Core/Core/HW/SI_DeviceAMBaseboard.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 912142f7e4..eed8a0acc2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1026,7 +1026,7 @@ set(CPACK_PACKAGE_VERSION_MAJOR ${DOLPHIN_VERSION_MAJOR}) set(CPACK_PACKAGE_VERSION_MINOR ${DOLPHIN_VERSION_MINOR}) set(CPACK_PACKAGE_VERSION_PATCH ${DOLPHIN_VERSION_PATCH}) set(CPACK_PACKAGE_DESCRIPTION_FILE ${PROJECT_SOURCE_DIR}/Data/cpack_package_description.txt) -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A GameCube, Wii and Triforce emulator") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A GameCube and Wii emulator") set(CPACK_RPM_PACKAGE_GROUP System/Emulators/Other) set(CPACK_RPM_PACKAGE_LICENSE GPL-2.0) diff --git a/Readme.md b/Readme.md index 9a4f8a6337..5639c928f9 100644 --- a/Readme.md +++ b/Readme.md @@ -1,10 +1,10 @@ -# Dolphin - A GameCube / Wii / Triforce Emulator +# Dolphin - A GameCube / Wii Emulator [Homepage](https://dolphin-emu.org/) | [Project Site](https://github.com/dolphin-emu/dolphin) | [Forums](https://forums.dolphin-emu.org/) | [Wiki](https://wiki.dolphin-emu.org/) | [Issue Tracker](https://bugs.dolphin-emu.org/projects/emulator/issues) | [Coding Style](https://github.com/dolphin-emu/dolphin/blob/master/Contributing.md) | [Transifex Page](https://www.transifex.com/projects/p/dolphin-emu/) -Dolphin is an emulator for running GameCube, Wii, and Triforce games on -Windows, Linux, OS X, and recent Android devices. It's licensed under -the terms of the GNU General Public License, version 2 or later (GPLv2+). +Dolphin is an emulator for running GameCube and Wii games on Windows, +Linux, OS X, and recent Android devices. It's licensed under the terms +of the GNU General Public License, version 2 or later (GPLv2+). Please read the [FAQ](https://dolphin-emu.org/docs/faq/) before using Dolphin. diff --git a/Source/Core/Core/CMakeLists.txt b/Source/Core/Core/CMakeLists.txt index d194d8447c..65dbc8868a 100644 --- a/Source/Core/Core/CMakeLists.txt +++ b/Source/Core/Core/CMakeLists.txt @@ -90,7 +90,6 @@ set(SRCS ActionReplay.cpp HW/EXI_Device.cpp HW/EXI_DeviceAD16.cpp HW/EXI_DeviceAGP.cpp - HW/EXI_DeviceAMBaseboard.cpp HW/EXI_DeviceEthernet.cpp HW/EXI_DeviceGecko.cpp HW/EXI_DeviceIPL.cpp @@ -110,7 +109,6 @@ set(SRCS ActionReplay.cpp HW/MMIO.cpp HW/ProcessorInterface.cpp HW/SI.cpp - HW/SI_DeviceAMBaseboard.cpp HW/SI_Device.cpp HW/SI_DeviceDanceMat.cpp HW/SI_DeviceGBA.cpp diff --git a/Source/Core/Core/Core.vcxproj b/Source/Core/Core/Core.vcxproj index e05401d41f..549960306b 100644 --- a/Source/Core/Core/Core.vcxproj +++ b/Source/Core/Core/Core.vcxproj @@ -122,7 +122,6 @@ - @@ -143,7 +142,6 @@ - @@ -328,7 +326,6 @@ - @@ -350,7 +347,6 @@ - diff --git a/Source/Core/Core/Core.vcxproj.filters b/Source/Core/Core/Core.vcxproj.filters index 504b1b69d5..7fda04b8e9 100644 --- a/Source/Core/Core/Core.vcxproj.filters +++ b/Source/Core/Core/Core.vcxproj.filters @@ -384,9 +384,6 @@ HW %28Flipper/Hollywood%29\EXI - Expansion Interface - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface - HW %28Flipper/Hollywood%29\EXI - Expansion Interface @@ -438,9 +435,6 @@ HW %28Flipper/Hollywood%29\SI - Serial Interface - - HW %28Flipper/Hollywood%29\SI - Serial Interface - HW %28Flipper/Hollywood%29\SI - Serial Interface @@ -929,9 +923,6 @@ HW %28Flipper/Hollywood%29\EXI - Expansion Interface - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface - HW %28Flipper/Hollywood%29\EXI - Expansion Interface @@ -983,9 +974,6 @@ HW %28Flipper/Hollywood%29\SI - Serial Interface - - HW %28Flipper/Hollywood%29\SI - Serial Interface - HW %28Flipper/Hollywood%29\SI - Serial Interface diff --git a/Source/Core/Core/HW/DVDInterface.cpp b/Source/Core/Core/HW/DVDInterface.cpp index 3c5fb391d8..ad85343a82 100644 --- a/Source/Core/Core/HW/DVDInterface.cpp +++ b/Source/Core/Core/HW/DVDInterface.cpp @@ -681,44 +681,23 @@ void ExecuteCommand(u32 command_0, u32 command_1, u32 command_2, u32 output_addr u64 ticks_until_completion = SystemTimers::GetTicksPerSecond() / 15000; bool command_handled_by_thread = false; - bool GCAM = (SConfig::GetInstance().m_SIDevice[0] == SIDEVICE_AM_BASEBOARD) && - (SConfig::GetInstance().m_EXIDevice[2] == EXIDEVICE_AM_BASEBOARD); - // DVDLowRequestError needs access to the error code set by the previous command if (command_0 >> 24 != DVDLowRequestError) s_error_code = 0; - if (GCAM) - { - ERROR_LOG(DVDINTERFACE, "DVD: %08x, %08x, %08x, DMA=addr:%08x,len:%08x,ctrl:%08x", command_0, - command_1, command_2, output_address, output_length, s_DICR.Hex); - // decrypt command. But we have a zero key, that simplifies things a lot. - // If you get crazy dvd command errors, make sure 0x80000000 - 0x8000000c is zero'd - command_0 <<= 24; - } - switch (command_0 >> 24) { // Seems to be used by both GC and Wii case DVDLowInquiry: - if (GCAM) - { - // 0x29484100... - // was 21 i'm not entirely sure about this, but it works well. - WriteImmediate(0x21000000, output_address, reply_to_ios); - } - else - { - // (shuffle2) Taken from my Wii - Memory::Write_U32(0x00000002, output_address); - Memory::Write_U32(0x20060526, output_address + 4); - // This was in the oubuf even though this cmd is only supposed to reply with 64bits - // However, this and other tests strongly suggest that the buffer is static, and it's never - - // or rarely cleared. - Memory::Write_U32(0x41000000, output_address + 8); + // (shuffle2) Taken from my Wii + Memory::Write_U32(0x00000002, output_address); + Memory::Write_U32(0x20060526, output_address + 4); + // This was in the oubuf even though this cmd is only supposed to reply with 64bits + // However, this and other tests strongly suggest that the buffer is static, and it's never - + // or rarely cleared. + Memory::Write_U32(0x41000000, output_address + 8); - INFO_LOG(DVDINTERFACE, "DVDLowInquiry (Buffer 0x%08x, 0x%x)", output_address, output_length); - } + INFO_LOG(DVDINTERFACE, "DVDLowInquiry (Buffer 0x%08x, 0x%x)", output_address, output_length); break; // Only seems to be used from WII_IPC, not through direct access @@ -865,56 +844,6 @@ void ExecuteCommand(u32 command_0, u32 command_1, u32 command_2, u32 output_addr ", DMABuffer = %08x, SrcLength = %08x, DMALength = %08x", iDVDOffset, output_address, command_2, output_length); - if (GCAM) - { - if (iDVDOffset & 0x80000000) // read request to hardware buffer - { - switch (iDVDOffset) - { - case 0x80000000: - ERROR_LOG(DVDINTERFACE, "GC-AM: READ MEDIA BOARD STATUS (80000000)"); - for (u32 i = 0; i < output_length; i += 4) - Memory::Write_U32(0, output_address + i); - break; - case 0x80000040: - ERROR_LOG(DVDINTERFACE, "GC-AM: READ MEDIA BOARD STATUS (2) (80000040)"); - for (u32 i = 0; i < output_length; i += 4) - Memory::Write_U32(~0, output_address + i); - Memory::Write_U32(0x00000020, output_address); // DIMM SIZE, LE - Memory::Write_U32(0x4743414D, output_address + 4); // GCAM signature - break; - case 0x80000120: - ERROR_LOG(DVDINTERFACE, "GC-AM: READ FIRMWARE STATUS (80000120)"); - for (u32 i = 0; i < output_length; i += 4) - Memory::Write_U32(0x01010101, output_address + i); - break; - case 0x80000140: - ERROR_LOG(DVDINTERFACE, "GC-AM: READ FIRMWARE STATUS (80000140)"); - for (u32 i = 0; i < output_length; i += 4) - Memory::Write_U32(0x01010101, output_address + i); - break; - case 0x84000020: - ERROR_LOG(DVDINTERFACE, "GC-AM: READ MEDIA BOARD STATUS (1) (84000020)"); - for (u32 i = 0; i < output_length; i += 4) - Memory::Write_U32(0x00000000, output_address + i); - break; - default: - ERROR_LOG(DVDINTERFACE, "GC-AM: UNKNOWN MEDIA BOARD LOCATION %" PRIx64, iDVDOffset); - break; - } - break; - } - else if ((iDVDOffset == 0x1f900000) || (iDVDOffset == 0x1f900020)) - { - ERROR_LOG(DVDINTERFACE, "GC-AM: READ MEDIA BOARD COMM AREA (1f900020)"); - u8* source = s_media_buffer + iDVDOffset - 0x1f900000; - Memory::CopyToEmu(output_address, source, output_length); - for (u32 i = 0; i < output_length; i += 4) - ERROR_LOG(DVDINTERFACE, "GC-AM: %08x", Memory::Read_U32(output_address + i)); - break; - } - } - command_handled_by_thread = ExecuteReadCommand(iDVDOffset, output_address, command_2, output_length, false, reply_to_ios, &interrupt_type, &ticks_until_completion); @@ -934,138 +863,10 @@ void ExecuteCommand(u32 command_0, u32 command_1, u32 command_2, u32 output_addr } break; - // GC-AM only - case 0xAA: - if (GCAM) - { - ERROR_LOG(DVDINTERFACE, "GC-AM: 0xAA, DMABuffer=%08x, DMALength=%08x", output_address, - output_length); - u64 iDVDOffset = (u64)command_1 << 2; - u32 len = output_length; - s64 offset = iDVDOffset - 0x1F900000; - /* - if (iDVDOffset == 0x84800000) - { - ERROR_LOG(DVDINTERFACE, "Firmware upload"); - } - else*/ - if ((offset < 0) || ((offset + len) > 0x40) || len > 0x40) - { - u32 addr = output_address; - if (iDVDOffset == 0x84800000) - { - ERROR_LOG(DVDINTERFACE, "FIRMWARE UPLOAD"); - } - else - { - ERROR_LOG(DVDINTERFACE, "ILLEGAL MEDIA WRITE"); - } - - while (len >= 4) - { - ERROR_LOG(DVDINTERFACE, "GC-AM Media Board WRITE (0xAA): %08" PRIx64 ": %08x", iDVDOffset, - Memory::Read_U32(addr)); - addr += 4; - len -= 4; - iDVDOffset += 4; - } - } - else - { - u32 addr = s_DIMAR.Address; - Memory::CopyFromEmu(s_media_buffer + offset, addr, len); - while (len >= 4) - { - ERROR_LOG(DVDINTERFACE, "GC-AM Media Board WRITE (0xAA): %08" PRIx64 ": %08x", iDVDOffset, - Memory::Read_U32(addr)); - addr += 4; - len -= 4; - iDVDOffset += 4; - } - } - } - break; - // Seems to be used by both GC and Wii case DVDLowSeek: - if (!GCAM) - { - // Currently unimplemented - INFO_LOG(DVDINTERFACE, "Seek: offset=%09" PRIx64 " (ignoring)", (u64)command_1 << 2); - } - else - { - memset(s_media_buffer, 0, 0x20); - s_media_buffer[0] = s_media_buffer[0x20]; // ID - s_media_buffer[2] = s_media_buffer[0x22]; - s_media_buffer[3] = s_media_buffer[0x23] | 0x80; - int cmd = (s_media_buffer[0x23] << 8) | s_media_buffer[0x22]; - ERROR_LOG(DVDINTERFACE, "GC-AM: execute buffer, cmd=%04x", cmd); - switch (cmd) - { - case 0x00: - s_media_buffer[4] = 1; - break; - case 0x1: - s_media_buffer[7] = 0x20; // DIMM Size - break; - case 0x100: - { - // urgh - static int percentage = 0; - static int status = 0; - percentage++; - if (percentage > 100) - { - status++; - percentage = 0; - } - s_media_buffer[4] = status; - /* status: - 0 - "Initializing media board. Please wait.." - 1 - "Checking network. Please wait..." - 2 - "Found a system disc. Insert a game disc" - 3 - "Testing a game program. %d%%" - 4 - "Loading a game program. %d%%" - 5 - go - 6 - error xx - */ - s_media_buffer[8] = percentage; - s_media_buffer[4] = 0x05; - s_media_buffer[8] = 0x64; - break; - } - case 0x101: - s_media_buffer[4] = 3; // version - s_media_buffer[5] = 3; - s_media_buffer[6] = 1; // xxx - s_media_buffer[8] = 1; - s_media_buffer[16] = 0xFF; - s_media_buffer[17] = 0xFF; - s_media_buffer[18] = 0xFF; - s_media_buffer[19] = 0xFF; - break; - case 0x102: // get error code - s_media_buffer[4] = 1; // 0: download incomplete (31), 1: corrupted, other error 1 - s_media_buffer[5] = 0; - break; - case 0x103: - memcpy(s_media_buffer + 4, "A89E27A50364511", 15); // serial - break; -#if 0 - case 0x301: // unknown - memcpy(s_media_buffer + 4, s_media_buffer + 0x24, 0x1c); - break; - case 0x302: - break; -#endif - default: - ERROR_LOG(DVDINTERFACE, "GC-AM: execute buffer (unknown)"); - break; - } - memset(s_media_buffer + 0x20, 0, 0x20); - WriteImmediate(0x66556677, output_address, reply_to_ios); // just a random value that works. - } + // Currently unimplemented + INFO_LOG(DVDINTERFACE, "Seek: offset=%09" PRIx64 " (ignoring)", (u64)command_1 << 2); break; // Probably only used by Wii diff --git a/Source/Core/Core/HW/EXI_Device.cpp b/Source/Core/Core/HW/EXI_Device.cpp index bc2c4b84be..48a5c1c286 100644 --- a/Source/Core/Core/HW/EXI_Device.cpp +++ b/Source/Core/Core/HW/EXI_Device.cpp @@ -10,7 +10,6 @@ #include "Core/HW/EXI_Device.h" #include "Core/HW/EXI_DeviceAD16.h" #include "Core/HW/EXI_DeviceAGP.h" -#include "Core/HW/EXI_DeviceAMBaseboard.h" #include "Core/HW/EXI_DeviceEthernet.h" #include "Core/HW/EXI_DeviceGecko.h" #include "Core/HW/EXI_DeviceIPL.h" @@ -131,10 +130,6 @@ std::unique_ptr EXIDevice_Create(TEXIDevices device_type, const int result = std::make_unique(); break; - case EXIDEVICE_AM_BASEBOARD: - result = std::make_unique(); - break; - case EXIDEVICE_GECKO: result = std::make_unique(); break; @@ -143,6 +138,7 @@ std::unique_ptr EXIDevice_Create(TEXIDevices device_type, const int result = std::make_unique(channel_num); break; + case EXIDEVICE_AM_BASEBOARD: case EXIDEVICE_NONE: default: result = std::make_unique(); diff --git a/Source/Core/Core/HW/EXI_Device.h b/Source/Core/Core/HW/EXI_Device.h index db93c3276b..c32ba5edd5 100644 --- a/Source/Core/Core/HW/EXI_Device.h +++ b/Source/Core/Core/HW/EXI_Device.h @@ -17,10 +17,13 @@ enum TEXIDevices : int EXIDEVICE_AD16, EXIDEVICE_MIC, EXIDEVICE_ETH, + // 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. EXIDEVICE_AM_BASEBOARD, EXIDEVICE_GECKO, - EXIDEVICE_MEMORYCARDFOLDER, // Only used when creating a device by EXIDevice_Create - // Converted to EXIDEVICE_MEMORYCARD internally + // Only used when creating a device by EXIDevice_Create. + // Converted to EXIDEVICE_MEMORYCARD internally. + EXIDEVICE_MEMORYCARDFOLDER, EXIDEVICE_AGP, EXIDEVICE_NONE = (u8)-1 }; diff --git a/Source/Core/Core/HW/EXI_DeviceAMBaseboard.cpp b/Source/Core/Core/HW/EXI_DeviceAMBaseboard.cpp deleted file mode 100644 index 9e1c99d45c..0000000000 --- a/Source/Core/Core/HW/EXI_DeviceAMBaseboard.cpp +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2009 Dolphin Emulator Project -// Licensed under GPLv2+ -// Refer to the license.txt file included. - -#include "Core/HW/EXI.h" -#include "Common/ChunkFile.h" -#include "Common/CommonTypes.h" -#include "Common/Logging/Log.h" -#include "Core/HW/EXI_DeviceAMBaseboard.h" - -CEXIAMBaseboard::CEXIAMBaseboard() : m_position(0), m_have_irq(false) -{ -} - -void CEXIAMBaseboard::SetCS(int cs) -{ - ERROR_LOG(SP1, "AM-BB ChipSelect=%d", cs); - if (cs) - m_position = 0; -} - -bool CEXIAMBaseboard::IsPresent() const -{ - return true; -} - -void CEXIAMBaseboard::TransferByte(u8& _byte) -{ - /* - ID: - 00 00 xx xx xx xx - xx xx 06 04 10 00 - CMD: - 01 00 00 b3 xx - xx xx xx xx 04 - exi_lanctl_write: - ff 02 01 63 xx - xx xx xx xx 04 - exi_imr_read: - 86 00 00 f5 xx xx xx - xx xx xx xx 04 rr rr - exi_imr_write: - 87 80 5c 17 xx - xx xx xx xx 04 - - exi_isr_read: - 82 .. .. .. xx xx xx - xx xx xx xx 04 rr rr - 3 byte command, 1 byte checksum - */ - DEBUG_LOG(SP1, "AM-BB > %02x", _byte); - if (m_position < 4) - { - m_command[m_position] = _byte; - _byte = 0xFF; - } - - if ((m_position >= 2) && (m_command[0] == 0 && m_command[1] == 0)) - { - _byte = "\x06\x04\x10\x00"[(m_position - 2) & 3]; - } - else if (m_position == 3) - { - unsigned int checksum = (m_command[0] << 24) | (m_command[1] << 16) | (m_command[2] << 8); - unsigned int bit = 0x80000000UL; - unsigned int check = 0x8D800000UL; - while (bit >= 0x100) - { - if (checksum & bit) - checksum ^= check; - check >>= 1; - bit >>= 1; - } - - if (m_command[3] != (checksum & 0xFF)) - ERROR_LOG(SP1, "AM-BB cs: %02x, w: %02x", m_command[3], checksum & 0xFF); - } - else - { - if (m_position == 4) - { - _byte = 4; - ERROR_LOG(SP1, "AM-BB COMMAND: %02x %02x %02x", m_command[0], m_command[1], m_command[2]); - - if ((m_command[0] == 0xFF) && (m_command[1] == 0) && (m_command[2] == 0)) - m_have_irq = true; - else if (m_command[0] == 0x82) - m_have_irq = false; - ExpansionInterface::UpdateInterrupts(); - } - else if (m_position > 4) - { - switch (m_command[0]) - { - case 0xFF: // lan - _byte = 0xFF; - break; - case 0x86: // imr - _byte = 0x00; - break; - case 0x82: // isr - _byte = m_have_irq ? 0xFF : 0; - break; - default: - _dbg_assert_msg_(SP1, 0, "Unknown AM-BB command"); - break; - } - } - else - { - _byte = 0xFF; - } - } - DEBUG_LOG(SP1, "AM-BB < %02x", _byte); - m_position++; -} - -bool CEXIAMBaseboard::IsInterruptSet() -{ - if (m_have_irq) - ERROR_LOG(SP1, "AM-BB IRQ"); - return m_have_irq; -} - -void CEXIAMBaseboard::DoState(PointerWrap& p) -{ - p.Do(m_position); - p.Do(m_have_irq); - p.Do(m_command); -} diff --git a/Source/Core/Core/HW/EXI_DeviceAMBaseboard.h b/Source/Core/Core/HW/EXI_DeviceAMBaseboard.h deleted file mode 100644 index 423a23be71..0000000000 --- a/Source/Core/Core/HW/EXI_DeviceAMBaseboard.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2008 Dolphin Emulator Project -// Licensed under GPLv2+ -// Refer to the license.txt file included. - -#pragma once - -#include "Core/HW/EXI_Device.h" - -class PointerWrap; - -class CEXIAMBaseboard : public IEXIDevice -{ -public: - CEXIAMBaseboard(); - - void SetCS(int _iCS) override; - bool IsPresent() const override; - bool IsInterruptSet() override; - void DoState(PointerWrap& p) override; - -private: - void TransferByte(u8& _uByte) override; - int m_position; - bool m_have_irq; - unsigned char m_command[4]; -}; diff --git a/Source/Core/Core/HW/SI_Device.cpp b/Source/Core/Core/HW/SI_Device.cpp index 114f064600..04495b699e 100644 --- a/Source/Core/Core/HW/SI_Device.cpp +++ b/Source/Core/Core/HW/SI_Device.cpp @@ -9,7 +9,6 @@ #include "Common/Logging/Log.h" #include "Common/StringUtil.h" #include "Core/HW/SI_Device.h" -#include "Core/HW/SI_DeviceAMBaseboard.h" #include "Core/HW/SI_DeviceDanceMat.h" #include "Core/HW/SI_DeviceGBA.h" #include "Core/HW/SI_DeviceGCAdapter.h" @@ -114,8 +113,6 @@ std::unique_ptr SIDevice_Create(const SIDevices device, const int por return std::make_unique(device, port_number); case SIDEVICE_AM_BASEBOARD: - return std::make_unique(device, port_number); - case SIDEVICE_NONE: default: return std::make_unique(device, port_number); diff --git a/Source/Core/Core/HW/SI_Device.h b/Source/Core/Core/HW/SI_Device.h index fe3953494c..74e6be167d 100644 --- a/Source/Core/Core/HW/SI_Device.h +++ b/Source/Core/Core/HW/SI_Device.h @@ -62,9 +62,11 @@ enum SIDevices : int SIDEVICE_GC_STEERING, SIDEVICE_DANCEMAT, SIDEVICE_GC_TARUKONGA, + // 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. SIDEVICE_AM_BASEBOARD, SIDEVICE_WIIU_ADAPTER, - // not a valid device, used for checking whether enum value is valid + // Not a valid device. Used for checking whether enum values are valid. SIDEVICE_COUNT, }; diff --git a/Source/Core/Core/HW/SI_DeviceAMBaseboard.cpp b/Source/Core/Core/HW/SI_DeviceAMBaseboard.cpp deleted file mode 100644 index c978a7681e..0000000000 --- a/Source/Core/Core/HW/SI_DeviceAMBaseboard.cpp +++ /dev/null @@ -1,451 +0,0 @@ -// Copyright 2009 Dolphin Emulator Project -// Licensed under GPLv2+ -// Refer to the license.txt file included. - -#include -#include - -#include "Common/CommonTypes.h" -#include "Common/Logging/Log.h" -#include "Common/MsgHandler.h" -#include "Core/HW/GCPad.h" -#include "Core/HW/SI_Device.h" -#include "Core/HW/SI_DeviceAMBaseboard.h" -#include "InputCommon/GCPadStatus.h" - -// where to put baseboard debug -#define AMBASEBOARDDEBUG OSREPORT - -// "JAMMA Video Standard" I/O -class JVSIOMessage -{ -public: - int m_ptr, m_last_start, m_csum; - unsigned char m_msg[0x80]; - - JVSIOMessage() - { - m_ptr = 0; - m_last_start = 0; - } - - void Start(int node) - { - m_last_start = m_ptr; - unsigned char hdr[3] = {0xe0, (unsigned char)node, 0}; - m_csum = 0; - AddData(hdr, 3, 1); - } - void AddData(const void* data, size_t len) { AddData((const unsigned char*)data, len); } - void AddData(const char* data) { AddData(data, strlen(data)); } - void AddData(int n) - { - unsigned char cs = n; - AddData(&cs, 1); - } - - void End() - { - int len = m_ptr - m_last_start; - m_msg[m_last_start + 2] = len - 2; // assuming len <0xD0 - AddData(m_csum + len - 2); - } - - void AddData(const unsigned char* dst, size_t len, int sync = 0) - { - while (len--) - { - int c = *dst++; - if (!sync && ((c == 0xE0) || (c == 0xD0))) - { - m_msg[m_ptr++] = 0xD0; - m_msg[m_ptr++] = c - 1; - } - else - { - m_msg[m_ptr++] = c; - } - - if (!sync) - m_csum += c; - sync = 0; - if (m_ptr >= 0x80) - PanicAlert("JVSIOMessage overrun!"); - } - } -}; // end class JVSIOMessage - -// AM-Baseboard device on SI -CSIDevice_AMBaseboard::CSIDevice_AMBaseboard(SIDevices device, int _iDeviceNumber) - : ISIDevice(device, _iDeviceNumber) -{ -} - -int CSIDevice_AMBaseboard::RunBuffer(u8* _pBuffer, int _iLength) -{ - // for debug logging only - ISIDevice::RunBuffer(_pBuffer, _iLength); - - int iPosition = 0; - while (iPosition < _iLength) - { - // read the command - EBufferCommands command = static_cast(_pBuffer[iPosition ^ 3]); - iPosition++; - - // handle it - switch (command) - { - case CMD_RESET: // returns ID and dip switches - { - *(u32*)&_pBuffer[0] = - SI_AM_BASEBOARD | 0x100; // 0x100 is progressive flag according to dip switch - iPosition = _iLength; // break the while loop - } - break; - case CMD_GCAM: - { - int i; - - // calculate checksum over buffer - int csum = 0; - for (i = 0; i < _iLength; ++i) - csum += _pBuffer[i]; - - unsigned char res[0x80]; - int resp = 0; - - int real_len = _pBuffer[1 ^ 3]; - int p = 2; - - static int d10_1 = 0xfe; - - memset(res, 0, 0x80); - res[resp++] = 1; - res[resp++] = 1; - -#define ptr(x) _pBuffer[(p + x) ^ 3] - while (p < real_len + 2) - { - switch (ptr(0)) - { - case 0x10: - { - DEBUG_LOG(AMBASEBOARDDEBUG, "GC-AM: Command 10, %02x (READ STATUS&SWITCHES)", ptr(1)); - GCPadStatus pad_status = Pad::GetStatus(m_iDeviceNumber); - res[resp++] = 0x10; - res[resp++] = 0x2; - int d10_0 = 0xdf; - - if (pad_status.triggerLeft) - d10_0 &= ~0x80; - if (pad_status.triggerRight) - d10_0 &= ~0x40; - - res[resp++] = d10_0; - res[resp++] = d10_1; - break; - } - case 0x12: - ERROR_LOG(AMBASEBOARDDEBUG, "GC-AM: Command 12, %02x %02x", ptr(1), ptr(2)); - res[resp++] = 0x12; - res[resp++] = 0x00; - break; - case 0x11: - { - ERROR_LOG(AMBASEBOARDDEBUG, "GC-AM: Command 11, %02x (READ SERIAL NR)", ptr(1)); - char string[] = "AADE-01A14964511"; - res[resp++] = 0x11; - res[resp++] = 0x10; - memcpy(res + resp, string, 0x10); - resp += 0x10; - break; - } - case 0x15: - ERROR_LOG(AMBASEBOARDDEBUG, "GC-AM: CMD 15, %02x (READ FIRM VERSION)", ptr(1)); - res[resp++] = 0x15; - res[resp++] = 0x02; - res[resp++] = 0x00; - res[resp++] = 0x29; // FIRM VERSION - break; - case 0x16: - ERROR_LOG(AMBASEBOARDDEBUG, "GC-AM: Command 16, %02x (READ FPGA VERSION)", ptr(1)); - res[resp++] = 0x16; - res[resp++] = 0x02; - res[resp++] = 0x07; - res[resp++] = 0x06; // FPGAVERSION - /* - res[resp++] = 0x16; - res[resp++] = 0x00; - p += 2; - */ - break; - case 0x1f: - { - ERROR_LOG(AMBASEBOARDDEBUG, "GC-AM: Command 1f, %02x %02x %02x %02x %02x (REGION)", - ptr(1), ptr(2), ptr(3), ptr(4), ptr(5)); - unsigned char string[] = "\x00\x00\x30\x00" - //"\x01\xfe\x00\x00" // JAPAN - "\x02\xfd\x00\x00" // USA - //"\x03\xfc\x00\x00" // export - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"; - res[resp++] = 0x1f; - res[resp++] = 0x14; - - for (i = 0; i < 0x14; ++i) - res[resp++] = string[i]; - break; - } - case 0x31: - ERROR_LOG(AMBASEBOARDDEBUG, "GC-AM: Command 31 (UNKNOWN)"); - res[resp++] = 0x31; - res[resp++] = 0x02; - res[resp++] = 0x00; - res[resp++] = 0x00; - break; - case 0x32: - ERROR_LOG(AMBASEBOARDDEBUG, "GC-AM: Command 32 (UNKNOWN)"); - res[resp++] = 0x32; - res[resp++] = 0x02; - res[resp++] = 0x00; - res[resp++] = 0x00; - break; - case 0x40: - case 0x41: - case 0x42: - case 0x43: - case 0x44: - case 0x45: - case 0x46: - case 0x47: - case 0x48: - case 0x49: - case 0x4a: - case 0x4b: - case 0x4c: - case 0x4d: - case 0x4e: - case 0x4f: - { - DEBUG_LOG(AMBASEBOARDDEBUG, - "GC-AM: Command %02x, %02x %02x %02x %02x %02x %02x %02x (JVS IO)", ptr(0), - ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), ptr(6), ptr(7)); - int pptr = 2; - JVSIOMessage msg; - - msg.Start(0); - msg.AddData(1); - - unsigned char jvs_io_buffer[0x80]; - int nr_bytes = ptr(pptr + 2); // byte after e0 xx - int jvs_io_length = 0; - for (i = 0; i < nr_bytes + 3; ++i) - jvs_io_buffer[jvs_io_length++] = ptr(pptr + i); - int node = jvs_io_buffer[1]; - - unsigned char* jvs_io = jvs_io_buffer + 3; - jvs_io_length--; // checksum - while (jvs_io < (jvs_io_buffer + jvs_io_length)) - { - int cmd = *jvs_io++; - DEBUG_LOG(AMBASEBOARDDEBUG, "JVS IO, node=%d, command=%02x", node, cmd); - - switch (cmd) - { - case 0x10: // get ID - msg.AddData(1); - { - char buffer[12]; - sprintf(buffer, "JVS-node %02x", node); - // msg.addData(buffer); - msg.AddData("JAMMA I/O CONTROLLER"); - } - msg.AddData(0); - break; - case 0x11: // cmd revision - msg.AddData(1); - msg.AddData(0x11); - break; - case 0x12: // jvs revision - msg.AddData(1); - msg.AddData(0x12); - break; - case 0x13: // com revision - msg.AddData(1); - msg.AddData(0x13); - break; - case 0x14: // get features - msg.AddData(1); - msg.AddData((void*)"\x01\x02\x0a\x00", 4); // 2 player, 10 bit - msg.AddData((void*)"\x02\x02\x00\x00", 4); // 2 coin slots - // msg.addData((void *)"\x03\x02\x08\x00", 4); - msg.AddData((void*)"\x00\x00\x00\x00", 4); - break; - case 0x15: - while (*jvs_io++) - { - }; - msg.AddData(1); - break; - case 0x20: - { - int nr_players = *jvs_io++; - int bytes_per_player = *jvs_io++; /* ??? */ - int j; - msg.AddData(1); - - msg.AddData(0); // tilt - for (i = 0; i < nr_players; ++i) - { - GCPadStatus pad_status = Pad::GetStatus(i); - unsigned char player_data[2] = {0, 0}; - if (pad_status.button & PAD_BUTTON_START) - player_data[0] |= 0x80; - if (pad_status.button & PAD_BUTTON_UP) - player_data[0] |= 0x20; - if (pad_status.button & PAD_BUTTON_DOWN) - player_data[0] |= 0x10; - if (pad_status.button & PAD_BUTTON_LEFT) - player_data[0] |= 0x08; - if (pad_status.button & PAD_BUTTON_RIGHT) - player_data[0] |= 0x04; - - if (pad_status.button & PAD_BUTTON_A) - player_data[0] |= 0x02; - if (pad_status.button & PAD_BUTTON_B) - player_data[0] |= 0x01; - - if (pad_status.button & PAD_BUTTON_X) - player_data[1] |= 0x80; - if (pad_status.button & PAD_BUTTON_Y) - player_data[1] |= 0x40; - if (pad_status.button & PAD_TRIGGER_L) - player_data[1] |= 0x20; - if (pad_status.button & PAD_TRIGGER_R) - player_data[1] |= 0x10; - - for (j = 0; j < bytes_per_player; ++j) - msg.AddData(player_data[j & 1]); - } - break; - } - case 0x21: // coin - { - int slots = *jvs_io++; - msg.AddData(1); - GCPadStatus pad_status = Pad::GetStatus(0); - while (slots--) - { - msg.AddData(0); - msg.AddData((pad_status.button & PAD_BUTTON_START) ? 1 : 0); - } - break; - } - case 0x22: // analog - { - break; - } - case 0xf0: - if (*jvs_io++ == 0xD9) - ERROR_LOG(AMBASEBOARDDEBUG, "JVS RESET"); - msg.AddData(1); - - d10_1 |= 1; - break; - case 0xf1: - node = *jvs_io++; - ERROR_LOG(AMBASEBOARDDEBUG, "JVS SET ADDRESS, node=%d", node); - msg.AddData(node == 1); - break; - default: - break; - } - - pptr += jvs_io_length; - } - - msg.End(); - - res[resp++] = ptr(0); - - unsigned char* buf = msg.m_msg; - int len = msg.m_ptr; - res[resp++] = len; - for (i = 0; i < len; ++i) - res[resp++] = buf[i]; - break; - } - case 0x60: - ERROR_LOG(AMBASEBOARDDEBUG, "GC-AM: Command 60, %02x %02x %02x", ptr(1), ptr(2), ptr(3)); - break; - default: - ERROR_LOG(AMBASEBOARDDEBUG, "GC-AM: Command %02x (unknown) %02x %02x %02x %02x %02x", - ptr(0), ptr(1), ptr(2), ptr(3), ptr(4), ptr(5)); - break; - } - p += ptr(1) + 2; - } - memset(_pBuffer, 0, _iLength); - - int len = resp - 2; - - p = 0; - res[1] = len; - csum = 0; - char logptr[1024]; - char* log = logptr; - for (i = 0; i < 0x7F; ++i) - { - csum += ptr(i) = res[i]; - log += sprintf(log, "%02x ", ptr(i)); - } - ptr(0x7f) = ~csum; - DEBUG_LOG(AMBASEBOARDDEBUG, "Command send back: %s", logptr); -#undef ptr - - // (tmbinc) hotfix: delay output by one command to work around their broken parser. this took - // me a month to find. ARG! - static unsigned char last[2][0x80]; - static int lastptr[2]; - - { - memcpy(last + 1, _pBuffer, 0x80); - memcpy(_pBuffer, last, 0x80); - memcpy(last, last + 1, 0x80); - - lastptr[1] = _iLength; - _iLength = lastptr[0]; - lastptr[0] = lastptr[1]; - } - - iPosition = _iLength; - break; - } - // DEFAULT - default: - { - ERROR_LOG(SERIALINTERFACE, "Unknown SI command (0x%x)", command); - PanicAlert("SI: Unknown command"); - iPosition = _iLength; - } - break; - } - } - - return iPosition; -} - -// Not really used on GC-AM -bool CSIDevice_AMBaseboard::GetData(u32& _Hi, u32& _Low) -{ - _Low = 0; - _Hi = 0x00800000; - - return true; -} - -void CSIDevice_AMBaseboard::SendCommand(u32 _Cmd, u8 _Poll) -{ - ERROR_LOG(SERIALINTERFACE, "Unknown direct command (0x%x)", _Cmd); - PanicAlert("SI: (GCAM) Unknown direct command"); -} diff --git a/Source/Core/Core/HW/SI_DeviceAMBaseboard.h b/Source/Core/Core/HW/SI_DeviceAMBaseboard.h deleted file mode 100644 index 920b3445f8..0000000000 --- a/Source/Core/Core/HW/SI_DeviceAMBaseboard.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2008 Dolphin Emulator Project -// Licensed under GPLv2+ -// Refer to the license.txt file included. - -#pragma once - -#include "Core/HW/SI_Device.h" - -// triforce (GC-AM) baseboard -class CSIDevice_AMBaseboard : public ISIDevice -{ -private: - enum EBufferCommands - { - CMD_RESET = 0x00, - CMD_GCAM = 0x70, - }; - -public: - // constructor - CSIDevice_AMBaseboard(SIDevices device, int _iDeviceNumber); - - // run the SI Buffer - int RunBuffer(u8* _pBuffer, int _iLength) override; - - // return true on new data - bool GetData(u32& _Hi, u32& _Low) override; - - // send a command directly - void SendCommand(u32 _Cmd, u8 _Poll) override; -}; diff --git a/Source/Core/DolphinWX/Config/GameCubeConfigPane.cpp b/Source/Core/DolphinWX/Config/GameCubeConfigPane.cpp index ce658bfcae..bd66b56705 100644 --- a/Source/Core/DolphinWX/Config/GameCubeConfigPane.cpp +++ b/Source/Core/DolphinWX/Config/GameCubeConfigPane.cpp @@ -33,7 +33,6 @@ #define EXIDEV_MIC_STR _trans("Microphone") #define EXIDEV_BBA_STR _trans("Broadband Adapter") #define EXIDEV_AGP_STR _trans("Advance Game Port") -#define EXIDEV_AM_BB_STR _trans("AM Baseboard") #define EXIDEV_GECKO_STR _trans("USB Gecko") GameCubeConfigPane::GameCubeConfigPane(wxWindow* parent, wxWindowID id) : wxPanel(parent, id) @@ -165,7 +164,6 @@ void GameCubeConfigPane::LoadGUIValues() sp1_devices.Add(_(DEV_NONE_STR)); sp1_devices.Add(_(DEV_DUMMY_STR)); sp1_devices.Add(_(EXIDEV_BBA_STR)); - sp1_devices.Add(_(EXIDEV_AM_BB_STR)); for (int i = 0; i < 3; ++i) { @@ -200,9 +198,6 @@ void GameCubeConfigPane::LoadGUIValues() case EXIDEVICE_ETH: m_exi_devices[i]->SetStringSelection(sp1_devices[2]); break; - case EXIDEVICE_AM_BASEBOARD: - m_exi_devices[i]->SetStringSelection(sp1_devices[3]); - break; case EXIDEVICE_DUMMY: default: m_exi_devices[i]->SetStringSelection(slot_devices[1]); @@ -282,8 +277,6 @@ void GameCubeConfigPane::ChooseEXIDevice(const wxString& deviceName, int deviceN tempType = EXIDEVICE_ETH; else if (!deviceName.compare(_(EXIDEV_AGP_STR))) tempType = EXIDEVICE_AGP; - else if (!deviceName.compare(_(EXIDEV_AM_BB_STR))) - tempType = EXIDEVICE_AM_BASEBOARD; else if (!deviceName.compare(_(EXIDEV_GECKO_STR))) tempType = EXIDEVICE_GECKO; else if (!deviceName.compare(_(DEV_NONE_STR))) diff --git a/Source/Core/DolphinWX/ControllerConfigDiag.cpp b/Source/Core/DolphinWX/ControllerConfigDiag.cpp index 3d8d12bbef..ff7e69838e 100644 --- a/Source/Core/DolphinWX/ControllerConfigDiag.cpp +++ b/Source/Core/DolphinWX/ControllerConfigDiag.cpp @@ -42,7 +42,7 @@ ControllerConfigDiag::ControllerConfigDiag(wxWindow* const parent) { m_gc_pad_type_strs = {{_("None"), _("Standard Controller"), _("GameCube Adapter for Wii U"), _("Steering Wheel"), _("Dance Mat"), _("DK Bongos"), _("GBA"), - _("Keyboard"), _("AM Baseboard")}}; + _("Keyboard")}}; wxBoxSizer* const main_sizer = new wxBoxSizer(wxVERTICAL); @@ -87,13 +87,8 @@ wxStaticBoxSizer* ControllerConfigDiag::CreateGamecubeSizer() const wxWindowID choice_id = wxWindow::NewControlId(); m_gc_port_choice_ids.emplace(choice_id, i); - // Only add AM-Baseboard to the first pad. - if (i == 0) - pad_type_choices[i] = new wxChoice(this, choice_id, wxDefaultPosition, wxDefaultSize, - m_gc_pad_type_strs.size(), m_gc_pad_type_strs.data()); - else - pad_type_choices[i] = new wxChoice(this, choice_id, wxDefaultPosition, wxDefaultSize, - m_gc_pad_type_strs.size() - 1, m_gc_pad_type_strs.data()); + pad_type_choices[i] = new wxChoice(this, choice_id, wxDefaultPosition, wxDefaultSize, + m_gc_pad_type_strs.size(), m_gc_pad_type_strs.data()); pad_type_choices[i]->Bind(wxEVT_CHOICE, &ControllerConfigDiag::OnGameCubePortChanged, this); @@ -126,9 +121,6 @@ wxStaticBoxSizer* ControllerConfigDiag::CreateGamecubeSizer() case SIDEVICE_GC_KEYBOARD: pad_type_choices[i]->SetStringSelection(m_gc_pad_type_strs[7]); break; - case SIDEVICE_AM_BASEBOARD: - pad_type_choices[i]->SetStringSelection(m_gc_pad_type_strs[8]); - break; default: pad_type_choices[i]->SetStringSelection(m_gc_pad_type_strs[0]); gamecube_configure_bt[i]->Disable(); @@ -483,11 +475,6 @@ void ControllerConfigDiag::OnGameCubePortChanged(wxCommandEvent& event) tempType = SIDEVICE_GC_KEYBOARD; gamecube_configure_bt[device_num]->Enable(); } - else if (device_name == m_gc_pad_type_strs[8]) - { - tempType = SIDEVICE_AM_BASEBOARD; - gamecube_configure_bt[device_num]->Enable(); - } else { tempType = SIDEVICE_NONE; diff --git a/Source/Core/DolphinWX/ControllerConfigDiag.h b/Source/Core/DolphinWX/ControllerConfigDiag.h index e91b405330..685befcfc7 100644 --- a/Source/Core/DolphinWX/ControllerConfigDiag.h +++ b/Source/Core/DolphinWX/ControllerConfigDiag.h @@ -81,7 +81,7 @@ private: std::map m_gc_port_choice_ids; std::map m_gc_port_config_ids; - std::array m_gc_pad_type_strs; + std::array m_gc_pad_type_strs; std::map m_wiimote_index_from_ctrl_id; unsigned int m_orig_wiimote_sources[MAX_BBMOTES];