summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorMatthew Parlane <parlane@gmail.com>2013-01-08 21:18:48 +1300
committerMatthew Parlane <parlane@gmail.com>2013-01-08 21:18:48 +1300
commit5b96fb766f048ea320e4327d6f5481846ea15f4a (patch)
treeb67cedfb272bbac6c66058487df15d3654951624 /Source/Core
parent67d0e66af4fc211a7de052d5f377f55c02fa4b95 (diff)
parent1d44d3baf5cc0702b9e042687d63c5a72fd0f6b0 (diff)
Merge branch 'master' into wii-network
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Common/Src/ChunkFile.h2
-rw-r--r--Source/Core/Common/Src/MathUtil.h2
-rw-r--r--Source/Core/Core/CMakeLists.txt1
-rw-r--r--Source/Core/Core/Core.vcxproj2
-rw-r--r--Source/Core/Core/Core.vcxproj.filters6
-rw-r--r--Source/Core/Core/Src/HW/GCPad.cpp31
-rw-r--r--Source/Core/Core/Src/HW/GCPad.h1
-rw-r--r--Source/Core/Core/Src/HW/GCPadEmu.cpp16
-rw-r--r--Source/Core/Core/Src/HW/GCPadEmu.h3
-rw-r--r--Source/Core/Core/Src/HW/SI_Device.cpp5
-rw-r--r--Source/Core/Core/Src/HW/SI_DeviceGCSteeringWheel.cpp314
-rw-r--r--Source/Core/Core/Src/HW/SI_DeviceGCSteeringWheel.h119
-rw-r--r--Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp6
-rw-r--r--Source/Core/Core/Src/Movie.cpp8
-rw-r--r--Source/Core/Core/Src/Movie.h3
-rw-r--r--Source/Core/Core/Src/NetPlay.cpp11
-rw-r--r--Source/Core/Core/Src/PowerPC/PPCAnalyst.cpp16
-rw-r--r--Source/Core/DolphinWX/Src/ConfigMain.cpp19
-rw-r--r--Source/Core/DolphinWX/Src/GameListCtrl.cpp17
-rw-r--r--Source/Core/DolphinWX/Src/ISOFile.cpp6
-rw-r--r--Source/Core/DolphinWX/Src/ISOProperties.cpp20
-rw-r--r--Source/Core/DolphinWX/Src/ISOProperties.h2
-rw-r--r--Source/Core/DolphinWX/Src/VideoConfigDiag.cpp3
-rw-r--r--Source/Core/DolphinWX/resources/dolphin-emu.desktop9
-rw-r--r--Source/Core/InputCommon/Src/ControllerInterface/DInput/DInputJoystick.cpp19
-rw-r--r--Source/Core/VideoCommon/Src/BPFunctions.cpp2
26 files changed, 579 insertions, 64 deletions
diff --git a/Source/Core/Common/Src/ChunkFile.h b/Source/Core/Common/Src/ChunkFile.h
index be8b49a3a3..38e1b2176c 100644
--- a/Source/Core/Common/Src/ChunkFile.h
+++ b/Source/Core/Common/Src/ChunkFile.h
@@ -155,7 +155,7 @@ public:
Do(stringLen);
switch (mode) {
- case MODE_READ: x = (wchar_t*)*ptr; break;
+ case MODE_READ: x.assign((wchar_t*)*ptr, (stringLen / sizeof(wchar_t)) - 1); break;
case MODE_WRITE: memcpy(*ptr, x.c_str(), stringLen); break;
case MODE_MEASURE: break;
case MODE_VERIFY: _dbg_assert_msg_(COMMON, x == (wchar_t*)*ptr, "Savestate verification failure: \"%ls\" != \"%ls\" (at %p).\n", x.c_str(), (wchar_t*)*ptr, ptr); break;
diff --git a/Source/Core/Common/Src/MathUtil.h b/Source/Core/Common/Src/MathUtil.h
index c5f613ada1..a6290ff602 100644
--- a/Source/Core/Common/Src/MathUtil.h
+++ b/Source/Core/Common/Src/MathUtil.h
@@ -117,8 +117,6 @@ struct Rectangle
Rectangle(T theLeft, T theTop, T theRight, T theBottom)
: left(theLeft), top(theTop), right(theRight), bottom(theBottom)
{ }
-
- bool operator==(const Rectangle& r) { return left==r.left && top==r.top && right==r.right && bottom==r.bottom; }
T GetWidth() const { return abs(right - left); }
T GetHeight() const { return abs(bottom - top); }
diff --git a/Source/Core/Core/CMakeLists.txt b/Source/Core/Core/CMakeLists.txt
index 3efc6cab47..9ac0271658 100644
--- a/Source/Core/Core/CMakeLists.txt
+++ b/Source/Core/Core/CMakeLists.txt
@@ -115,6 +115,7 @@ set(SRCS Src/ActionReplay.cpp
Src/HW/SI_Device.cpp
Src/HW/SI_DeviceGBA.cpp
Src/HW/SI_DeviceGCController.cpp
+ Src/HW/SI_DeviceGCSteeringWheel.cpp
Src/HW/Sram.cpp
Src/HW/StreamADPCM.cpp
Src/HW/SystemTimers.cpp
diff --git a/Source/Core/Core/Core.vcxproj b/Source/Core/Core/Core.vcxproj
index a87b25932e..e539cfaa68 100644
--- a/Source/Core/Core/Core.vcxproj
+++ b/Source/Core/Core/Core.vcxproj
@@ -301,6 +301,7 @@
<ClCompile Include="Src\HW\SI_DeviceAMBaseboard.cpp" />
<ClCompile Include="Src\HW\SI_DeviceGBA.cpp" />
<ClCompile Include="Src\HW\SI_DeviceGCController.cpp" />
+ <ClCompile Include="Src\HW\SI_DeviceGCSteeringWheel.cpp" />
<ClCompile Include="Src\HW\Sram.cpp" />
<ClCompile Include="Src\HW\StreamADPCM.cpp" />
<ClCompile Include="Src\HW\SystemTimers.cpp" />
@@ -505,6 +506,7 @@
<ClInclude Include="Src\HW\SI_DeviceAMBaseboard.h" />
<ClInclude Include="Src\HW\SI_DeviceGBA.h" />
<ClInclude Include="Src\HW\SI_DeviceGCController.h" />
+ <ClInclude Include="Src\HW\SI_DeviceGCSteeringWheel.h" />
<ClInclude Include="Src\HW\Sram.h" />
<ClInclude Include="Src\HW\StreamADPCM.h" />
<ClInclude Include="Src\HW\SystemTimers.h" />
diff --git a/Source/Core/Core/Core.vcxproj.filters b/Source/Core/Core/Core.vcxproj.filters
index 65bcac2c14..c315f46904 100644
--- a/Source/Core/Core/Core.vcxproj.filters
+++ b/Source/Core/Core/Core.vcxproj.filters
@@ -290,6 +290,9 @@
<ClCompile Include="Src\HW\SI_DeviceGCController.cpp">
<Filter>HW %28Flipper/Hollywood%29\SI - Serial Interface</Filter>
</ClCompile>
+ <ClCompile Include="Src\HW\SI_DeviceGCSteeringWheel.cpp">
+ <Filter>HW %28Flipper/Hollywood%29\SI - Serial Interface</Filter>
+ </ClCompile>
<ClCompile Include="Src\HW\VideoInterface.cpp">
<Filter>HW %28Flipper/Hollywood%29\VI - Video Interface</Filter>
</ClCompile>
@@ -820,6 +823,9 @@
<ClInclude Include="Src\HW\SI_DeviceGCController.h">
<Filter>HW %28Flipper/Hollywood%29\SI - Serial Interface</Filter>
</ClInclude>
+ <ClInclude Include="Src\HW\SI_DeviceGCSteeringWheel.h">
+ <Filter>HW %28Flipper/Hollywood%29\SI - Serial Interface</Filter>
+ </ClInclude>
<ClInclude Include="Src\HW\SI.h">
<Filter>HW %28Flipper/Hollywood%29\SI - Serial Interface</Filter>
</ClInclude>
diff --git a/Source/Core/Core/Src/HW/GCPad.cpp b/Source/Core/Core/Src/HW/GCPad.cpp
index 4c1b4dabdd..68ba3ab88a 100644
--- a/Source/Core/Core/Src/HW/GCPad.cpp
+++ b/Source/Core/Core/Src/HW/GCPad.cpp
@@ -101,7 +101,36 @@ void Rumble(u8 _numPAD, unsigned int _uType, unsigned int _uStrength)
{
// TODO: this has potential to not stop rumble if user is messing with GUI at the perfect time
// set rumble
- ((GCPad*)g_plugin.controllers[ _numPAD ])->SetOutput( 1 == _uType && _uStrength > 2 );
+ if (1 == _uType && _uStrength > 2)
+ {
+ ((GCPad*)g_plugin.controllers[ _numPAD ])->SetOutput(255);
+ }
+ else
+ {
+ ((GCPad*)g_plugin.controllers[ _numPAD ])->SetOutput(0);
+ }
+ }
+}
+
+// __________________________________________________________________________________________________
+// Function: Motor
+// Purpose: For devices with constant Force feedback
+// input: Type - 06 = Motor On, 04 = Motor Off
+// Strength - 00 = Left Strong, 127 = Left Weak, 128 = Right Weak, 255 = Right Strong
+// output: none
+//
+void Motor(u8 _numPAD, unsigned int _uType, unsigned int _uStrength)
+{
+ std::unique_lock<std::recursive_mutex> lk(g_plugin.controls_lock, std::try_to_lock);
+
+ if (lk.owns_lock())
+ {
+ // TODO: this has potential to not stop rumble if user is messing with GUI at the perfect time
+ // set rumble
+ if (_uType == 6)
+ {
+ ((GCPad*)g_plugin.controllers[ _numPAD ])->SetMotor(_uStrength);
+ }
}
}
diff --git a/Source/Core/Core/Src/HW/GCPad.h b/Source/Core/Core/Src/HW/GCPad.h
index f7f6af2f20..fb07e82ccc 100644
--- a/Source/Core/Core/Src/HW/GCPad.h
+++ b/Source/Core/Core/Src/HW/GCPad.h
@@ -32,6 +32,7 @@ InputPlugin *GetPlugin();
void GetStatus(u8 _numPAD, SPADStatus* _pPADStatus);
void Rumble(u8 _numPAD, unsigned int _uType, unsigned int _uStrength);
+void Motor(u8 _numPAD, unsigned int _uType, unsigned int _uStrength);
bool GetMicButton(u8 pad);
}
diff --git a/Source/Core/Core/Src/HW/GCPadEmu.cpp b/Source/Core/Core/Src/HW/GCPadEmu.cpp
index 837c9104cc..a2c0c2afa9 100644
--- a/Source/Core/Core/Src/HW/GCPadEmu.cpp
+++ b/Source/Core/Core/Src/HW/GCPadEmu.cpp
@@ -130,7 +130,21 @@ void GCPad::GetInput(SPADStatus* const pad)
}
}
-void GCPad::SetOutput(const bool on)
+void GCPad::SetMotor(const u8 on)
+{
+ float state = (float)on / 255;
+ float force = abs(state - 0.5) * 2;
+ if (state < 0.5)
+ force = -force;
+
+ // only rumble if window has focus or background input is enabled
+ if (Host_RendererHasFocus() || m_options[0].settings[0]->value)
+ m_rumble->controls[0]->control_ref->State(force);
+ else
+ m_rumble->controls[0]->control_ref->State(0);
+}
+
+void GCPad::SetOutput(const u8 on)
{
// only rumble if window has focus or background input is enabled
m_rumble->controls[0]->control_ref->State(on && (Host_RendererHasFocus() || m_options[0].settings[0]->value));
diff --git a/Source/Core/Core/Src/HW/GCPadEmu.h b/Source/Core/Core/Src/HW/GCPadEmu.h
index 5185ff221c..e57e6b0b68 100644
--- a/Source/Core/Core/Src/HW/GCPadEmu.h
+++ b/Source/Core/Core/Src/HW/GCPadEmu.h
@@ -28,7 +28,8 @@ public:
GCPad(const unsigned int index);
void GetInput(SPADStatus* const pad);
- void SetOutput(const bool on);
+ void SetOutput(const u8 on);
+ void SetMotor(const u8 on);
bool GetMicButton() const;
diff --git a/Source/Core/Core/Src/HW/SI_Device.cpp b/Source/Core/Core/Src/HW/SI_Device.cpp
index 8abddbe472..062499f16f 100644
--- a/Source/Core/Core/Src/HW/SI_Device.cpp
+++ b/Source/Core/Core/Src/HW/SI_Device.cpp
@@ -17,6 +17,7 @@
#include "SI_Device.h"
#include "SI_DeviceGCController.h"
+#include "SI_DeviceGCSteeringWheel.h"
#include "SI_DeviceGBA.h"
#include "SI_DeviceAMBaseboard.h"
@@ -76,6 +77,10 @@ ISIDevice* SIDevice_Create(const SIDevices device, const int port_number)
return new CSIDevice_GCController(device, port_number);
break;
+ case SIDEVICE_GC_STEERING:
+ return new CSIDevice_GCSteeringWheel(device, port_number);
+ break;
+
case SIDEVICE_GC_TARUKONGA:
return new CSIDevice_TaruKonga(device, port_number);
break;
diff --git a/Source/Core/Core/Src/HW/SI_DeviceGCSteeringWheel.cpp b/Source/Core/Core/Src/HW/SI_DeviceGCSteeringWheel.cpp
new file mode 100644
index 0000000000..ade19b758e
--- /dev/null
+++ b/Source/Core/Core/Src/HW/SI_DeviceGCSteeringWheel.cpp
@@ -0,0 +1,314 @@
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "SI.h"
+#include "SI_Device.h"
+#include "SI_DeviceGCSteeringWheel.h"
+
+#include "EXI_Device.h"
+#include "EXI_DeviceMic.h"
+
+#include "GCPad.h"
+
+#include "../Movie.h"
+
+#include "../CoreTiming.h"
+#include "SystemTimers.h"
+#include "ProcessorInterface.h"
+#include "../Core.h"
+
+// --- standard gamecube controller ---
+CSIDevice_GCSteeringWheel::CSIDevice_GCSteeringWheel(SIDevices device, int _iDeviceNumber)
+ : ISIDevice(device, _iDeviceNumber)
+ , m_TButtonComboStart(0)
+ , m_TButtonCombo(0)
+ , m_LastButtonCombo(COMBO_NONE)
+{
+ memset(&m_Origin, 0, sizeof(SOrigin));
+ m_Origin.uCommand = CMD_ORIGIN;
+ m_Origin.uOriginStickX = 0x80; // center
+ m_Origin.uOriginStickY = 0x80;
+ m_Origin.uSubStickStickX = 0x80;
+ m_Origin.uSubStickStickY = 0x80;
+ m_Origin.uTrigger_L = 0x1F; // 0-30 is the lower deadzone
+ m_Origin.uTrigger_R = 0x1F;
+
+ // Dunno if we need to do this, game/lib should set it?
+ m_Mode = 0x03;
+}
+
+int CSIDevice_GCSteeringWheel::RunBuffer(u8* _pBuffer, int _iLength)
+{
+ // For debug logging only
+ ISIDevice::RunBuffer(_pBuffer, _iLength);
+
+ // Read the command
+ EBufferCommands command = static_cast<EBufferCommands>(_pBuffer[3]);
+
+ // Handle it
+ switch (command)
+ {
+ case CMD_RESET:
+ *(u32*)&_pBuffer[0] = SI_GC_STEERING;
+ break;
+
+ case CMD_ORIGIN:
+ {
+ INFO_LOG(SERIALINTERFACE, "PAD - Get Origin");
+ u8* pCalibration = reinterpret_cast<u8*>(&m_Origin);
+ for (int i = 0; i < (int)sizeof(SOrigin); i++)
+ {
+ _pBuffer[i ^ 3] = *pCalibration++;
+ }
+ }
+ break;
+
+ // Recalibrate (FiRES: i am not 100 percent sure about this)
+ case CMD_RECALIBRATE:
+ {
+ INFO_LOG(SERIALINTERFACE, "PAD - Recalibrate");
+ u8* pCalibration = reinterpret_cast<u8*>(&m_Origin);
+ for (int i = 0; i < (int)sizeof(SOrigin); i++)
+ {
+ _pBuffer[i ^ 3] = *pCalibration++;
+ }
+ }
+ break;
+
+ // Seen in F-Zero GX
+ case CMD_MOTOR_OFF:
+ break;
+
+ // DEFAULT
+ default:
+ {
+ ERROR_LOG(SERIALINTERFACE, "unknown SI command (0x%x)", command);
+ }
+ break;
+ }
+
+ return _iLength;
+}
+
+
+// GetData
+
+// Return true on new data (max 7 Bytes and 6 bits ;)
+// [00?SYXBA] [1LRZUDRL] [x] [y] [cx] [cy] [l] [r]
+// |\_ ERR_LATCH (error latched - check SISR)
+// |_ ERR_STATUS (error on last GetData or SendCmd?)
+bool CSIDevice_GCSteeringWheel::GetData(u32& _Hi, u32& _Low)
+{
+ SPADStatus PadStatus;
+ memset(&PadStatus, 0, sizeof(PadStatus));
+
+ Pad::GetStatus(ISIDevice::m_iDeviceNumber, &PadStatus);
+ Movie::CallInputManip(&PadStatus, ISIDevice::m_iDeviceNumber);
+
+ u32 netValues[2];
+ if (NetPlay_GetInput(ISIDevice::m_iDeviceNumber, PadStatus, netValues))
+ {
+ _Hi = netValues[0]; // first 4 bytes
+ _Low = netValues[1]; // last 4 bytes
+ return true;
+ }
+
+ Movie::SetPolledDevice();
+
+ if(Movie::IsPlayingInput())
+ {
+ Movie::PlayController(&PadStatus, ISIDevice::m_iDeviceNumber);
+ Movie::InputUpdate();
+ }
+ else if(Movie::IsRecordingInput())
+ {
+ Movie::RecordInput(&PadStatus, ISIDevice::m_iDeviceNumber);
+ Movie::InputUpdate();
+ }
+ else
+ Movie::CheckPadStatus(&PadStatus, ISIDevice::m_iDeviceNumber);
+
+ // Thankfully changing mode does not change the high bits ;)
+ _Hi = (u32)((u8)PadStatus.stickX); // Steering
+ _Hi |= 0x800; // Pedal connected flag
+ _Hi |= (u32)((u16)(PadStatus.button | PAD_USE_ORIGIN) << 16);
+
+ // Low bits are packed differently per mode
+ if (m_Mode == 0 || m_Mode == 5 || m_Mode == 7)
+ {
+ _Low = (u8)(PadStatus.analogB >> 4); // Top 4 bits
+ _Low |= (u32)((u8)(PadStatus.analogA >> 4) << 4); // Top 4 bits
+ _Low |= (u32)((u8)(PadStatus.triggerRight >> 4) << 8); // Top 4 bits
+ _Low |= (u32)((u8)(PadStatus.triggerLeft >> 4) << 12); // Top 4 bits
+ _Low |= (u32)((u8)(PadStatus.substickY) << 16); // All 8 bits
+ _Low |= (u32)((u8)(PadStatus.substickX) << 24); // All 8 bits
+ }
+ else if (m_Mode == 1)
+ {
+ _Low = (u8)(PadStatus.analogB >> 4); // Top 4 bits
+ _Low |= (u32)((u8)(PadStatus.analogA >> 4) << 4); // Top 4 bits
+ _Low |= (u32)((u8)PadStatus.triggerRight << 8); // All 8 bits
+ _Low |= (u32)((u8)PadStatus.triggerLeft << 16); // All 8 bits
+ _Low |= (u32)((u8)PadStatus.substickY << 24); // Top 4 bits
+ _Low |= (u32)((u8)PadStatus.substickX << 28); // Top 4 bits
+ }
+ else if (m_Mode == 2)
+ {
+ _Low = (u8)(PadStatus.analogB); // All 8 bits
+ _Low |= (u32)((u8)(PadStatus.analogA) << 8); // All 8 bits
+ _Low |= (u32)((u8)(PadStatus.triggerRight >> 4) << 16); // Top 4 bits
+ _Low |= (u32)((u8)(PadStatus.triggerLeft >> 4) << 20); // Top 4 bits
+ _Low |= (u32)((u8)PadStatus.substickY << 24); // Top 4 bits
+ _Low |= (u32)((u8)PadStatus.substickX << 28); // Top 4 bits
+ }
+ else if (m_Mode == 3)
+ {
+ // Analog A/B are always 0
+ _Low = (u8)PadStatus.triggerRight; // All 8 bits
+ _Low |= (u32)((u8)PadStatus.triggerLeft << 8); // All 8 bits
+ _Low |= (u32)((u8)PadStatus.substickY << 16); // All 8 bits
+ _Low |= (u32)((u8)PadStatus.substickX << 24); // All 8 bits
+ }
+ else if (m_Mode == 4)
+ {
+ _Low = (u8)(PadStatus.analogB); // All 8 bits
+ _Low |= (u32)((u8)(PadStatus.analogA) << 8); // All 8 bits
+ // triggerLeft/Right are always 0
+ _Low |= (u32)((u8)PadStatus.substickY << 16); // All 8 bits
+ _Low |= (u32)((u8)PadStatus.substickX << 24); // All 8 bits
+ }
+ else if (m_Mode == 6)
+ {
+ _Low = (u8)PadStatus.triggerRight; // All 8 bits
+ _Low |= (u32)((u8)PadStatus.triggerLeft << 8); // All 8 bits
+
+ // The GC Steering Wheel appears to have combined pedals
+ // (both the Accelerate and Brake pedals are mapped to a single axis)
+ // We use the stickY axis for the pedals.
+ if (PadStatus.stickY < 128)
+ _Low |= (u32)((u8)(255 - ((PadStatus.stickY & 0x7f) * 2)) << 16); // All 8 bits (Brake)
+ if (PadStatus.stickY >= 128)
+ _Low |= (u32)((u8)((PadStatus.stickY & 0x7f) * 2) << 24); // All 8 bits (Accelerate)
+ }
+
+ // Keep track of the special button combos (embedded in controller hardware... :( )
+ EButtonCombo tempCombo;
+ if ((PadStatus.button & 0xff00) == (PAD_BUTTON_Y|PAD_BUTTON_X|PAD_BUTTON_START))
+ tempCombo = COMBO_ORIGIN;
+ else if ((PadStatus.button & 0xff00) == (PAD_BUTTON_B|PAD_BUTTON_X|PAD_BUTTON_START))
+ tempCombo = COMBO_RESET;
+ else
+ tempCombo = COMBO_NONE;
+ if (tempCombo != m_LastButtonCombo)
+ {
+ m_LastButtonCombo = tempCombo;
+ if (m_LastButtonCombo != COMBO_NONE)
+ m_TButtonComboStart = CoreTiming::GetTicks();
+ }
+ if (m_LastButtonCombo != COMBO_NONE)
+ {
+ m_TButtonCombo = CoreTiming::GetTicks();
+ if ((m_TButtonCombo - m_TButtonComboStart) > SystemTimers::GetTicksPerSecond() * 3)
+ {
+ if (m_LastButtonCombo == COMBO_RESET)
+ ProcessorInterface::ResetButton_Tap();
+ else if (m_LastButtonCombo == COMBO_ORIGIN)
+ {
+ m_Origin.uOriginStickX = PadStatus.stickX;
+ m_Origin.uOriginStickY = PadStatus.stickY;
+ m_Origin.uSubStickStickX = PadStatus.substickX;
+ m_Origin.uSubStickStickY = PadStatus.substickY;
+ m_Origin.uTrigger_L = PadStatus.triggerLeft;
+ m_Origin.uTrigger_R = PadStatus.triggerRight;
+ }
+ m_LastButtonCombo = COMBO_NONE;
+ }
+ }
+
+ return true;
+}
+
+
+// SendCommand
+void CSIDevice_GCSteeringWheel::SendCommand(u32 _Cmd, u8 _Poll)
+{
+ UCommand command(_Cmd);
+
+ switch (command.Command)
+ {
+ // Costis sent it in some demos :)
+ case 0x00:
+ break;
+
+ case CMD_FORCE:
+ {
+ unsigned int uStrength = command.Parameter1; // 0 = left strong, 127 = left weak, 128 = right weak, 255 = right strong
+ unsigned int uType = command.Parameter2; // 06 = motor on, 04 = motor off
+
+ // get the correct pad number that should rumble locally when using netplay
+ const u8 numPAD = NetPlay_GetPadNum(ISIDevice::m_iDeviceNumber);
+
+ if (numPAD < 4)
+ Pad::Motor(numPAD, uType, uStrength);
+
+ if (!_Poll)
+ {
+ m_Mode = command.Parameter2;
+ INFO_LOG(SERIALINTERFACE, "PAD %i set to mode %i", ISIDevice::m_iDeviceNumber, m_Mode);
+ }
+ }
+ break;
+
+ case CMD_WRITE:
+ {
+ unsigned int uType = command.Parameter1; // 0 = stop, 1 = rumble, 2 = stop hard
+ unsigned int uStrength = command.Parameter2;
+
+ // get the correct pad number that should rumble locally when using netplay
+ const u8 numPAD = NetPlay_GetPadNum(ISIDevice::m_iDeviceNumber);
+
+ if (numPAD < 4)
+ Pad::Rumble(numPAD, uType, uStrength);
+
+ if (!_Poll)
+ {
+ m_Mode = command.Parameter2;
+ INFO_LOG(SERIALINTERFACE, "PAD %i set to mode %i", ISIDevice::m_iDeviceNumber, m_Mode);
+ }
+ }
+ break;
+
+ default:
+ {
+ ERROR_LOG(SERIALINTERFACE, "unknown direct command (0x%x)", _Cmd);
+ }
+ break;
+ }
+}
+
+// Savestate support
+void CSIDevice_GCSteeringWheel::DoState(PointerWrap& p)
+{
+ p.Do(m_Origin);
+ p.Do(m_Mode);
+ p.Do(m_TButtonComboStart);
+ p.Do(m_TButtonCombo);
+ p.Do(m_LastButtonCombo);
+}
diff --git a/Source/Core/Core/Src/HW/SI_DeviceGCSteeringWheel.h b/Source/Core/Core/Src/HW/SI_DeviceGCSteeringWheel.h
new file mode 100644
index 0000000000..2245765863
--- /dev/null
+++ b/Source/Core/Core/Src/HW/SI_DeviceGCSteeringWheel.h
@@ -0,0 +1,119 @@
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#ifndef _SI_DEVICEGCSTEERINGWHEEL_H
+#define _SI_DEVICEGCSTEERINGWHEEL_H
+
+#include "SI_Device.h"
+#include "GCPadStatus.h"
+
+
+// standard gamecube controller
+class CSIDevice_GCSteeringWheel : public ISIDevice
+{
+private:
+
+ // Commands
+ enum EBufferCommands
+ {
+ CMD_RESET = 0x00,
+ CMD_ORIGIN = 0x41,
+ CMD_RECALIBRATE = 0x42,
+ CMD_MOTOR_OFF = 0xff,
+ };
+
+ struct SOrigin
+ {
+ u8 uCommand;// Maybe should be button bits?
+ u8 unk_1; // ..and this would be the other half
+ u8 uOriginStickX;
+ u8 uOriginStickY;
+ u8 uSubStickStickX;
+ u8 uSubStickStickY;
+ u8 uTrigger_L;
+ u8 uTrigger_R;
+ u8 unk_4;
+ u8 unk_5;
+ u8 unk_6;
+ u8 unk_7;
+ };
+
+ enum EDirectCommands
+ {
+ CMD_FORCE = 0x30,
+ CMD_WRITE = 0x40
+ };
+
+ union UCommand
+ {
+ u32 Hex;
+ struct
+ {
+ u32 Parameter1 : 8;
+ u32 Parameter2 : 8;
+ u32 Command : 8;
+ u32 : 8;
+ };
+ UCommand() {Hex = 0;}
+ UCommand(u32 _iValue) {Hex = _iValue;}
+ };
+
+ enum EButtonCombo
+ {
+ COMBO_NONE = 0,
+ COMBO_ORIGIN,
+ COMBO_RESET
+ };
+
+ // struct to compare input against
+ // Set on connection and (standard pad only) on button combo
+ SOrigin m_Origin;
+
+ // PADAnalogMode
+ u8 m_Mode;
+
+ // Timer to track special button combos:
+ // y, X, start for 3 seconds updates origin with current status
+ // Technically, the above is only on standard pad, wavebird does not support it for example
+ // b, x, start for 3 seconds triggers reset (PI reset button interrupt)
+ u64 m_TButtonComboStart, m_TButtonCombo;
+ // Type of button combo from the last/current poll
+ EButtonCombo m_LastButtonCombo;
+
+public:
+
+ // Constructor
+ CSIDevice_GCSteeringWheel(SIDevices device, int _iDeviceNumber);
+
+ // Run the SI Buffer
+ virtual int RunBuffer(u8* _pBuffer, int _iLength);
+
+ // Send and Receive pad input from network
+ static bool NetPlay_GetInput(u8 numPAD, SPADStatus status, u32 *PADStatus);
+ static u8 NetPlay_GetPadNum(u8 numPAD);
+
+ // Return true on new data
+ virtual bool GetData(u32& _Hi, u32& _Low);
+
+ // Send a command directly
+ virtual void SendCommand(u32 _Cmd, u8 _Poll);
+
+ // Savestate support
+ virtual void DoState(PointerWrap& p);
+};
+
+#endif
diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp
index 7eb5e89018..e85797b8f8 100644
--- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp
+++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp
@@ -256,15 +256,15 @@ void DoState(PointerWrap &p)
u32 i;
for (i=0; i<IPC_MAX_FDS; i++)
{
- u32 exists;
+ u32 exists = 0;
p.Do(exists);
if (exists)
{
- u32 isHw;
+ u32 isHw = 0;
p.Do(isHw);
if (isHw)
{
- u32 hwId;
+ u32 hwId = 0;
p.Do(hwId);
g_FdMap[i] = AccessDeviceByID(hwId);
}
diff --git a/Source/Core/Core/Src/Movie.cpp b/Source/Core/Core/Src/Movie.cpp
index 5eb1660d8e..316181d449 100644
--- a/Source/Core/Core/Src/Movie.cpp
+++ b/Source/Core/Core/Src/Movie.cpp
@@ -36,6 +36,7 @@
#include "HW/DVDInterface.h"
#include "../../Common/Src/NandPaths.h"
#include "Crypto/md5.h"
+#include "scmrev.h"
// The chunk to allocate movie data in multiples of.
#define DTM_BASE_LENGTH (1024)
@@ -72,6 +73,7 @@ std::string author = "";
u64 g_titleID = 0;
unsigned char MD5[16];
u8 bongos;
+u8 revision[20];
bool g_bRecordingFromSaveState = false;
bool g_bPolled = false;
@@ -687,6 +689,7 @@ void ReadHeader()
g_bClearSave = tmpHeader.bClearSave;
bMemcard = tmpHeader.bMemcard;
bongos = tmpHeader.bongos;
+ memcpy(revision, tmpHeader.revision, ARRAYSIZE(revision));
}
else
{
@@ -1132,6 +1135,7 @@ void SaveRecording(const char *filename)
strncpy((char *)header.author, author.c_str(),ARRAYSIZE(header.author));
memcpy(header.md5,MD5,16);
header.bongos = bongos;
+ memcpy(header.revision, revision, ARRAYSIZE(header.revision));
// TODO
header.uniqueID = 0;
@@ -1189,6 +1193,10 @@ void GetSettings()
if (!Core::g_CoreStartupParameter.bWii)
g_bClearSave = !File::Exists(SConfig::GetInstance().m_strMemoryCardA);
bMemcard = SConfig::GetInstance().m_EXIDevice[0] == EXIDEVICE_MEMORYCARD;
+
+ std::stringstream ss;
+ ss << std::hex << SCM_REV_STR;
+ ss >> revision;
}
void CheckMD5()
diff --git a/Source/Core/Core/Src/Movie.h b/Source/Core/Core/Src/Movie.h
index 2cb4c78e23..79b5e72f29 100644
--- a/Source/Core/Core/Src/Movie.h
+++ b/Source/Core/Core/Src/Movie.h
@@ -121,7 +121,8 @@ struct DTMHeader {
u8 bongos;
u8 reserved[15]; // Padding for any new config options
u8 discChange[40]; // Name of iso file to switch to, for two disc games.
- u8 reserved2[47]; // Make heading 256 bytes, just because we can
+ u8 revision[20]; // Git hash
+ u8 reserved2[27]; // Make heading 256 bytes, just because we can
};
static_assert(sizeof(DTMHeader) == 256, "DTMHeader should be 256 bytes");
diff --git a/Source/Core/Core/Src/NetPlay.cpp b/Source/Core/Core/Src/NetPlay.cpp
index 1c19f763ec..05331bc6cc 100644
--- a/Source/Core/Core/Src/NetPlay.cpp
+++ b/Source/Core/Core/Src/NetPlay.cpp
@@ -22,6 +22,7 @@
#include "IPC_HLE/WII_IPC_HLE_WiiMote.h"
// for gcpad
#include "HW/SI_DeviceGCController.h"
+#include "HW/SI_DeviceGCSteeringWheel.h"
// for gctime
#include "HW/EXI_DeviceIPL.h"
// for wiimote/ OSD messages
@@ -296,6 +297,11 @@ bool CSIDevice_GCController::NetPlay_GetInput(u8 numPAD, SPADStatus PadStatus, u
return false;
}
+bool CSIDevice_GCSteeringWheel::NetPlay_GetInput(u8 numPAD, SPADStatus PadStatus, u32 *PADStatus)
+{
+ return CSIDevice_GCController::NetPlay_GetInput(numPAD, PadStatus, PADStatus);
+}
+
// called from ---CPU--- thread
// so all players' games get the same time
u32 CEXIIPL::NetPlay_GetGCTime()
@@ -320,6 +326,11 @@ u8 CSIDevice_GCController::NetPlay_GetPadNum(u8 numPAD)
return numPAD;
}
+u8 CSIDevice_GCSteeringWheel::NetPlay_GetPadNum(u8 numPAD)
+{
+ return CSIDevice_GCController::NetPlay_GetPadNum(numPAD);
+}
+
// called from ---CPU--- thread
// wiimote update / used for frame counting
//void CWII_IPC_HLE_Device_usb_oh1_57e_305::NetPlay_WiimoteUpdate(int _number)
diff --git a/Source/Core/Core/Src/PowerPC/PPCAnalyst.cpp b/Source/Core/Core/Src/PowerPC/PPCAnalyst.cpp
index ddfec1c328..fa9f278c29 100644
--- a/Source/Core/Core/Src/PowerPC/PPCAnalyst.cpp
+++ b/Source/Core/Core/Src/PowerPC/PPCAnalyst.cpp
@@ -246,17 +246,13 @@ bool CanSwapAdjacentOps(const CodeOp &a, const CodeOp &b)
return false;
}
- // For now, only integer ops acceptable.
- switch (b_info->type) {
- case OPTYPE_INTEGER:
- case OPTYPE_LOAD:
- case OPTYPE_STORE:
- //case OPTYPE_LOADFP:
- //case OPTYPE_STOREFP:
- break;
- default:
+ // For now, only integer ops acceptable. Any instruction which can raise an
+ // interrupt is *not* a possible swap candidate: see [1] for an example of
+ // a crash caused by this error.
+ //
+ // [1] https://code.google.com/p/dolphin-emu/issues/detail?id=5864#c7
+ if (b_info->type != OPTYPE_INTEGER)
return false;
- }
// Check that we have no register collisions.
// That is, check that none of b's outputs matches any of a's inputs,
diff --git a/Source/Core/DolphinWX/Src/ConfigMain.cpp b/Source/Core/DolphinWX/Src/ConfigMain.cpp
index 76508daf7c..ce4cd9cb22 100644
--- a/Source/Core/DolphinWX/Src/ConfigMain.cpp
+++ b/Source/Core/DolphinWX/Src/ConfigMain.cpp
@@ -79,6 +79,7 @@ static const wxLanguage langIds[] =
#define DEV_DUMMY_STR _trans("Dummy")
#define SIDEV_STDCONT_STR _trans("Standard Controller")
+#define SIDEV_STEERING_STR _trans("Steering Wheel")
#define SIDEV_BONGO_STR _trans("TaruKonga (Bongos)")
#define SIDEV_GBA_STR "GBA"
#define SIDEV_AM_BB_STR _trans("AM-Baseboard")
@@ -391,6 +392,7 @@ void CConfigMain::InitializeGUIValues()
wxArrayString SIDevices;
SIDevices.Add(_(DEV_NONE_STR));
SIDevices.Add(_(SIDEV_STDCONT_STR));
+ SIDevices.Add(_(SIDEV_STEERING_STR));
SIDevices.Add(_(SIDEV_BONGO_STR));
SIDevices.Add(_(SIDEV_GBA_STR));
SIDevices.Add(_(SIDEV_AM_BB_STR));
@@ -443,15 +445,18 @@ void CConfigMain::InitializeGUIValues()
case SIDEVICE_GC_CONTROLLER:
GCSIDevice[i]->SetStringSelection(SIDevices[1]);
break;
- case SIDEVICE_GC_TARUKONGA:
+ case SIDEVICE_GC_STEERING:
GCSIDevice[i]->SetStringSelection(SIDevices[2]);
break;
- case SIDEVICE_GC_GBA:
+ case SIDEVICE_GC_TARUKONGA:
GCSIDevice[i]->SetStringSelection(SIDevices[3]);
break;
- case SIDEVICE_AM_BASEBOARD:
+ case SIDEVICE_GC_GBA:
GCSIDevice[i]->SetStringSelection(SIDevices[4]);
break;
+ case SIDEVICE_AM_BASEBOARD:
+ GCSIDevice[i]->SetStringSelection(SIDevices[5]);
+ break;
default:
GCSIDevice[i]->SetStringSelection(SIDevices[0]);
break;
@@ -618,6 +623,12 @@ void CConfigMain::CreateGUIControls()
FrequencySelection->Append(wxString::Format(_("%d Hz"), 48000));
FrequencySelection->Append(wxString::Format(_("%d Hz"), 32000));
+ if (Core::GetState() != Core::CORE_UNINITIALIZED)
+ {
+ FrequencySelection->Disable();
+ BackendSelection->Disable();
+ }
+
// Create sizer and add items to dialog
wxStaticBoxSizer *sbAudioSettings = new wxStaticBoxSizer(wxVERTICAL, AudioPage, _("Sound Settings"));
sbAudioSettings->Add(DSPEngine, 0, wxALL | wxEXPAND, 5);
@@ -1053,6 +1064,8 @@ void CConfigMain::ChooseSIDevice(wxString deviceName, int deviceNum)
SIDevices tempType;
if (!deviceName.compare(WXSTR_TRANS(SIDEV_STDCONT_STR)))
tempType = SIDEVICE_GC_CONTROLLER;
+ else if (!deviceName.compare(WXSTR_TRANS(SIDEV_STEERING_STR)))
+ tempType = SIDEVICE_GC_STEERING;
else if (!deviceName.compare(WXSTR_TRANS(SIDEV_BONGO_STR)))
tempType = SIDEVICE_GC_TARUKONGA;
else if (!deviceName.compare(wxT(SIDEV_GBA_STR)))
diff --git a/Source/Core/DolphinWX/Src/GameListCtrl.cpp b/Source/Core/DolphinWX/Src/GameListCtrl.cpp
index fbefb1c769..c67ee83ed3 100644
--- a/Source/Core/DolphinWX/Src/GameListCtrl.cpp
+++ b/Source/Core/DolphinWX/Src/GameListCtrl.cpp
@@ -464,14 +464,15 @@ void CGameListCtrl::InsertItemInReportView(long _Index)
SelectedLanguage = 0;
default:
{
- wxCSConv WindowsCP1252(wxFontMapper::GetEncodingName(wxFONTENCODING_CP1252));
- rISOFile.GetName(wstring_name, SelectedLanguage);
-
- name = wxString(rISOFile.GetName(SelectedLanguage).c_str(), WindowsCP1252);
- m_gameList.append(StringFromFormat("%s (%c)\n",
- rISOFile.GetName(SelectedLanguage).c_str(), (rISOFile.GetCountry() == DiscIO::IVolume::COUNTRY_USA)?'U':'E'));
- description = wxString(company.size() ? company.c_str() :
- rISOFile.GetDescription(SelectedLanguage).c_str(), WindowsCP1252);
+ wxCSConv WindowsCP1252(wxFontMapper::GetEncodingName(wxFONTENCODING_CP1252));
+ rISOFile.GetName(wstring_name, SelectedLanguage);
+
+ name = wxString(rISOFile.GetName(SelectedLanguage).c_str(), WindowsCP1252);
+ m_gameList.append(StringFromFormat("%s (%c)\n",
+ rISOFile.GetName(SelectedLanguage).c_str(),
+ (rISOFile.GetCountry() == DiscIO::IVolume::COUNTRY_USA) ? 'U' : 'E'));
+ description = wxString(company.size() ? company.c_str() :
+ rISOFile.GetDescription(SelectedLanguage).c_str(), WindowsCP1252);
}
break;
}
diff --git a/Source/Core/DolphinWX/Src/ISOFile.cpp b/Source/Core/DolphinWX/Src/ISOFile.cpp
index a3d3761e62..a00ce2c496 100644
--- a/Source/Core/DolphinWX/Src/ISOFile.cpp
+++ b/Source/Core/DolphinWX/Src/ISOFile.cpp
@@ -140,8 +140,8 @@ GameListItem::GameListItem(const std::string& _rFileName)
SplitPath(m_FileName, NULL, &FileName, NULL);
int length = FileName.length();
wFileName.reserve(length+1);
- for (int i = 0; i < length; ++i)
- wFileName.push_back(FileName[i]);
+ for (int j = 0; j < length; ++j)
+ wFileName.push_back(FileName[j]);
wFileName.push_back(0);
}
*i = wFileName;
@@ -283,7 +283,7 @@ bool GameListItem::GetName(std::wstring& wName, int index) const
// This function will only succeed for wii discs with banners or WADs
// utilize the same array as for gc discs (-1= Japanese, 0 = English etc
index++;
- if ((index >=0) && (index < 10))
+ if ((index >= 0) && (index < 10))
{
if (m_wNames.size() > (size_t)index)
{
diff --git a/Source/Core/DolphinWX/Src/ISOProperties.cpp b/Source/Core/DolphinWX/Src/ISOProperties.cpp
index 61139d985f..0b75b03d59 100644
--- a/Source/Core/DolphinWX/Src/ISOProperties.cpp
+++ b/Source/Core/DolphinWX/Src/ISOProperties.cpp
@@ -328,7 +328,6 @@ void CISOProperties::CreateGUIControls(bool IsWad)
DSPHLE = new wxCheckBox(m_GameConfig, ID_AUDIO_DSP_HLE, _("DSP HLE emulation (fast)"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER, wxDefaultValidator);
// Wii Console
- EnableProgressiveScan = new wxCheckBox(m_GameConfig, ID_ENABLEPROGRESSIVESCAN, _("Enable Progressive Scan"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER, wxDefaultValidator);
EnableWideScreen = new wxCheckBox(m_GameConfig, ID_ENABLEWIDESCREEN, _("Enable WideScreen"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER, wxDefaultValidator);
DisableWiimoteSpeaker = new wxCheckBox(m_GameConfig, ID_DISABLEWIIMOTESPEAKER, _("Alternate Wiimote Timing"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER, wxDefaultValidator);
DisableWiimoteSpeaker->SetToolTip(_("Mutes the Wiimote speaker. Fixes random disconnections on real wiimotes. No effect on emulated wiimotes."));
@@ -378,18 +377,9 @@ void CISOProperties::CreateGUIControls(bool IsWad)
if (!DiscIO::IsVolumeWiiDisc(OpenISO) && !DiscIO::IsVolumeWadFile(OpenISO))
{
sbWiiOverrides->ShowItems(false);
- EnableProgressiveScan->Hide();
EnableWideScreen->Hide();
DisableWiimoteSpeaker->Hide();
}
- else
- {
- // Progressive Scan is not used by Dolphin itself, and changing it on a per-game
- // basis would have the side-effect of changing the SysConf, making this setting
- // rather useless.
- EnableProgressiveScan->Disable();
- }
- sbWiiOverrides->Add(EnableProgressiveScan, 0, wxLEFT, 5);
sbWiiOverrides->Add(EnableWideScreen, 0, wxLEFT, 5);
sbWiiOverrides->Add(DisableWiimoteSpeaker, 0, wxLEFT, 5);
@@ -971,11 +961,6 @@ void CISOProperties::LoadGameConfig()
else
DSPHLE->Set3StateValue(wxCHK_UNDETERMINED);
- if (GameIni.Get("Display", "ProgressiveScan", &bTemp))
- EnableProgressiveScan->Set3StateValue((wxCheckBoxState)bTemp);
- else
- EnableProgressiveScan->Set3StateValue(wxCHK_UNDETERMINED);
-
// ??
if (GameIni.Get("Wii", "Widescreen", &bTemp))
EnableWideScreen->Set3StateValue((wxCheckBoxState)bTemp);
@@ -1071,11 +1056,6 @@ bool CISOProperties::SaveGameConfig()
else
GameIni.Set("Core", "DSPHLE", DSPHLE->Get3StateValue());
- if (EnableProgressiveScan->Get3StateValue() == wxCHK_UNDETERMINED)
- GameIni.DeleteKey("Display", "ProgressiveScan");
- else
- GameIni.Set("Display", "ProgressiveScan", EnableProgressiveScan->Get3StateValue());
-
if (EnableWideScreen->Get3StateValue() == wxCHK_UNDETERMINED)
GameIni.DeleteKey("Wii", "Widescreen");
else
diff --git a/Source/Core/DolphinWX/Src/ISOProperties.h b/Source/Core/DolphinWX/Src/ISOProperties.h
index da275136fe..9d71e675e2 100644
--- a/Source/Core/DolphinWX/Src/ISOProperties.h
+++ b/Source/Core/DolphinWX/Src/ISOProperties.h
@@ -72,7 +72,7 @@ private:
wxCheckBox *CPUThread, *SkipIdle, *MMU, *MMUBAT, *TLBHack;
wxCheckBox *VBeam, *FastDiscSpeed, *BlockMerging, *DSPHLE;
// Wii
- wxCheckBox *EnableProgressiveScan, *EnableWideScreen, *DisableWiimoteSpeaker;
+ wxCheckBox *EnableWideScreen, *DisableWiimoteSpeaker;
// Video
wxCheckBox *UseZTPSpeedupHack, *PHackEnable, *UseBBox;
wxButton *PHSettings;
diff --git a/Source/Core/DolphinWX/Src/VideoConfigDiag.cpp b/Source/Core/DolphinWX/Src/VideoConfigDiag.cpp
index 20bd4dfb38..f59c7c34c9 100644
--- a/Source/Core/DolphinWX/Src/VideoConfigDiag.cpp
+++ b/Source/Core/DolphinWX/Src/VideoConfigDiag.cpp
@@ -405,6 +405,7 @@ VideoConfigDiag::VideoConfigDiag(wxWindow* parent, const std::string &title, con
_3d_vision = CreateCheckBox(page_enh, _("3D Vision"), wxGetTranslation(_3d_vision_desc), vconfig.b3DVision);
_3d_vision->Show(vconfig.backend_info.bSupports3DVision);
szr_enh->Add(_3d_vision);
+ szr_enh->Add(CreateCheckBox(page_enh, _("Widescreen Hack"), wxGetTranslation(ws_hack_desc), vconfig.bWidescreenHack));
// TODO: Add anaglyph 3d here
wxStaticBoxSizer* const group_enh = new wxStaticBoxSizer(wxVERTICAL, page_enh, _("Enhancements"));
@@ -553,8 +554,6 @@ VideoConfigDiag::VideoConfigDiag(wxWindow* parent, const std::string &title, con
szr_misc->Add(CreateCheckBox(page_advanced, _("Crop"), wxGetTranslation(crop_desc), vconfig.bCrop));
szr_misc->Add(CreateCheckBox(page_advanced, _("Enable Hotkeys"), wxGetTranslation(hotkeys_desc), vconfig.bOSDHotKey));
- szr_misc->Add(CreateCheckBox(page_advanced, _("Widescreen Hack"), wxGetTranslation(ws_hack_desc), vconfig.bWidescreenHack));
-
// Progressive Scan
{
wxCheckBox* const cb_prog_scan = new wxCheckBox(page_advanced, wxID_ANY, _("Enable Progressive Scan"));
diff --git a/Source/Core/DolphinWX/resources/dolphin-emu.desktop b/Source/Core/DolphinWX/resources/dolphin-emu.desktop
new file mode 100644
index 0000000000..f201f07f22
--- /dev/null
+++ b/Source/Core/DolphinWX/resources/dolphin-emu.desktop
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Version=1.0
+Type=Application
+Name=Dolphin Emulator
+Comment=A Wii/GameCube Emulator
+Icon=dolphin-emu
+Exec=dolphin-emu
+Categories=Game;
+
diff --git a/Source/Core/InputCommon/Src/ControllerInterface/DInput/DInputJoystick.cpp b/Source/Core/InputCommon/Src/ControllerInterface/DInput/DInputJoystick.cpp
index 08d62bcfc1..af6ee7e77c 100644
--- a/Source/Core/InputCommon/Src/ControllerInterface/DInput/DInputJoystick.cpp
+++ b/Source/Core/InputCommon/Src/ControllerInterface/DInput/DInputJoystick.cpp
@@ -254,9 +254,9 @@ Joystick::Joystick( /*const LPCDIDEVICEINSTANCE lpddi, */const LPDIRECTINPUTDEVI
for (unsigned int offset = 0; offset < DIJOFS_BUTTON(0) / sizeof(LONG); ++offset)
{
range.diph.dwObj = offset * sizeof(LONG);
- // try to set some nice power of 2 values (8192)
- range.lMin = -(1 << 13);
- range.lMax = (1 << 13);
+ // try to set some nice power of 2 values (128) to match the GameCube controls
+ range.lMin = -(1 << 7);
+ range.lMax = (1 << 7);
m_device->SetProperty(DIPROP_RANGE, &range.diph);
// but i guess not all devices support setting range
// so i getproperty right afterward incase it didn't set :P
@@ -281,17 +281,19 @@ Joystick::Joystick( /*const LPCDIDEVICEINSTANCE lpddi, */const LPDIRECTINPUTDEVI
if ( objects.size() )
{
// temporary
- DWORD rgdwAxes[] = {DIJOFS_X, DIJOFS_Y};
- LONG rglDirection[] = {0, 0};
+ DWORD rgdwAxes[2] = {DIJOFS_X, DIJOFS_Y};
+ LONG rglDirection[2] = {-200, 0};
DIEFFECT eff;
ZeroMemory(&eff, sizeof(eff));
eff.dwSize = sizeof(DIEFFECT);
eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
eff.dwDuration = INFINITE; // (4 * DI_SECONDS)
+ eff.dwSamplePeriod = 0;
eff.dwGain = DI_FFNOMINALMAX;
eff.dwTriggerButton = DIEB_NOTRIGGER;
- eff.cAxes = std::min((DWORD)2, (DWORD)objects.size());
+ eff.dwTriggerRepeatInterval = 0;
+ eff.cAxes = std::min((DWORD)1, (DWORD)objects.size());
eff.rgdwAxes = rgdwAxes;
eff.rglDirection = rglDirection;
@@ -310,7 +312,12 @@ Joystick::Joystick( /*const LPCDIDEVICEINSTANCE lpddi, */const LPDIRECTINPUTDEVI
{
// ugly if ladder
if (0 == f)
+ {
+ DICONSTANTFORCE diCF = {-10000};
+ diCF.lMagnitude = DI_FFNOMINALMAX;
eff.cbTypeSpecificParams = sizeof(DICONSTANTFORCE);
+ eff.lpvTypeSpecificParams = &diCF;
+ }
else if (1 == f)
eff.cbTypeSpecificParams = sizeof(DIRAMPFORCE);
else
diff --git a/Source/Core/VideoCommon/Src/BPFunctions.cpp b/Source/Core/VideoCommon/Src/BPFunctions.cpp
index b9a76ba7b6..cddeae3000 100644
--- a/Source/Core/VideoCommon/Src/BPFunctions.cpp
+++ b/Source/Core/VideoCommon/Src/BPFunctions.cpp
@@ -236,7 +236,7 @@ bool GetConfig(const int &type)
case CONFIG_DISABLEFOG:
return g_ActiveConfig.bDisableFog;
case CONFIG_SHOWEFBREGIONS:
- return g_ActiveConfig.bShowEFBCopyRegions;
+ return false;
default:
PanicAlert("GetConfig Error: Unknown Config Type!");
return false;