diff --git a/README.md b/README.md index 258905cf7f..735c9a46db 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,21 @@ -rpcs3 +RPCS3 ===== -PS3 emulator/debugger +An open-source PlayStation 3 emulator/debugger written in C++. -The [FAQ](https://github.com/DHrpcs3/rpcs3/wiki/FAQ) has some basic information. +You can find some basic information in the [FAQ](https://github.com/DHrpcs3/rpcs3/wiki/FAQ). For discussion about this emulator and PS3 emulation please visit the [official forums](http://www.emunewz.net/forum/forumdisplay.php?fid=162). -For discussion about the emulator and PS3 emulation please visit the [official forums](http://www.emunewz.net/forum/forumdisplay.php?fid=162). +### Dependencies -If you want to contribute please take a took at the [Coding Style](https://github.com/DHrpcs3/rpcs3/wiki/Coding-Style) and [Roadmap](https://github.com/DHrpcs3/rpcs3/wiki/Roadmap) pages. +* [Visual C++ Redistributable Packages for Visual Studio 2013](http://www.microsoft.com/en-us/download/details.aspx?id=40784) +* [OpenAL32.dll](http://www.mediafire.com/?nwt3ilty2mo) + +### Development + +If you want to contribute please take a took at the [Coding Style](https://github.com/DHrpcs3/rpcs3/wiki/Coding-Style), [Roadmap](https://github.com/DHrpcs3/rpcs3/wiki/Roadmap) and [Developer Information](https://github.com/DHrpcs3/rpcs3/wiki/Developer-Information) pages. You should as well contact any of the developers in the forum in order to know about the current situation of the emulator. + +### Building To initialize the repository don't forget to execute `git submodule update --init` to pull the wxWidgets source. +* __Windows__: Install *Visual Studio 2013*. Then open the *.SLN* file, and press *Build* > *Rebuild Solution*. +* __Linux__: *TODO* diff --git a/Utilities/Array.h b/Utilities/Array.h index b7226cf2cd..ad5e715d7d 100644 --- a/Utilities/Array.h +++ b/Utilities/Array.h @@ -142,9 +142,9 @@ public: return m_array[num]; } - virtual u32 GetCount() const { return m_count; } + u32 GetCount() const { return m_count; } - virtual void SetCount(const u32 count, bool memzero = true) + void SetCount(const u32 count, bool memzero = true) { if(m_count >= count) return; @@ -199,96 +199,6 @@ protected: } }; -class ArrayString : public Array -{ -public: - ArrayString() : Array() - { - } - - ArrayString(const wxString& value) : Array() - { - *this = value; - } - - ArrayString(const char* value) : Array() - { - *this = value; - } - - virtual u32 GetCount() const - { - return m_array ? strlen(m_array) : 0; - } - - virtual void SetCount(const u32 count, bool memzero = true) - { - if(m_count && count < m_count - 1) - { - m_array[count] = '\0'; - } - else - { - Array::SetCount(count + 1, memzero); - } - } - - ArrayString& operator = (const char* right) - { - Clear(); - - if(right) - { - size_t len = strlen(right); - - if(len) - { - SetCount(len); - memcpy(m_array, right, len * sizeof(char)); - m_array[len] = '\0'; - } - } - - return *this; - } - - ArrayString& operator = (const ArrayString& right) - { - Clear(); - - if(size_t len = right.GetCount()) - { - SetCount(len); - memcpy(m_array, right.GetPtr(), len * sizeof(char)); - m_array[len] = '\0'; - } - - return *this; - } - - ArrayString& operator = (const wxString& right) - { - Clear(); - - if(size_t len = right.Len()) - { - SetCount(len); - memcpy(m_array, right.c_str(), len * sizeof(char)); - m_array[len] = '\0'; - } - - return *this; - } - - ArrayString* Clone() const - { - ArrayString* new_array = new ArrayString(); - (*new_array) = m_array; - - return new_array; - } -}; - template struct Stack : public Array { Stack() : Array() diff --git a/Utilities/StrFmt.cpp b/Utilities/StrFmt.cpp index 58ed16f145..e67437ae00 100644 --- a/Utilities/StrFmt.cpp +++ b/Utilities/StrFmt.cpp @@ -1,20 +1,20 @@ #include "stdafx.h" #include "StrFmt.h" -static const std::string fmt::placeholder = "???"; +extern const std::string fmt::placeholder = "???"; //wrapper to deal with advance sprintf formating options with automatic length finding //can't take strings by reference because of "va_start", so overload it with char * std::string fmt::FormatV(const char *fmt, va_list args) { - int length = 256; + size_t length = 256; std::string str; for (;;) { std::vector buffptr(length); - size_t printlen = vsnprintf(buffptr.data(), length, fmt, args); + int printlen = vsnprintf(buffptr.data(), length, fmt, args); if (printlen >= 0 && printlen < length) { str = std::string(buffptr.data(), printlen); diff --git a/Utilities/StrFmt.h b/Utilities/StrFmt.h index 0c705bd544..a812ccaa74 100644 --- a/Utilities/StrFmt.h +++ b/Utilities/StrFmt.h @@ -78,13 +78,13 @@ namespace fmt{ template string Format(const string &fmt, Args&& ... parameters) { - int length = 256; + size_t length = 256; string str; for (;;) { std::vector buffptr(length); - size_t printlen = snprintf(buffptr.data(), length, fmt.c_str(), std::forward(parameters)...); + int printlen = snprintf(buffptr.data(), length, fmt.c_str(), std::forward(parameters)...); if (printlen >= 0 && printlen < length) { str = string(buffptr.data(), printlen); diff --git a/rpcs3/Crypto/unself.cpp b/rpcs3/Crypto/unself.cpp index cb678b28e8..72a38fa8fa 100644 --- a/rpcs3/Crypto/unself.cpp +++ b/rpcs3/Crypto/unself.cpp @@ -622,8 +622,6 @@ bool CheckDebugSelf(const std::string& self, const std::string& elf) s.Seek(0); return false; } - - s.Close(); } bool DecryptSelf(const std::string& elf, const std::string& self) diff --git a/rpcs3/Emu/Cell/PPUInterpreter.h b/rpcs3/Emu/Cell/PPUInterpreter.h index 2087cefb12..3cb0c0f0d4 100644 --- a/rpcs3/Emu/Cell/PPUInterpreter.h +++ b/rpcs3/Emu/Cell/PPUInterpreter.h @@ -2738,7 +2738,7 @@ private: { const u64 RA = CPU.GPR[ra]; CPU.GPR[rd] = ~RA + CPU.XER.CA; - CPU.XER.CA = (~RA + CPU.XER.CA > ~0x0) | ((RA == 0) & CPU.XER.CA); + CPU.XER.CA = ((RA == 0) & CPU.XER.CA); if (oe) ConLog.Warning("subfzeo"); if (rc) CPU.UpdateCR0(CPU.GPR[rd]); } diff --git a/rpcs3/Emu/Io/Keyboard.cpp b/rpcs3/Emu/Io/Keyboard.cpp index e20e90e313..b14ca37530 100644 --- a/rpcs3/Emu/Io/Keyboard.cpp +++ b/rpcs3/Emu/Io/Keyboard.cpp @@ -15,14 +15,20 @@ KeyboardManager::~KeyboardManager() void KeyboardManager::Init(const u32 max_connect) { - if(m_inited) return; + if(m_inited) + return; + // NOTE: Change these to std::make_unique assignments when C++14 comes out. switch(Ini.KeyboardHandlerMode.GetValue()) { - case 1: m_keyboard_handler = new WindowsKeyboardHandler(); break; + case 1: + m_keyboard_handler.reset(new WindowsKeyboardHandler()); + break; default: - case 0: m_keyboard_handler = new NullKeyboardHandler(); break; + case 0: + m_keyboard_handler.reset(new NullKeyboardHandler()); + break; } m_keyboard_handler->Init(max_connect); diff --git a/rpcs3/Emu/Io/Keyboard.h b/rpcs3/Emu/Io/Keyboard.h index 1cd6201def..1674b185de 100644 --- a/rpcs3/Emu/Io/Keyboard.h +++ b/rpcs3/Emu/Io/Keyboard.h @@ -1,11 +1,13 @@ #pragma once +#include +#include #include "KeyboardHandler.h" class KeyboardManager //: public wxWindow { bool m_inited; - KeyboardHandlerBase* m_keyboard_handler; + std::unique_ptr m_keyboard_handler; public: KeyboardManager(); @@ -14,9 +16,9 @@ public: void Init(const u32 max_connect); void Close(); - Array& GetKeyboards() { return m_keyboard_handler->GetKeyboards(); } + std::vector& GetKeyboards() { return m_keyboard_handler->GetKeyboards(); } KbInfo& GetInfo() { return m_keyboard_handler->GetInfo(); } - Array& GetButtons(const u32 keyboard) { return m_keyboard_handler->GetButtons(keyboard); } + std::vector& GetButtons(const u32 keyboard) { return m_keyboard_handler->GetButtons(keyboard); } CellKbData& GetData(const u32 keyboard) { return m_keyboard_handler->GetData(keyboard); } CellKbConfig& GetConfig(const u32 keyboard) { return m_keyboard_handler->GetConfig(keyboard); } diff --git a/rpcs3/Emu/Io/KeyboardHandler.h b/rpcs3/Emu/Io/KeyboardHandler.h index 463ae9516a..9eff36490b 100644 --- a/rpcs3/Emu/Io/KeyboardHandler.h +++ b/rpcs3/Emu/Io/KeyboardHandler.h @@ -1,5 +1,7 @@ #pragma once +#include + extern u16 cellKbCnvRawCode(u32 arrange, u32 mkey, u32 led, u16 rawcode); // (TODO: Can it be problematic to place SysCalls in middle of nowhere?) enum KbPortStatus @@ -248,22 +250,20 @@ struct Keyboard { CellKbData m_data; CellKbConfig m_config; - Array m_buttons; + std::vector m_buttons; Keyboard() : m_data() , m_config() { } - - ~Keyboard() { m_buttons.Clear(); } }; class KeyboardHandlerBase { protected: KbInfo m_info; - Array m_keyboards; + std::vector m_keyboards; public: virtual void Init(const u32 max_connect)=0; @@ -271,22 +271,22 @@ public: void Key(const u32 code, bool pressed) { - for(u64 p=0; p& GetKeyboards() { return m_keyboards; } - Array& GetButtons(const u32 keyboard) { return GetKeyboards()[keyboard].m_buttons; } - CellKbData& GetData(const u32 keyboard) { return GetKeyboards()[keyboard].m_data; } - CellKbConfig& GetConfig(const u32 keyboard) { return GetKeyboards()[keyboard].m_config; } + std::vector& GetKeyboards() { return m_keyboards; } + std::vector& GetButtons(const u32 keyboard) { return m_keyboards[keyboard].m_buttons; } + CellKbData& GetData(const u32 keyboard) { return m_keyboards[keyboard].m_data; } + CellKbConfig& GetConfig(const u32 keyboard) { return m_keyboards[keyboard].m_config; } }; \ No newline at end of file diff --git a/rpcs3/Emu/Io/Mouse.cpp b/rpcs3/Emu/Io/Mouse.cpp index 7ad1dd0631..80d8cb4b97 100644 --- a/rpcs3/Emu/Io/Mouse.cpp +++ b/rpcs3/Emu/Io/Mouse.cpp @@ -15,14 +15,20 @@ MouseManager::~MouseManager() void MouseManager::Init(const u32 max_connect) { - if(m_inited) return; + if(m_inited) + return; + // NOTE: Change these to std::make_unique assignments when C++14 is available. switch(Ini.MouseHandlerMode.GetValue()) { - case 1: m_mouse_handler = new WindowsMouseHandler(); break; + case 1: + m_mouse_handler.reset(new WindowsMouseHandler()); + break; default: - case 0: m_mouse_handler = new NullMouseHandler(); break; + case 0: + m_mouse_handler.reset(new NullMouseHandler()); + break; } m_mouse_handler->Init(max_connect); diff --git a/rpcs3/Emu/Io/Mouse.h b/rpcs3/Emu/Io/Mouse.h index 6b2e47611a..aa3c546117 100644 --- a/rpcs3/Emu/Io/Mouse.h +++ b/rpcs3/Emu/Io/Mouse.h @@ -1,11 +1,13 @@ #pragma once +#include +#include #include "MouseHandler.h" class MouseManager //: public wxWindow { bool m_inited; - MouseHandlerBase* m_mouse_handler; + std::unique_ptr m_mouse_handler; public: MouseManager(); @@ -14,7 +16,7 @@ public: void Init(const u32 max_connect); void Close(); - Array& GetMice() { return m_mouse_handler->GetMice(); } + std::vector& GetMice() { return m_mouse_handler->GetMice(); } MouseInfo& GetInfo() { return m_mouse_handler->GetInfo(); } CellMouseData& GetData(const u32 mouse) { return m_mouse_handler->GetData(mouse); } CellMouseRawData& GetRawData(const u32 mouse) { return m_mouse_handler->GetRawData(mouse); } diff --git a/rpcs3/Emu/Io/MouseHandler.h b/rpcs3/Emu/Io/MouseHandler.h index 00cbab73e4..c081ae2f7e 100644 --- a/rpcs3/Emu/Io/MouseHandler.h +++ b/rpcs3/Emu/Io/MouseHandler.h @@ -1,5 +1,7 @@ #pragma once +#include + enum MousePortStatus { CELL_MOUSE_STATUS_DISCONNECTED = 0x00000000, @@ -99,7 +101,7 @@ class MouseHandlerBase { protected: MouseInfo m_info; - Array m_mice; + std::vector m_mice; public: virtual void Init(const u32 max_connect)=0; @@ -107,7 +109,7 @@ public: void Button(u8 button, bool pressed) { - for(u64 p=0; p& GetMice() { return m_mice; } - CellMouseData& GetData(const u32 mouse) { return GetMice()[mouse].m_data; } - CellMouseRawData& GetRawData(const u32 mouse) { return GetMice()[mouse].m_rawdata; } + std::vector& GetMice() { return m_mice; } + CellMouseData& GetData(const u32 mouse) { return m_mice[mouse].m_data; } + CellMouseRawData& GetRawData(const u32 mouse) { return m_mice[mouse].m_rawdata; } }; \ No newline at end of file diff --git a/rpcs3/Emu/Io/Null/NullKeyboardHandler.h b/rpcs3/Emu/Io/Null/NullKeyboardHandler.h index 4a9598a71e..78d25be2b3 100644 --- a/rpcs3/Emu/Io/Null/NullKeyboardHandler.h +++ b/rpcs3/Emu/Io/Null/NullKeyboardHandler.h @@ -2,7 +2,7 @@ #include "Emu/Io/KeyboardHandler.h" -class NullKeyboardHandler : public KeyboardHandlerBase +class NullKeyboardHandler final : public KeyboardHandlerBase { public: NullKeyboardHandler() @@ -13,16 +13,16 @@ public: { memset(&m_info, 0, sizeof(KbInfo)); m_info.max_connect = max_connect; - m_keyboards.Clear(); + m_keyboards.clear(); for(u32 i=0; iInit(max_connect); diff --git a/rpcs3/Emu/Io/Pad.h b/rpcs3/Emu/Io/Pad.h index 6860f7b3d2..27b049cea4 100644 --- a/rpcs3/Emu/Io/Pad.h +++ b/rpcs3/Emu/Io/Pad.h @@ -1,11 +1,13 @@ #pragma once +#include +#include #include "PadHandler.h" class PadManager //: public wxWindow { bool m_inited; - PadHandlerBase* m_pad_handler; + std::unique_ptr m_pad_handler; public: PadManager(); @@ -14,9 +16,9 @@ public: void Init(const u32 max_connect); void Close(); - Array& GetPads() { return m_pad_handler->GetPads(); } + std::vector& GetPads() { return m_pad_handler->GetPads(); } PadInfo& GetInfo() { return m_pad_handler->GetInfo(); } - Array