aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorspicyjpeg <88942473+spicyjpeg@users.noreply.github.com>2021-09-27 20:11:10 +0200
committerspicyjpeg <88942473+spicyjpeg@users.noreply.github.com>2021-09-27 20:11:10 +0200
commit0e3278a087daa25cba541d7c1dae19dfd4e2d422 (patch)
treedbd8ea7b2f3398865a396d3f425a6ab4ba4bed94
parent5bc36dfcfc64e48401a9c6472062020681b3511f (diff)
downloadpsn00bsdk-0e3278a087daa25cba541d7c1dae19dfd4e2d422.tar.gz
Misc MSVC/CMake fixes, also fixed childexec example
-rw-r--r--CMakeLists.txt5
-rw-r--r--INSTALL.md42
-rw-r--r--doc/dev notes.txt9
-rw-r--r--examples/system/childexec/CMakeLists.txt7
-rw-r--r--libpsn00b/cmake/sdk.cmake41
-rw-r--r--libpsn00b/lzp/compress.c10
-rw-r--r--libpsn00b/lzp/crc.c8
-rw-r--r--libpsn00b/lzp/lzp.c32
-rw-r--r--libpsn00b/lzp/lzp.h18
-rw-r--r--libpsn00b/lzp/lzqlp.h23
-rw-r--r--libpsn00b/lzp/qlp.c24
-rw-r--r--tools/lzpack/filelist.h7
-rw-r--r--tools/lzpack/main.cpp30
-rw-r--r--tools/smxlink/main.cpp4
-rw-r--r--tools/smxlink/timreader.cpp4
-rw-r--r--tools/util/elf2cpe.c4
-rw-r--r--tools/util/elf2x.c9
17 files changed, 172 insertions, 105 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 71f9acf..fa04b71 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -73,7 +73,9 @@ if(NOT SKIP_DOWNLOAD)
ExternalProject_Add(
tinyxml2
GIT_REPOSITORY "https://github.com/leethomason/tinyxml2"
- CMAKE_CACHE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${PROJECT_BINARY_DIR}/install_temp
+ CMAKE_CACHE_ARGS
+ -DCMAKE_INSTALL_PREFIX:PATH=${PROJECT_BINARY_DIR}/install_temp
+ -DCMAKE_MSVC_RUNTIME_LIBRARY:STRING=MultiThreaded$<$<CONFIG:Debug>:Debug>
INSTALL_DIR install_temp
)
ExternalProject_Add(
@@ -154,7 +156,6 @@ set(CPACK_RESOURCE_FILE_README ${PROJECT_SOURCE_DIR}/README.md)
set(CPACK_RESOURCE_FILE_LICENSE ${PROJECT_SOURCE_DIR}/LICENSE.md)
set(CPACK_PRE_BUILD_SCRIPTS ${PROJECT_SOURCE_DIR}/cpack/fakeroot_fix.cmake)
-
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.28), cmake (>= 3.21), gcc-mipsel-unknown-elf")
set(CPACK_DEBIAN_PACKAGE_SUGGESTS "git")
set(CPACK_DEBIAN_PACKAGE_SECTION devel)
diff --git a/INSTALL.md b/INSTALL.md
index 974ee0a..6547c2b 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -11,22 +11,29 @@ tested but should work.
install the `build-essential` package provided by most Linux distros.
2. Install Git and CMake. Note that some Linux distros ship relatively old
- versions of CMake, so make sure you have at least CMake 3.21. You may also
- want to grab [Ninja](https://ninja-build.org) (it is a single executable, you
- have to copy it to any directory listed in the `PATH` environment variable)
- as a faster alternative to `make`.
+ versions of CMake, so make sure you have at least CMake 3.21. You will also
+ need [Ninja](https://ninja-build.org) (it is a single executable, you have to
+ copy it to any directory listed in the `PATH` environment variable) on
+ Windows as there is no preinstalled build system; on Linux you can use `make`
+ instead, but Ninja is still recommended.
3. Build and install a GCC toolchain for `mipsel-unknown-elf`. As GCC is
notoriously hard to compile under Windows, you may download a precompiled
- version from [Lameguy64's website](http://lameguy64.net?page=psn00bsdk)
- and extract it to the root of your C drive instead. See
- [toolchain.txt](toolchain.txt) for details on compiling GCC.
-
-4. Set the `PSN00BSDK_TC` environment variable to point to the location you
- installed or extracted the toolchain to. The default is
- `C:\Program Files\PSn00bSDK\mips-unknown-elf` on Windows or
- `/usr/local/mips-unknown-elf` on Linux; installing to a different path is
- not recommended.
+ version from [Lameguy64's website](http://lameguy64.net?page=psn00bsdk) and
+ and extract it into Program Files instead. See [toolchain.txt](toolchain.txt)
+ for details on compiling GCC.
+
+4. If you chose a non-standard install location for the toolchain, set the
+ `PSN00BSDK_TC` environment variable to point to the toolchain's root
+ directory. This step is unnecessary if you installed/extracted the toolchain
+ into any of these directories:
+
+ - `C:\Program Files\mipsel-unknown-elf`
+ - `C:\Program Files (x86)\mipsel-unknown-elf`
+ - `C:\mipsel-unknown-elf`
+ - `/usr/local/mipsel-unknown-elf`
+ - `/usr/mipsel-unknown-elf`
+ - `/opt/mipsel-unknown-elf`
5. Clone/download the PSn00bSDK repo and run the following commands:
@@ -55,9 +62,10 @@ with debugging capabilities such as [no$psx](https://problemkaputt.de/psx.htm)
## Building installer packages
-CPack can be used to build NSIS-based installers on Windows or DEB/RPM packages
-on Linux, plus zipped packages on all platforms. Note that currently none of the
-built packages include the GCC toolchain, thus their usefulness is limited.
+CPack can be used to build NSIS-based installers, DEB/RPM packages and zipped
+releases. Note that currently none of the built packages include the toolchain,
+thus their usefulness is limited. Distributing prebuilt releases is discouraged
+anyway since PSn00bSDK is still far from being feature-complete.
1. Follow steps 1-4 above to set up the toolchain, then install NSIS on Windows
or `dpkg` and `rpm` on Linux.
@@ -97,4 +105,4 @@ The toolchain script defines a few CMake macros to create PS1 executables, DLLs
and CD images. See the [reference](doc/cmake_reference.md) for details.
-----------------------------------------
-_Last updated on 2021-09-12 by spicyjpeg_
+_Last updated on 2021-09-26 by spicyjpeg_
diff --git a/doc/dev notes.txt b/doc/dev notes.txt
index 151a441..8fd8d7f 100644
--- a/doc/dev notes.txt
+++ b/doc/dev notes.txt
@@ -102,6 +102,15 @@ project() command. The poorly documented solution to this is to move such
commands to a separate file and set CMAKE_PROJECT_INCLUDE to point to it, so
project() will execute it immediately after initialization.
+* After executing the toolchain file, CMake generates and attempts to build
+several dummy projects to test the compiler. Each of these projects re-includes
+the toolchain script (which is why you'll see commands executed multiple times)
+and uses the same variable values as the main project, however CMake will *NOT*
+pass custom variables through by default. If your toolchain script has options
+that can be set via custom variables (like PSN00BSDK_TC and PSN00BSDK_PREFIX in
+PSn00bSDK), you'll have to set CMAKE_TRY_COMPILE_PLATFORM_VARIABLES to a list
+of variable names to be exported to generated dummy projects.
+
* There is no way to use multiple toolchains (PS1 + host) in a single project,
even if you use add_subdirectory() to execute multiple project files (which,
confusingly, adds their targets to the parent project rather than treating them
diff --git a/examples/system/childexec/CMakeLists.txt b/examples/system/childexec/CMakeLists.txt
index 8092bec..c9983c4 100644
--- a/examples/system/childexec/CMakeLists.txt
+++ b/examples/system/childexec/CMakeLists.txt
@@ -27,6 +27,13 @@ psn00bsdk_add_executable(
psn00bsdk_add_executable(child STATIC ${_child_sources})
#psn00bsdk_add_cd_image(childexec_iso childexec iso.xml DEPENDS parent)
+# Relocate the child executable to a non-default address to prevent it from
+# overlapping with the main one at 0x80010000.
+# NOTE: child executables are not position-independent and can't be relocated
+# at runtime. If you need your code to be relocatable (e.g. to load it into a
+# dynamically-allocated buffer), consider using a DLL instead.
+target_link_options(child PRIVATE -Ttext=0x80030000)
+
# Make sure the child executable is built before the parent (so it can be
# embedded via child_exe.s).
add_dependencies(parent child)
diff --git a/libpsn00b/cmake/sdk.cmake b/libpsn00b/cmake/sdk.cmake
index 82e921c..4c2f330 100644
--- a/libpsn00b/cmake/sdk.cmake
+++ b/libpsn00b/cmake/sdk.cmake
@@ -22,23 +22,29 @@ set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
#set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
-# Tell CMake not to run the linker when compiling test programs. This dodges
-# missing C++ standard library errors.
-set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
+# Tell CMake not to run the linker when compiling test programs, and to pass
+# toolchain settings to the generated test projects. This dodges missing C++
+# standard library errors.
+set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
+set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES PSN00BSDK_TC PSN00BSDK_TARGET)
## Toolchain path setup
-# Attempt to find GCC. PSN00BSDK_TC can be left unset if the toolchain can be
-# found in the PATH environment variable.
+# Attempt to find GCC using a list of common installation locations.
+# PSN00BSDK_TC can be left unset if the toolchain can be found in any of these
+# or in the PATH environment variable.
find_program(
_gcc ${PSN00BSDK_TARGET}-gcc
HINTS
${PSN00BSDK_TC}/bin
${PSN00BSDK_TC}/../bin
+ # Same as ${CMAKE_INSTALL_PREFIX}/${PSN00BSDK_TARGET}/bin
${CMAKE_CURRENT_LIST_DIR}/../../../${PSN00BSDK_TARGET}/bin
PATHS
"C:/Program Files/${PSN00BSDK_TARGET}/bin"
+ "C:/Program Files (x86)/${PSN00BSDK_TARGET}/bin"
"C:/${PSN00BSDK_TARGET}/bin"
+ /opt/${PSN00BSDK_TARGET}/bin
/usr/local/${PSN00BSDK_TARGET}/bin
/usr/${PSN00BSDK_TARGET}/bin
NO_CACHE REQUIRED
@@ -57,18 +63,23 @@ endif()
## Toolchain executables
+# ${CMAKE_EXECUTABLE_SUFFIX} seems not to work in toolchain scripts, so we
+# can't rely on it to determine the host OS extension for executables. The best
+# workaround I found is to extract the extension from the path returned by
+# find_program() using a regex.
set(_prefix ${_bin}/${PSN00BSDK_TARGET})
+string(REGEX MATCH ".+-gcc(.*)$" _dummy ${_gcc})
-set(CMAKE_ASM_COMPILER ${_prefix}-gcc${CMAKE_EXECUTABLE_SUFFIX})
-set(CMAKE_C_COMPILER ${_prefix}-gcc${CMAKE_EXECUTABLE_SUFFIX})
-set(CMAKE_CXX_COMPILER ${_prefix}-g++${CMAKE_EXECUTABLE_SUFFIX})
-set(CMAKE_AR ${_prefix}-ar${CMAKE_EXECUTABLE_SUFFIX})
-set(CMAKE_LINKER ${_prefix}-ld${CMAKE_EXECUTABLE_SUFFIX})
-set(CMAKE_RANLIB ${_prefix}-ranlib${CMAKE_EXECUTABLE_SUFFIX})
-set(CMAKE_OBJCOPY ${_prefix}-objcopy${CMAKE_EXECUTABLE_SUFFIX})
-set(CMAKE_SIZE ${_prefix}-size${CMAKE_EXECUTABLE_SUFFIX})
-set(CMAKE_STRIP ${_prefix}-strip${CMAKE_EXECUTABLE_SUFFIX})
-set(TOOLCHAIN_NM ${_prefix}-nm${CMAKE_EXECUTABLE_SUFFIX})
+set(CMAKE_ASM_COMPILER ${_prefix}-gcc${CMAKE_MATCH_1})
+set(CMAKE_C_COMPILER ${_prefix}-gcc${CMAKE_MATCH_1})
+set(CMAKE_CXX_COMPILER ${_prefix}-g++${CMAKE_MATCH_1})
+set(CMAKE_AR ${_prefix}-ar${CMAKE_MATCH_1})
+set(CMAKE_LINKER ${_prefix}-ld${CMAKE_MATCH_1})
+set(CMAKE_RANLIB ${_prefix}-ranlib${CMAKE_MATCH_1})
+set(CMAKE_OBJCOPY ${_prefix}-objcopy${CMAKE_MATCH_1})
+set(CMAKE_SIZE ${_prefix}-size${CMAKE_MATCH_1})
+set(CMAKE_STRIP ${_prefix}-strip${CMAKE_MATCH_1})
+set(TOOLCHAIN_NM ${_prefix}-nm${CMAKE_MATCH_1})
## SDK setup
diff --git a/libpsn00b/lzp/compress.c b/libpsn00b/lzp/compress.c
index 5f2b78c..5969dd6 100644
--- a/libpsn00b/lzp/compress.c
+++ b/libpsn00b/lzp/compress.c
@@ -107,7 +107,7 @@ int get_penalty(int a, int b) {
}
-int lzCompress(void* outBuff, void* inBuff, int inSize, int level) {
+int lzCompress(void* outBuff, const void* inBuff, int inSize, int level) {
#if LZP_USE_MALLOC == FALSE
int head[HASH1_SIZE+HASH2_SIZE];
@@ -347,7 +347,7 @@ void lzResetHashSizes() {
#endif // LZP_NO_COMPRESS
-int lzDecompress(void* outBuff, void* inBuff, int inSize) {
+int lzDecompress(void* outBuff, const void* inBuff, int inSize) {
int p=0;
int len;
@@ -355,7 +355,7 @@ int lzDecompress(void* outBuff, void* inBuff, int inSize) {
int s;
int windowSize;
- inPtr = (unsigned char*)inBuff;
+ inPtr = (const unsigned char*)inBuff;
outPtr = (unsigned char*)outBuff;
inBytes = 0;
outBytes = 0;
@@ -408,7 +408,7 @@ int lzDecompress(void* outBuff, void* inBuff, int inSize) {
}
-int lzDecompressLen(void* outBuff, int outSize, void* inBuff, int inSize) {
+int lzDecompressLen(void* outBuff, int outSize, const void* inBuff, int inSize) {
int p=0;
int len;
@@ -416,7 +416,7 @@ int lzDecompressLen(void* outBuff, int outSize, void* inBuff, int inSize) {
int s;
int windowSize;
- inPtr = (unsigned char*)inBuff;
+ inPtr = (const unsigned char*)inBuff;
outPtr = (unsigned char*)outBuff;
inBytes = 0;
outBytes = 0;
diff --git a/libpsn00b/lzp/crc.c b/libpsn00b/lzp/crc.c
index c5ab702..7cc7bf3 100644
--- a/libpsn00b/lzp/crc.c
+++ b/libpsn00b/lzp/crc.c
@@ -49,7 +49,7 @@ void initTable32(unsigned int* table) {
}
-unsigned short lzCRC16(void* buff, int bytes, unsigned short crc) {
+unsigned short lzCRC16(const void* buff, int bytes, unsigned short crc) {
int i;
unsigned short tmp, short_c;
@@ -59,7 +59,7 @@ unsigned short lzCRC16(void* buff, int bytes, unsigned short crc) {
for(i=0; i<bytes; i++) {
- short_c = 0x00ff & (unsigned short)((unsigned char*)buff)[i];
+ short_c = 0x00ff & (unsigned short)((const unsigned char*)buff)[i];
tmp = crc ^ short_c;
crc = (crc >> 8) ^ crcTable[tmp&0xff];
@@ -70,10 +70,10 @@ unsigned short lzCRC16(void* buff, int bytes, unsigned short crc) {
}
-unsigned int lzCRC32(void* buff, int bytes, unsigned int crc) {
+unsigned int lzCRC32(const void* buff, int bytes, unsigned int crc) {
int i;
- unsigned char* byteBuff = (unsigned char*)buff;
+ unsigned char* byteBuff = (const unsigned char*)buff;
unsigned int byte;
unsigned int crcTable[256];
diff --git a/libpsn00b/lzp/lzp.c b/libpsn00b/lzp/lzp.c
index 1f4fea4..9f2da48 100644
--- a/libpsn00b/lzp/lzp.c
+++ b/libpsn00b/lzp/lzp.c
@@ -17,7 +17,7 @@ static char* lcase(char* text) {
}
-int lzpSearchFile(const char* fileName, void* lzpack) {
+int lzpSearchFile(const char* fileName, const LZP_HEAD* lzpack) {
int i;
char searchName[16];
@@ -27,8 +27,8 @@ int lzpSearchFile(const char* fileName, void* lzpack) {
strcpy(searchName, fileName);
lcase(searchName);
- fileEntry = (LZP_FILE*)(lzpack+4);
- for(i=0; i<((LZP_HEAD*)lzpack)->numFiles; i++) {
+ fileEntry = (LZP_FILE*)(((const char*)lzpack)+sizeof(LZP_HEAD));
+ for(i=0; i<(lzpack->numFiles); i++) {
strcpy(compareName, fileEntry[i].fileName);
lcase(compareName);
@@ -42,44 +42,44 @@ int lzpSearchFile(const char* fileName, void* lzpack) {
}
-LZP_FILE* lzpFileEntry(void* lzpack, int fileNum) {
+const LZP_FILE* lzpFileEntry(const LZP_HEAD* lzpack, int fileNum) {
- if (strncmp("LZP", ((LZP_HEAD*)lzpack)->id, 3) != 0)
+ if (strncmp("LZP", lzpack->id, 3) != 0)
return(NULL);
- if ((fileNum < 0) || (fileNum > (((LZP_HEAD*)lzpack)->numFiles-1)))
+ if ((fileNum < 0) || (fileNum > (lzpack->numFiles-1)))
return(NULL);
- return(&((LZP_FILE*)(lzpack+4))[fileNum]);
+ return &((LZP_FILE*)(((const char*)lzpack)+sizeof(LZP_HEAD)))[fileNum];
}
-int lzpFileSize(void* lzpack, int fileNum) {
+int lzpFileSize(const LZP_HEAD* lzpack, int fileNum) {
- if (strncmp("LZP", ((LZP_HEAD*)lzpack)->id, 3) != 0)
+ if (strncmp("LZP", lzpack->id, 3) != 0)
return 0;
- if ((fileNum < 0) || (fileNum > (((LZP_HEAD*)lzpack)->numFiles-1)))
+ if ((fileNum < 0) || (fileNum > (lzpack->numFiles-1)))
return 0;
- return ((LZP_FILE*)(lzpack+4))[fileNum].fileSize;
+ return ((LZP_FILE*)(((const char*)lzpack)+sizeof(LZP_HEAD)))[fileNum].fileSize;
}
-int lzpUnpackFile(void* buff, void* lzpack, int fileNum) {
+int lzpUnpackFile(void* buff, const LZP_HEAD* lzpack, int fileNum) {
- LZP_FILE* fileEntry = &((LZP_FILE*)(lzpack+4))[fileNum];
+ LZP_FILE* fileEntry = &((LZP_FILE*)(((const char*)lzpack)+sizeof(LZP_HEAD)))[fileNum];
int unpackedSize;
// Check ID header
- if (strncmp("LZP", ((LZP_HEAD*)lzpack)->id, 3) != 0)
+ if (strncmp("LZP", lzpack->id, 3) != 0)
return(LZP_ERR_INVALID_PACK);
// Do a CRC16 check of the compressed data's integrity
- if (lzCRC32(lzpack+fileEntry->offset, fileEntry->packedSize, LZP_CRC32_REMAINDER) != fileEntry->crc)
+ if (lzCRC32(((const char*)lzpack)+fileEntry->offset, fileEntry->packedSize, LZP_CRC32_REMAINDER) != fileEntry->crc)
return(LZP_ERR_CRC_MISMATCH);
// Decompress data to the specified address
- unpackedSize = lzDecompress(buff, lzpack+fileEntry->offset, fileEntry->packedSize);
+ unpackedSize = lzDecompress(buff, ((const char*)lzpack)+fileEntry->offset, fileEntry->packedSize);
if (unpackedSize < 0)
return(unpackedSize);
diff --git a/libpsn00b/lzp/lzp.h b/libpsn00b/lzp/lzp.h
index ffd7933..cfeeb72 100644
--- a/libpsn00b/lzp/lzp.h
+++ b/libpsn00b/lzp/lzp.h
@@ -111,7 +111,7 @@ extern "C" {
*
* \returns The size of the compressed data in bytes.
*/
-int lzCompress(void* outBuff, void* inBuff, int inSize, int level);
+int lzCompress(void* outBuff, const void* inBuff, int inSize, int level);
/*! Decompress a compressed block of data.
*
@@ -130,9 +130,9 @@ int lzCompress(void* outBuff, void* inBuff, int inSize, int level);
* \returns Size of decompressed data in bytes or LZP_ERR_DECOMPRESS if a
* decompression error occurred.
*/
-int lzDecompress(void* outBuff, void* inBuff, int inSize);
+int lzDecompress(void* outBuff, const void* inBuff, int inSize);
-int lzDecompressLen(void* outBuff, int outSize, void* inBuff, int inSize);
+int lzDecompressLen(void* outBuff, int outSize, const void* inBuff, int inSize);
/*! Sets the sizes of hash tables for data compression.
*
@@ -162,7 +162,7 @@ void lzResetHashSizes();
*
* \returns CRC16 hash of specified buffer.
*/
-unsigned short lzCRC16(void* buff, int bytes, unsigned short crc);
+unsigned short lzCRC16(const void* buff, int bytes, unsigned short crc);
/*! Calculates a CRC32 hash of the specified buffer.
*
@@ -172,7 +172,7 @@ unsigned short lzCRC16(void* buff, int bytes, unsigned short crc);
*
* \returns CRC32 hash of specified buffer.
*/
-unsigned int lzCRC32(void* buff, int bytes, unsigned int crc);
+unsigned int lzCRC32(const void* buff, int bytes, unsigned int crc);
/*! @} */
@@ -189,9 +189,9 @@ unsigned int lzCRC32(void* buff, int bytes, unsigned int crc);
*
* \returns File index of found file or one of \ref libraryErrorCodes if an error occurred.
*/
-int lzpSearchFile(const char* fileName, void* lzpack);
+int lzpSearchFile(const char* fileName, const LZP_HEAD* lzpack);
-int lzpFileSize(void* lzpack, int fileNum);
+int lzpFileSize(const LZP_HEAD* lzpack, int fileNum);
/*! Get a pointer to a file entry inside of an LZP archive.
*
@@ -200,7 +200,7 @@ int lzpFileSize(void* lzpack, int fileNum);
*
* \returns A pointer to an LZP_FILE struct or NULL if an error occurred.
*/
-LZP_FILE* lzpFileEntry(void* lzpack, int fileNum);
+const LZP_FILE* lzpFileEntry(const LZP_HEAD* lzpack, int fileNum);
/*! Unpacks a file from an LZP archive to the specified memory buffer.
*
@@ -210,7 +210,7 @@ LZP_FILE* lzpFileEntry(void* lzpack, int fileNum);
*
* \returns Size of decompressed file in bytes or one of \ref libraryErrorCodes if an error occurred.
*/
-int lzpUnpackFile(void* buff, void* lzpack, int fileNum);
+int lzpUnpackFile(void* buff, const LZP_HEAD* lzpack, int fileNum);
/*! @} */
diff --git a/libpsn00b/lzp/lzqlp.h b/libpsn00b/lzp/lzqlp.h
index fae6438..5b70b40 100644
--- a/libpsn00b/lzp/lzqlp.h
+++ b/libpsn00b/lzp/lzqlp.h
@@ -1,6 +1,11 @@
#ifndef _QLP_H
#define _QLP_H
+#include <sys/types.h>
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
#define PACK_ERR_NONE 0
#define PACK_ERR_INVALID -1
#define PACK_ERR_NOTFOUND -2
@@ -8,19 +13,19 @@
#define PACK_ERR_READ_FAULT -4
typedef struct {
- char id[3];
- unsigned char numfiles;
+ char id[3];
+ u_char numfiles;
} QLP_HEAD;
typedef struct {
- char name[16];
- unsigned int size;
- unsigned int offs;
+ char name[16];
+ u_int size;
+ u_int offs;
} QLP_FILE;
-int qlpFileCount(void* qlpfile);
-QLP_FILE* qlpFileEntry(int index, void* qlpfile);
-void* qlpFileAddr(int index, void* qlpfile);
-int qlpFindFile(char* fileName, void* qlpfile);
+int qlpFileCount(const QLP_HEAD* qlpfile);
+const QLP_FILE* qlpFileEntry(int index, const QLP_HEAD* qlpfile);
+const void* qlpFileAddr(int index, const QLP_HEAD* qlpfile);
+int qlpFindFile(char* fileName, const QLP_HEAD* qlpfile);
#endif // _QLP_H \ No newline at end of file
diff --git a/libpsn00b/lzp/qlp.c b/libpsn00b/lzp/qlp.c
index 3be8356..e54f99f 100644
--- a/libpsn00b/lzp/qlp.c
+++ b/libpsn00b/lzp/qlp.c
@@ -14,34 +14,34 @@ static char* lcase(char* str) {
}
-int qlpFileCount(void* qlpfile) {
+int qlpFileCount(const QLP_HEAD* qlpfile) {
- if (strncmp(((QLP_HEAD*)qlpfile)->id, "QLP", 3) != 0)
+ if (strncmp(qlpfile->id, "QLP", 3) != 0)
return(PACK_ERR_INVALID);
- return(((QLP_HEAD*)qlpfile)->numfiles);
+ return(qlpfile->numfiles);
}
-QLP_FILE* qlpFileEntry(int index, void* qlpfile) {
+const QLP_FILE* qlpFileEntry(int index, const QLP_HEAD* qlpfile) {
- if (strncmp(((QLP_HEAD*)qlpfile)->id, "QLP", 3) != 0)
+ if (strncmp(qlpfile->id, "QLP", 3) != 0)
return(NULL);
- if (index > ((QLP_HEAD*)qlpfile)->numfiles)
+ if (index > qlpfile->numfiles)
return(NULL);
- return(&((QLP_FILE*)(qlpfile+4))[index]);
+ return(&((QLP_FILE*)(((const char*)qlpfile)+sizeof(QLP_HEAD)))[index]);
}
-void* qlpFileAddr(int index, void* qlpfile) {
+const void* qlpFileAddr(int index, const QLP_HEAD* qlpfile) {
- return( qlpfile+((QLP_FILE*)(qlpfile+4))[index].offs );
+ return( ((const char*)qlpfile)+((QLP_FILE*)(((const char*)qlpfile)+sizeof(QLP_HEAD)))[index].offs );
}
-int qlpFindFile(char* fileName, void* qlpfile) {
+int qlpFindFile(char* fileName, const QLP_HEAD* qlpfile) {
int i;
char nameBuff[2][16];
@@ -49,9 +49,9 @@ int qlpFindFile(char* fileName, void* qlpfile) {
strcpy(nameBuff[0], fileName);
lcase(nameBuff[0]);
- for(i=0; i<((QLP_HEAD*)qlpfile)->numfiles; i++) {
+ for(i=0; i<(qlpfile->numfiles); i++) {
- strcpy(nameBuff[1], ((QLP_FILE*)(qlpfile+4))[i].name);
+ strcpy(nameBuff[1], ((QLP_FILE*)(((const char*)qlpfile)+sizeof(QLP_HEAD)))[i].name);
lcase(nameBuff[1]);
if (strcmp(nameBuff[0], nameBuff[1]) == 0)
diff --git a/tools/lzpack/filelist.h b/tools/lzpack/filelist.h
index 5351335..f6ad478 100644
--- a/tools/lzpack/filelist.h
+++ b/tools/lzpack/filelist.h
@@ -4,9 +4,14 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
-#include <unistd.h>
#include <limits.h>
+#ifdef WIN32
+#include <windows.h>
+#else
+#include <unistd.h>
+#endif
+
#ifndef MAX_PATH
#define MAX_PATH PATH_MAX
#endif
diff --git a/tools/lzpack/main.cpp b/tools/lzpack/main.cpp
index e57117e..f684d18 100644
--- a/tools/lzpack/main.cpp
+++ b/tools/lzpack/main.cpp
@@ -151,11 +151,10 @@ int main(int argc, const char* argv[]) {
int CreateLZPfile(const char* packFile, FileListClass* fileList) {
FILE* packp;
- LZP_FILE entry[fileList->EntryCount()];
+ LZP_FILE* entry=new LZP_FILE[fileList->EntryCount()];
int overallSize=0;
int overallPackedSize=0;
-
packp = fopen(packFile, "wb");
fseek(packp, sizeof(LZP_HEAD)+(sizeof(LZP_FILE)*fileList->EntryCount()), SEEK_SET);
@@ -179,6 +178,7 @@ int CreateLZPfile(const char* packFile, FileListClass* fileList) {
printf("ERROR: Entry '%s' has more than 15 characters.\n", name);
fclose(packp);
unlink(packFile);
+ delete entry;
return(0);
@@ -199,13 +199,13 @@ int CreateLZPfile(const char* packFile, FileListClass* fileList) {
int fileSize = ftell(fp);
fseek(fp, 0, SEEK_SET);
- void* fileBuff = malloc(fileSize);
+ char* fileBuff = new char[fileSize];
fread(fileBuff, fileSize, 1, fp);
fclose(fp);
- void* compBuff = malloc(fileSize+16384);
+ char* compBuff = new char[fileSize+16384];
int compSize = lzCompress(compBuff, fileBuff, fileSize, 2);
@@ -216,8 +216,8 @@ int CreateLZPfile(const char* packFile, FileListClass* fileList) {
fwrite(compBuff, compSize, 1, packp);
- free(compBuff);
- free(fileBuff);
+ delete compBuff;
+ delete fileBuff;
printf("Ok. (%.02f%%)\n", 100.f*((float)compSize/fileSize));
@@ -238,7 +238,7 @@ int CreateLZPfile(const char* packFile, FileListClass* fileList) {
fwrite(entry, sizeof(LZP_FILE), fileList->EntryCount(), packp);
fclose(packp);
-
+ delete entry;
printf("Packed %d file(s) totaling %d bytes (%.02f%% compression ratio).\n",
fileList->EntryCount(),
@@ -255,7 +255,7 @@ int CreateQLPfile(const char* packFile, FileListClass* fileList) {
FILE* packp;
QLP_HEAD head;
- QLP_FILE fileEntry[fileList->EntryCount()];
+ QLP_FILE* fileEntry=new QLP_FILE[fileList->EntryCount()];
strncpy(head.id, "QLP", 3);
head.numFiles = fileList->EntryCount();
@@ -285,6 +285,7 @@ int CreateQLPfile(const char* packFile, FileListClass* fileList) {
printf("ERROR: Entry '%s' has more than 15 characters.\n", name);
fclose(packp);
unlink(packFile);
+ delete fileEntry;
return(0);
@@ -315,7 +316,7 @@ int CreateQLPfile(const char* packFile, FileListClass* fileList) {
FILE* fp = fopen(fileList->Entry(i)->fileName, "rb");
int bytesCopied = 0;
- void* copyBuff = malloc(BUFF_SIZE);
+ char* copyBuff = new char[BUFF_SIZE];
while(!feof(fp)) {
@@ -327,7 +328,7 @@ int CreateQLPfile(const char* packFile, FileListClass* fileList) {
}
- free(copyBuff);
+ delete copyBuff;
fclose(fp);
fileEntry[i].fileSize = bytesCopied;
@@ -344,6 +345,7 @@ int CreateQLPfile(const char* packFile, FileListClass* fileList) {
fwrite(fileEntry, sizeof(QLP_FILE), head.numFiles, packp);
fclose(packp);
+ delete fileEntry;
return(true);
@@ -402,7 +404,7 @@ int CreatePCKfile(const char* packFile, FileListClass* fileList) {
}
FILE* fp = fopen(fileList->Entry(i)->fileName, "rb");
- void* buff = malloc(BUFF_SIZE);
+ char* buff = new char[BUFF_SIZE];
int bytesTotal = 0;
@@ -415,18 +417,18 @@ int CreatePCKfile(const char* packFile, FileListClass* fileList) {
}
fclose(fp);
- free(buff);
+ delete buff;
toc.file[i].size = bytesTotal;
if ((2048*((ftell(packp)+2047)/2048)) != ftell(packp)) {
int pad = (2048*(((ftell(packp)%2048)+2047)/2048))-(ftell(packp)%2048);
- char padding[pad];
+ char* padding = new char[pad];
memset(padding, 0x00, pad);
fwrite(padding, pad, 1, packp);
-
+ delete padding;
}
printf("Done.\n");
diff --git a/tools/smxlink/main.cpp b/tools/smxlink/main.cpp
index 8072274..d58f36a 100644
--- a/tools/smxlink/main.cpp
+++ b/tools/smxlink/main.cpp
@@ -15,6 +15,10 @@
//#include <windef.h>
#include "timreader.h"
+#ifdef WIN32
+#define strcasecmp _stricmp
+#endif
+
#define VERSION "0.25b"
namespace param
diff --git a/tools/smxlink/timreader.cpp b/tools/smxlink/timreader.cpp
index a8fba94..5116f52 100644
--- a/tools/smxlink/timreader.cpp
+++ b/tools/smxlink/timreader.cpp
@@ -2,6 +2,10 @@
#include <string.h>
#include "timreader.h"
+#ifdef WIN32
+#define strcasecmp _stricmp
+#endif
+
int GetTimCoords(const char* fileName, TIM_COORDS *coords) {
FILE* fp = fopen(fileName, "rb");
diff --git a/tools/util/elf2cpe.c b/tools/util/elf2cpe.c
index 4379f4a..46b0a37 100644
--- a/tools/util/elf2cpe.c
+++ b/tools/util/elf2cpe.c
@@ -3,6 +3,10 @@
#include <malloc.h>
#include "elf.h"
+#ifdef WIN32
+#define strcasecmp _stricmp
+#endif
+
#define MAX_prg_entry_count 128
#ifndef false
diff --git a/tools/util/elf2x.c b/tools/util/elf2x.c
index 26ec9a3..9a7c126 100644
--- a/tools/util/elf2x.c
+++ b/tools/util/elf2x.c
@@ -6,6 +6,10 @@
#include <string.h>
#include "elf.h"
+#ifdef WIN32
+#define strcasecmp _stricmp
+#endif
+
#define MAX_prg_entry_count 128
#define true (1)
#define false (0)
@@ -233,9 +237,12 @@ int main(int argc, char** argv) {
exe.params.t_size = exe_tsize;
exe.params.pc0 = head.prg_entry_addr;
+ // Some later PAL BIOS versions seem to actually verify the license string
+ // in the executable (despite what the nocash docs claim) and display the
+ // dreaded "insert PlayStation CD-ROM" screen if it's not valid.
strncpy( exe.header, "PS-X EXE", 8 );
strcpy( exe.license,
- "Not Licensed or Endorsed by Sony Computer Entertainment Inc." );
+ "Sony Computer Entertainment Inc. for Europe area" );
strcpy( exe.pad2, "Built using GCC and PSn00bSDK libraries" );