From e686ef46b8ea2fb5addbeb84bb1fe5a349648bfc Mon Sep 17 00:00:00 2001 From: JimLee168 Date: Fri, 5 Apr 2013 13:26:54 +0800 Subject: [PATCH] Added sceZlibDecompress and VS2010 build fix Fixes ULUS10121 Bomberman --- Common/CommonFuncs.h | 2 + Core/Core.vcxproj | 4 +- Core/Core.vcxproj.filters | 6 +++ Core/HLE/FunctionWrappers.h | 5 ++ Core/HLE/HLETables.cpp | 2 + Core/HLE/sceDeflt.cpp | 92 +++++++++++++++++++++++++++++++++++++ Core/HLE/sceDeflt.h | 20 ++++++++ 7 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 Core/HLE/sceDeflt.cpp create mode 100644 Core/HLE/sceDeflt.h diff --git a/Common/CommonFuncs.h b/Common/CommonFuncs.h index a19acff986..30040bf10a 100644 --- a/Common/CommonFuncs.h +++ b/Common/CommonFuncs.h @@ -89,6 +89,8 @@ inline u64 __rotr64(u64 x, unsigned int shift){ #define unlink _unlink #define snprintf _snprintf #define vscprintf _vscprintf + #define __rotr _rotr + #define __rotl _rotl // 64 bit offsets for windows #define fseeko _fseeki64 diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index bfd3168b83..24c48abe92 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -1,4 +1,4 @@ - + @@ -170,6 +170,7 @@ + @@ -344,6 +345,7 @@ + diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index bad49cce4e..25d658f2ed 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -397,6 +397,9 @@ HLE\Libraries + + HLE\Libraries + @@ -732,6 +735,9 @@ HLE\Libraries + + HLE\Libraries + diff --git a/Core/HLE/FunctionWrappers.h b/Core/HLE/FunctionWrappers.h index 80f1424719..5841869e7e 100644 --- a/Core/HLE/FunctionWrappers.h +++ b/Core/HLE/FunctionWrappers.h @@ -601,3 +601,8 @@ template void WrapU_UUUUUUU() { u32 retval = func(PARAM(0), PARAM(1), PARAM(2), PARAM(3), PARAM(4), PARAM(5), PARAM(6)); RETURN(retval); } + +template void WrapI_UIUU() { + u32 retval = func(PARAM(0), PARAM(1), PARAM(2), PARAM(3)); + RETURN(retval); +} diff --git a/Core/HLE/HLETables.cpp b/Core/HLE/HLETables.cpp index 1f98f74177..176059fa40 100644 --- a/Core/HLE/HLETables.cpp +++ b/Core/HLE/HLETables.cpp @@ -57,6 +57,7 @@ #include "scePspNpDrm_user.h" #include "sceP3da.h" #include "sceGameUpdate.h" +#include "sceDeflt.h" #define N(s) s @@ -252,6 +253,7 @@ void RegisterAllModules() { Register_sceNpDrm(); Register_sceP3da(); Register_sceGameUpdate(); + Register_sceDeflt(); for (int i = 0; i < numModules; i++) { diff --git a/Core/HLE/sceDeflt.cpp b/Core/HLE/sceDeflt.cpp new file mode 100644 index 0000000000..1560870a6f --- /dev/null +++ b/Core/HLE/sceDeflt.cpp @@ -0,0 +1,92 @@ +// Copyright (c) 2012- PPSSPP 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 or later versions. + +// 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 git repository and contact information can be found at +// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. + +#include "Globals.h" +#include "HLE.h" +#include "..\..\ext\zlib\zlib.h" + +int sceZlibDecompress(u32 OutBuffer, int OutBufferLength, u32 InBuffer, u32 Crc32Addr) +{ + int err; + uLong crc; + z_stream stream; + u8 *outBufferPtr; + u32 *crc32AddrPtr = 0; + + if( !Memory::IsValidAddress( OutBuffer ) || !Memory::IsValidAddress( InBuffer ) ) + { + ERROR_LOG( HLE, "sceZlibDecompress: Bad address %08x %08x", OutBuffer, InBuffer ); + return 0; + } + if( Crc32Addr ) + { + if( !Memory::IsValidAddress( Crc32Addr ) ) + { + ERROR_LOG( HLE, "sceZlibDecompress: Bad address %08x", Crc32Addr ); + return 0; + } + crc32AddrPtr = (u32 *)Memory::GetPointer( Crc32Addr ); + } + outBufferPtr = Memory::GetPointer( OutBuffer ); + stream.next_in = (Bytef*)Memory::GetPointer(InBuffer); + stream.avail_in = (uInt)OutBufferLength; + stream.next_out = outBufferPtr; + stream.avail_out = (uInt)OutBufferLength; + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + err = inflateInit(&stream); + if( err != Z_OK ) + { + ERROR_LOG( HLE, "sceZlibDecompress: inflateInit failed %08x", err ); + return 0; + } + err = inflate( &stream, Z_FINISH ); + if( err != Z_STREAM_END ) + { + inflateEnd( &stream ); + ERROR_LOG( HLE, "sceZlibDecompress: inflate failed %08x", err ); + return 0; + } + inflateEnd( &stream ); + if( crc32AddrPtr ) + { + crc = crc32( 0L, Z_NULL, 0 ); + *crc32AddrPtr = crc32( crc, outBufferPtr, stream.total_out ); + } + return stream.total_out; +} + +const HLEFunction sceDeflt[] = +{ + {0x0BA3B9CC, 0, "sceGzipGetCompressedData"}, + {0x106A3552, 0, "sceGzipGetName"}, + {0x1B5B82BC, 0, "sceGzipIsValid"}, + {0x2EE39A64, 0, "sceZlibAdler32"}, + {0x44054E03, 0, "sceDeflateDecompress"}, + {0x6A548477, 0, "sceZlibGetCompressedData"}, + {0x6DBCF897, 0, "sceGzipDecompress"}, + {0x8AA82C92, 0, "sceGzipGetInfo"}, + {0xA9E4FB28, WrapI_UIUU, "sceZlibDecompress"}, + {0xAFE01FD3, 0, "sceZlibGetInfo"}, + {0xB767F9A0, 0, "sceGzipGetComment"}, + {0xE46EB986, 0, "sceZlibIsValid"}, +}; + +void Register_sceDeflt() +{ + RegisterModule("sceDeflt", ARRAY_SIZE(sceDeflt), sceDeflt); +} diff --git a/Core/HLE/sceDeflt.h b/Core/HLE/sceDeflt.h new file mode 100644 index 0000000000..8196ab8869 --- /dev/null +++ b/Core/HLE/sceDeflt.h @@ -0,0 +1,20 @@ +// Copyright (c) 2012- PPSSPP 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 or later versions. + +// 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 git repository and contact information can be found at +// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. + +#pragma once + +void Register_sceDeflt();