diff --git a/Assets/dll/octoshock.dll b/Assets/dll/octoshock.dll
index eee804cf04..e02d50f61f 100644
Binary files a/Assets/dll/octoshock.dll and b/Assets/dll/octoshock.dll differ
diff --git a/psx/octoshock/bizhawk/octoshock.vcxproj b/psx/octoshock/bizhawk/octoshock.vcxproj
index 1c438de3c4..1a9ad75f5c 100644
--- a/psx/octoshock/bizhawk/octoshock.vcxproj
+++ b/psx/octoshock/bizhawk/octoshock.vcxproj
@@ -78,6 +78,7 @@ copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)..\..\..\output\dll\$(Tar
+
diff --git a/psx/octoshock/error.cpp b/psx/octoshock/error.cpp
new file mode 100644
index 0000000000..d299584b37
--- /dev/null
+++ b/psx/octoshock/error.cpp
@@ -0,0 +1,144 @@
+/******************************************************************************/
+/* Mednafen - Multi-system Emulator */
+/******************************************************************************/
+/* error.cpp:
+** Copyright (C) 2007-2016 Mednafen Team
+**
+** 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; either version 2
+** of the License, or (at your option) any later version.
+**
+** 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 for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software Foundation, Inc.,
+** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include "error.h"
+#include
+#include
+#include
+
+MDFN_Error::MDFN_Error() noexcept
+{
+ abort();
+}
+
+MDFN_Error::MDFN_Error(int errno_code_new, const char *format, ...) noexcept
+{
+ errno_code = errno_code_new;
+
+ va_list ap;
+ va_start(ap, format);
+ va_list ap_copy;
+ va_copy(ap_copy, ap);
+ std::vector buf(1+vsnprintf(nullptr, 0, format, ap));
+ va_end(ap);
+ (void)vsnprintf(buf.data(), buf.size(),format, ap_copy);
+ va_end(ap_copy);
+ error_message = strdup(buf.data());
+ va_end(ap);
+}
+
+
+MDFN_Error::MDFN_Error(const ErrnoHolder &enh)
+{
+ errno_code = enh.Errno();
+
+ error_message = strdup(enh.StrError());
+}
+
+
+MDFN_Error::~MDFN_Error() noexcept
+{
+ if(error_message)
+ {
+ free(error_message);
+ error_message = NULL;
+ }
+}
+
+MDFN_Error::MDFN_Error(const MDFN_Error &ze_error) noexcept
+{
+ if(ze_error.error_message)
+ error_message = strdup(ze_error.error_message);
+ else
+ error_message = NULL;
+
+ errno_code = ze_error.errno_code;
+}
+
+MDFN_Error& MDFN_Error::operator=(const MDFN_Error &ze_error) noexcept
+{
+ char *new_error_message = ze_error.error_message ? strdup(ze_error.error_message) : NULL;
+ int new_errno_code = ze_error.errno_code;
+
+ if(error_message)
+ free(error_message);
+
+ error_message = new_error_message;
+ errno_code = new_errno_code;
+
+ return(*this);
+}
+
+
+const char * MDFN_Error::what(void) const noexcept
+{
+ if(!error_message)
+ return("Error allocating memory for the error message!");
+
+ return(error_message);
+}
+
+int MDFN_Error::GetErrno(void) const noexcept
+{
+ return(errno_code);
+}
+
+static MDFN_NOWARN_UNUSED const char *srr_wrap(int ret, const char *local_strerror)
+{
+ if(ret == -1)
+ return("ERROR IN strerror_r()!!!");
+
+ return(local_strerror);
+}
+
+static MDFN_NOWARN_UNUSED const char *srr_wrap(const char *ret, const char *local_strerror)
+{
+ if(ret == NULL)
+ return("ERROR IN strerror_r()!!!");
+
+ return(ret);
+}
+
+void ErrnoHolder::SetErrno(int the_errno)
+{
+ local_errno = the_errno;
+
+ if(the_errno == 0)
+ local_strerror[0] = 0;
+ else
+ {
+ #ifdef HAVE_STRERROR_R
+ const char *retv;
+
+ retv = srr_wrap(strerror_r(the_errno, local_strerror, 256), local_strerror);
+
+ if(retv != local_strerror)
+ strncpy(local_strerror, retv, 255);
+
+ #else // No strerror_r :(
+
+ strncpy(local_strerror, strerror(the_errno), 255);
+
+ #endif
+
+ local_strerror[255] = 0;
+ }
+}
diff --git a/psx/octoshock/error.h b/psx/octoshock/error.h
index 9fba0c198e..0fcb68d3ed 100644
--- a/psx/octoshock/error.h
+++ b/psx/octoshock/error.h
@@ -4,6 +4,7 @@
#include
#include
#include
+#include "emuware/emuware.h"
#ifdef __cplusplus
@@ -22,7 +23,7 @@ class MDFN_Error : public std::exception
MDFN_Error(const MDFN_Error &ze_error) noexcept;
MDFN_Error & operator=(const MDFN_Error &ze_error) noexcept;
-// virtual const char *what(void) const noexcept;
+ virtual const char *what(void) const noexcept;
int GetErrno(void) const noexcept;
private:
diff --git a/psx/octoshock/psx/psx.cpp b/psx/octoshock/psx/psx.cpp
index 7c7140a8f1..e7ab6b2f3f 100644
--- a/psx/octoshock/psx/psx.cpp
+++ b/psx/octoshock/psx/psx.cpp
@@ -1919,9 +1919,8 @@ static MDFN_COLD void LoadEXE(const uint8 *data, const uint32 size, bool ignore_
uint32 TextStart;
uint32 TextSize;
- //TODO ERROR HANDLING
- //if(size < 0x800)
- // throw(MDFN_Error(0, "PS-EXE is too small."));
+ if(size < 0x800)
+ throw(MDFN_Error(0, "PS-EXE is too small."));
PC = MDFN_de32lsb(&data[0x10]);
SP = MDFN_de32lsb(&data[0x30]);
@@ -1937,16 +1936,14 @@ static MDFN_COLD void LoadEXE(const uint8 *data, const uint32 size, bool ignore_
if(TextSize > 2048 * 1024)
{
- //TODO ERROR HANDLING
- //throw(MDFN_Error(0, "Text section too large"));
+ throw(MDFN_Error(0, "Text section too large"));
}
- //TODO ERROR HANDLING
- /*if(TextSize > (size - 0x800))
+ if(TextSize > (size - 0x800))
throw(MDFN_Error(0, "Text section recorded size is larger than data available in file. Header=0x%08x, Available=0x%08x", TextSize, size - 0x800));
if(TextSize < (size - 0x800))
- throw(MDFN_Error(0, "Text section recorded size is smaller than data available in file. Header=0x%08x, Available=0x%08x", TextSize, size - 0x800));*/
+ throw(MDFN_Error(0, "Text section recorded size is smaller than data available in file. Header=0x%08x, Available=0x%08x", TextSize, size - 0x800));
if(!TextMem.size())
{
@@ -2862,4 +2859,4 @@ EW_EXPORT s32 shock_PokeMemory(void* psx, u32 address, u8 value)
CPU->PokeMem8(address, value);
return SHOCK_OK;
-}
\ No newline at end of file
+}