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];