diff --git a/.gitmodules b/.gitmodules index b37b17d919a..a5fc51f27b1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -93,6 +93,12 @@ path = waterbox/dsda/core url = https://github.com/TASEmulators/dsda-doom.git branch = wbx +[submodule "ppsspp/ppsspp"] + path = ppsspp/ppsspp + url = https://github.com/TASEmulators/ppsspp.git +[submodule "ppsspp/jaffarCommon"] + path = ppsspp/jaffarCommon + url = https://github.com/SergioMartin86/jaffarCommon.git [submodule "waterbox/opera/opera-libretro"] path = waterbox/opera/opera-libretro url = https://github.com/TASEmulators/opera-libretro.git diff --git a/Assets/dll/libppsspp.dll b/Assets/dll/libppsspp.dll new file mode 100644 index 00000000000..d6bbaef1d87 Binary files /dev/null and b/Assets/dll/libppsspp.dll differ diff --git a/Assets/dll/libppsspp.so b/Assets/dll/libppsspp.so new file mode 100755 index 00000000000..b759cf185ed Binary files /dev/null and b/Assets/dll/libppsspp.so differ diff --git a/ppsspp/.gitignore b/ppsspp/.gitignore new file mode 100644 index 00000000000..9cc8af061f0 --- /dev/null +++ b/ppsspp/.gitignore @@ -0,0 +1,4 @@ +obj +Assets +.o +.so diff --git a/ppsspp/bizhawk.cpp b/ppsspp/bizhawk.cpp new file mode 100644 index 00000000000..8e67e0e652e --- /dev/null +++ b/ppsspp/bizhawk.cpp @@ -0,0 +1,407 @@ +#include "bizhawk.hpp" +#include +#include +#include +#include +#include +#include +#include +#include + +std::string _cdImageFilePath = "__CDROM_PATH.iso"; +std::string _userDataPath; + +// Flag to indicate whether the nvram changed +int _nvramChanged; + +// Storing inputs for the game to read from +gamePad_t _inputData; + +// flag to indicate whether the inputs were polled +bool _readInputs; + +// Audio state +#define _MAX_SAMPLES 4096 +#define _CHANNEL_COUNT 2 +int16_t _audioBuffer[_MAX_SAMPLES * _CHANNEL_COUNT]; +size_t _audioSamples; + +// Video State +uint32_t* _videoBuffer; +size_t _videoHeight; +size_t _videoWidth; +size_t _videoPitch; +size_t _videoBufferSize = 0; + +std::string _compatibilityFileData = ""; +std::string _compatibilityVRFileData = ""; +std::string _ppgeFontFileData = ""; +std::string _ppgeAtlasFontZimFileData = ""; +std::string _ppgeAtlasFontMetadataFileData = ""; +std::string _atlasFontZimFileData = ""; +std::string _atlasFontMetadataFileData = ""; + +// Current Frame information +MyFrameInfo _f; + +extern "C" +{ + void retro_set_audio_sample(retro_audio_sample_t cb); + void retro_set_audio_sample_batch(retro_audio_sample_batch_t cb); + void retro_set_environment(retro_environment_t cb); + void retro_set_input_poll(retro_input_poll_t cb); + void retro_set_input_state(retro_input_state_t cb); + void retro_set_log_printf(retro_log_printf_t cb); + void retro_set_video_refresh(retro_video_refresh_t cb); + RETRO_API void *retro_get_memory_data(unsigned id); + RETRO_API size_t retro_get_memory_size(unsigned id); + void lr_input_device_set(const uint32_t port_, const uint32_t device_); + RETRO_API size_t retro_serialize_size(void); + RETRO_API bool retro_serialize(void *data, size_t size); + RETRO_API bool retro_unserialize(const void *data, size_t size); + void retro_unload_game(void); + void retro_deinit(void); +} + +void RETRO_CALLCONV retro_video_refresh_callback(const void* data, unsigned width, unsigned height, size_t pitch) +{ + //printf("Video %p, w: %u, h: %u, p: %lu\n", data, width, height, pitch); + //size_t checksum = 0; + //for (size_t i = 0; i < height; i++) + // for (size_t j = 0; i < width; i++) + // checksum += ((uint32_t*)data)[i * width + j]; + //printf("Video Checksum: 0x%lX\n", checksum); + + _videoBuffer = (uint32_t*)data; + _videoWidth = width; + _videoHeight = height; + _videoPitch = pitch; + _videoBufferSize = sizeof(uint32_t) * _videoWidth * _videoHeight; +} + +void RETRO_CALLCONV retro_log_printf_callback(enum retro_log_level level, const char *format, ...) +{ + va_list ap; + va_start(ap, format); + vprintf(format, ap); + va_end(ap); +} + +size_t RETRO_CALLCONV retro_audio_sample_batch_callback(const int16_t *data, size_t frames) +{ + memcpy(_audioBuffer, data, sizeof(int16_t) * frames * _CHANNEL_COUNT); + _audioSamples = frames; + return frames; +} + +void RETRO_CALLCONV retro_input_poll_callback() +{ + // printf("Libretro Input Poll Callback Called:\n"); +} + +int16_t RETRO_CALLCONV retro_input_state_callback(unsigned port, unsigned device, unsigned index, unsigned id) +{ + if (device == RETRO_DEVICE_JOYPAD) switch (id) + { + case RETRO_DEVICE_ID_JOYPAD_UP: return _inputData.up ? 1 : 0; + case RETRO_DEVICE_ID_JOYPAD_DOWN: return _inputData.down ? 1 : 0; + case RETRO_DEVICE_ID_JOYPAD_LEFT: return _inputData.left ? 1 : 0; + case RETRO_DEVICE_ID_JOYPAD_RIGHT: return _inputData.right ? 1 : 0; + case RETRO_DEVICE_ID_JOYPAD_L: return _inputData.ltrigger ? 1 : 0; + case RETRO_DEVICE_ID_JOYPAD_R: return _inputData.rtrigger ? 1 : 0; + case RETRO_DEVICE_ID_JOYPAD_SELECT: return _inputData.select ? 1 : 0; + case RETRO_DEVICE_ID_JOYPAD_START: return _inputData.start ? 1 : 0; + case RETRO_DEVICE_ID_JOYPAD_X: return _inputData.triangle ? 1 : 0; + case RETRO_DEVICE_ID_JOYPAD_Y: return _inputData.square ? 1 : 0; + case RETRO_DEVICE_ID_JOYPAD_B: return _inputData.cross ? 1 : 0; + case RETRO_DEVICE_ID_JOYPAD_A: return _inputData.circle ? 1 : 0; + default: return 0; + } + + if (device == RETRO_DEVICE_ANALOG) switch (id) + { + case RETRO_DEVICE_ID_ANALOG_X: + if (index == RETRO_DEVICE_INDEX_ANALOG_LEFT) return _inputData.leftAnalogX; + return 0; + + case RETRO_DEVICE_ID_ANALOG_Y: + if (index == RETRO_DEVICE_INDEX_ANALOG_LEFT) return _inputData.leftAnalogY; + return 0; + + default: return 0; + } + + return 0; +} + +char _deviceCountOption[256]; +void configHandler(struct retro_variable *var) +{ + var->value = nullptr; + //printf("Variable Name: %s / Value: %s\n", var->key, var->value); + std::string key(var->key); +} + +const char* systemPath = "."; +bool RETRO_CALLCONV retro_environment_callback(unsigned cmd, void *data) +{ + // printf("Libretro Environment Callback Called: %u\n", cmd); + + if (cmd == RETRO_ENVIRONMENT_GET_LOG_INTERFACE) { *((retro_log_printf_t*)data) = retro_log_printf_callback; return true; } + if (cmd == RETRO_ENVIRONMENT_SET_PERFORMANCE_LEVEL) { return true; } + if (cmd == RETRO_ENVIRONMENT_SET_SERIALIZATION_QUIRKS) { return true; } + if (cmd == RETRO_ENVIRONMENT_GET_VARIABLE) { configHandler((struct retro_variable *)data); return true; } + if (cmd == RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE) { return true; } + if (cmd == RETRO_ENVIRONMENT_SET_PIXEL_FORMAT) { *((retro_pixel_format*) data) = RETRO_PIXEL_FORMAT_XRGB8888; return true; } + if (cmd == RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY) { *((const char**)data) = _userDataPath.c_str(); return true; } + if (cmd == RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY) { return true; } + if (cmd == RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION) { return false; } + if (cmd == RETRO_ENVIRONMENT_SET_VARIABLES) { return false; } + if (cmd == RETRO_ENVIRONMENT_SET_CORE_OPTIONS_UPDATE_DISPLAY_CALLBACK) { return false; } + if (cmd == RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS) { return false; } + if (cmd == RETRO_ENVIRONMENT_SET_CONTROLLER_INFO) { return false; } + if (cmd == RETRO_ENVIRONMENT_GET_INPUT_BITMASKS) { return false; } + if (cmd == RETRO_ENVIRONMENT_GET_USERNAME) { return false; } + if (cmd == RETRO_ENVIRONMENT_GET_LANGUAGE) { return false; } + if (cmd == RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY) { return false; } + if (cmd == RETRO_ENVIRONMENT_GET_PREFERRED_HW_RENDER) { return false; } + if (cmd == RETRO_ENVIRONMENT_SET_HW_RENDER) { return false; } + if (cmd == RETRO_ENVIRONMENT_SHUTDOWN) { return false; } + if (cmd == RETRO_ENVIRONMENT_SET_SYSTEM_AV_INFO) { return false; } + if (cmd == RETRO_ENVIRONMENT_SET_GEOMETRY) { return false; } + + fprintf(stderr, "Unrecognized environment callback command: %u\n", cmd); + + return false; +} + +/// CD Management Logic Start +#define CDIMAGE_SECTOR_SIZE 2048 +uint32_t _currentSector = 0; +void (*cd_read_callback)(int32_t lba, void * dest); +int (*cd_sector_count_callback)(); +EXPORT void SetCdCallbacks(void (*cdrc)(int32_t lba, void * dest), int (*cdscc)()) +{ + cd_read_callback = cdrc; + cd_sector_count_callback = cdscc; +} + +uint32_t cd_get_size(void) { return cd_sector_count_callback() * CDIMAGE_SECTOR_SIZE; } +uint32_t cd_get_sector_count(void) { return cd_sector_count_callback(); } +void cd_set_sector(const uint32_t sector_) { _currentSector = sector_; } +void cd_read_sector(void *buf_) { cd_read_callback(_currentSector, buf_); } +size_t readSegmentFromCD(void *buf_, const uint64_t address, const size_t size) +{ + uint64_t initialSector = address / CDIMAGE_SECTOR_SIZE; + uint64_t sectorCount = size / CDIMAGE_SECTOR_SIZE; + uint64_t lastSectorBytes = size % CDIMAGE_SECTOR_SIZE; + + uint8_t tmpBuf[CDIMAGE_SECTOR_SIZE]; + for (uint64_t i = 0; i < sectorCount; i++) + { + cd_set_sector(initialSector + i); + cd_read_sector(tmpBuf); + memcpy(&((uint8_t*)buf_)[CDIMAGE_SECTOR_SIZE * i], tmpBuf, CDIMAGE_SECTOR_SIZE); + } + + if (lastSectorBytes > 0) + { + cd_set_sector(initialSector + sectorCount); + cd_read_sector(tmpBuf); + memcpy(&((uint8_t*)buf_)[CDIMAGE_SECTOR_SIZE * sectorCount], tmpBuf, lastSectorBytes); + } + + return size; +} + +/// CD Management Logic End + +/// Resource loader +EXPORT bool loadResource(const char* resourceName, uint8_t* buffer, int resourceLen) +{ + std::string name = std::string(resourceName); + printf("Trying to load resource: %s\n", name.c_str()); + + if (name == "compat.ini") { + printf("Loading resource: %s\n", name.c_str()); + _compatibilityFileData = std::string((const char*)buffer, resourceLen); + return true; + } + + if (name == "compatvr.ini") + { + printf("Loading resource: %s\n", name.c_str()); + _compatibilityVRFileData = std::string((const char*)buffer, resourceLen); + return true; + } + + if (name == "PPGeFont.ttf") + { + printf("Loading resource: %s\n", name.c_str()); + _ppgeFontFileData = std::string((const char*)buffer, resourceLen); + return true; + } + + if (name == "ppge_atlas.zim") + { + printf("Loading resource: %s\n", name.c_str()); + _ppgeAtlasFontZimFileData = std::string((const char*)buffer, resourceLen); + return true; + } + + if (name == "ppge_atlas.meta") + { + printf("Loading resource: %s\n", name.c_str()); + _ppgeAtlasFontMetadataFileData = std::string((const char*)buffer, resourceLen); + return true; + } + + if (name == "font_atlas.zim") + { + printf("Loading resource: %s\n", name.c_str()); + _atlasFontZimFileData = std::string((const char*)buffer, resourceLen); + return true; + } + + if (name == "font_atlas.meta") + { + printf("Loading resource: %s\n", name.c_str()); + _atlasFontMetadataFileData = std::string((const char*)buffer, resourceLen); + return true; + } + + return false; +} + + +EXPORT bool Init(const char* gameFile, const char* userDataPath) +{ + + printf("Game File: %s\n", gameFile); + printf("User Data Path: %s\n", userDataPath); + _userDataPath = userDataPath; + + retro_set_environment(retro_environment_callback); + retro_set_input_poll(retro_input_poll_callback); + retro_set_audio_sample_batch(retro_audio_sample_batch_callback); + retro_set_video_refresh(retro_video_refresh_callback); + retro_set_input_state(retro_input_state_callback); + + // Normal way to initialize + retro_init(); + struct retro_game_info game; + game.path = _cdImageFilePath.c_str(); + auto loadResult = retro_load_game(&game); + if (loadResult == false) { fprintf(stderr, "Could not load game"); return false; } + + // Advancing until gpu is initialized -- this is necessary for proper savestates + while (!gpu) + { + printf("Waiting for GPU\n"); + retro_run(); + } + + // Getting av info + struct retro_system_av_info info; + retro_get_system_av_info(&info); + printf("PSP Framerate: %f\n", info.timing.fps); + + return true; +} + +EXPORT void GetVideo(uint32_t* videoBuffer) +{ + memcpy(videoBuffer, _videoBuffer, _videoBufferSize); +} + +EXPORT int GetAudio(int8_t* audioBuffer) +{ + memcpy(audioBuffer, _audioBuffer, sizeof(int16_t) * _audioSamples * _CHANNEL_COUNT); + return (int)_audioSamples * _CHANNEL_COUNT; +} + + +void (*InputCallback)(); +EXPORT void SetInputCallback(void (*callback)()) +{ + InputCallback = callback; +} + +EXPORT void FrameAdvance(MyFrameInfo f) +{ + // Setting Frame information + _f = f; + + // Setting input data + _inputData = _f.gamePad; + + //printf("up: %d\n", _inputData.up); + //printf("down: %d\n", _inputData.down); + //printf("left: %d\n", _inputData.left); + //printf("right: %d\n", _inputData.right); + //printf("ltrigger: %d\n", _inputData.ltrigger); + //printf("rtrigger: %d\n", _inputData.rtrigger); + //printf("select: %d\n", _inputData.select); + //printf("start: %d\n", _inputData.start); + //printf("triangle: %d\n", _inputData.triangle); + //printf("square: %d\n", _inputData.square); + //printf("cross: %d\n", _inputData.cross); + //printf("circle: %d\n", _inputData.circle); + //printf("leftAnalogX: %d\n", _inputData.leftAnalogX); + //printf("leftAnalogY: %d\n", _inputData.leftAnalogY); + + // Checking for changes in NVRAM + _nvramChanged = false; + + // Checking if ports have been read + _readInputs = 0; + + // Jumping into the emu driver coroutine to run a single frame + retro_run(); + + // Indicating whether the inputs were polled + if (_readInputs == 1) InputCallback(); +} + +// EXPORT void GetMemoryAreas(MemoryArea *m) +// { +// int memAreaIdx = 0; + +// m[memAreaIdx].Data = retro_get_memory_data(RETRO_MEMORY_SYSTEM_RAM); +// m[memAreaIdx].Name = "System RAM"; +// m[memAreaIdx].Size = retro_get_memory_size(RETRO_MEMORY_SYSTEM_RAM); +// m[memAreaIdx].Flags = MEMORYAREA_FLAGS_WORDSIZE1 | MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_PRIMARY; +// memAreaIdx++; + +// // m[memAreaIdx].Data = get_sram_buffer(); +// // m[memAreaIdx].Name = "Non-volatile RAM"; +// // m[memAreaIdx].Size = get_sram_size(); +// // m[memAreaIdx].Flags = MEMORYAREA_FLAGS_WORDSIZE1 | MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_SAVERAMMABLE; +// // memAreaIdx++; +// } + + +EXPORT int GetStateSize() +{ + return retro_serialize_size(); +} + +EXPORT void SaveState(uint8_t* buffer) +{ + printf("Saving State\n"); + bool result = retro_serialize(buffer, retro_serialize_size()); + if (result == false) printf("Save state failed\n"); +} + +EXPORT void LoadState(uint8_t* buffer, int size) +{ + printf("Loading State\n"); + bool result = retro_unserialize(buffer, size); + if (result == false) printf("Load state failed\n"); +} + +EXPORT void Deinit() +{ + retro_unload_game(); + retro_deinit(); +} diff --git a/ppsspp/bizhawk.hpp b/ppsspp/bizhawk.hpp new file mode 100644 index 00000000000..0679f551767 --- /dev/null +++ b/ppsspp/bizhawk.hpp @@ -0,0 +1,38 @@ +#pragma once + +// system +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#define EXPORT extern "C" __declspec(dllexport) +#else +#define EXPORT extern "C" __attribute__((visibility("default"))) +#endif + +struct gamePad_t +{ + int32_t up; + int32_t down; + int32_t left; + int32_t right; + int32_t start; + int32_t select; + int32_t square; + int32_t triangle; + int32_t circle; + int32_t cross; + int32_t ltrigger; + int32_t rtrigger; + int32_t leftAnalogX; + int32_t leftAnalogY; +}; + +typedef struct +{ + gamePad_t gamePad; +} MyFrameInfo; + diff --git a/ppsspp/jaffarCommon b/ppsspp/jaffarCommon new file mode 160000 index 00000000000..4254dcea6cb --- /dev/null +++ b/ppsspp/jaffarCommon @@ -0,0 +1 @@ +Subproject commit 4254dcea6cb78e684d2d2b3f49cd733d0f45073f diff --git a/ppsspp/make/.gitignore b/ppsspp/make/.gitignore new file mode 100644 index 00000000000..eedbade7e07 --- /dev/null +++ b/ppsspp/make/.gitignore @@ -0,0 +1,2 @@ + +*.so diff --git a/ppsspp/make/Makefile b/ppsspp/make/Makefile new file mode 100644 index 00000000000..e0d52da032a --- /dev/null +++ b/ppsspp/make/Makefile @@ -0,0 +1,868 @@ +TARGET := libppsspp.so +CCFLAGS := -I. \ + -g \ + -Os \ + -fPIC \ + -DUSE_FFMPEG=1 \ + -DNDEBUG \ + -D_NDEBUG \ + -DHAVE_GETAUXVAL \ + -DHTTPS_NOT_AVAILABLE \ + -DMASKED_PSP_MEMORY \ + -DMINIUPNPC_SET_SOCKET_TIMEOUT \ + -DNO_MMAP \ + -DSHARED_ZLIB \ + -DVK_USE_PLATFORM_WAYLAND_KHR \ + -DVK_USE_PLATFORM_XLIB_KHR \ + -D_BSD_SOURCE \ + -D_DEFAULT_SOURCE \ + -D_FILE_OFFSET_BITS=64 \ + -D_LARGEFILE64_SOURCE=1 \ + -D_POSIX_C_SOURCE=200112L \ + -D_XOPEN_SOURCE_EXTENDED \ + -D__BSD_VISIBLE=1 \ + -D__STDC_CONSTANT_MACROS \ + -DSTACK_LINE_READER_BUFFER_SIZE=1024 \ + -DSFMT_MEXP=19937 \ + -DENABLE_HLSL \ + -DENABLE_OPT=0 \ + -DGLSLANG_OSINCLUDE_UNIX \ + -D_7ZIP_ST \ + -DSPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS \ + -D__STDC_LIMIT_MACROS \ + -DHAVE_LIBAVCODEC_CONST_AVCODEC=1 \ + -Dppsspp_libretro_EXPORTS \ + -DNO_ARMIPS \ + -DZSTD_DISABLE_ASM \ + -DUSE_SDL2_TTF \ + -DFT_CONFIG_MODULES_H="" \ + -DFT2_BUILD_LIBRARY=1 \ + -DFT_CONFIG_OPTIONS_H="" \ + -DFT_CONFIG_CONFIG_H="" \ + -D__INLINE__=inline \ + -I../ppsspp/ext/glslang \ + -I../ppsspp/ext/glslang-build \ + -I../ppsspp \ + -I../ppsspp/ext \ + -I../ppsspp/libretro \ + -I../ppsspp/ext/OpenXR-SDK/include \ + -I../ppsspp/Common \ + -I../ppsspp/ext/libzip \ + -I../ppsspp/ext/zstd/lib \ + -I../ppsspp/ext/libpng17 \ + -I../ppsspp/ext/snappy/ \ + -I../ppsspp/ext/lua/ \ + -I../ppsspp/ext/libchdr/include \ + -I../ppsspp/ext/rcheevos/include \ + -I../ppsspp/ext/miniupnp-build \ + -I../jaffarCommon/include \ + -I../jaffarCommon/third_party \ + -I../ppsspp/ffmpeg/linux/x86_64/include/ \ + -I../jaffarCommon/subprojects/SDL2_TTF/external/freetype \ + -I../jaffarCommon/subprojects/SDL2_TTF/external/freetype/include \ + -I../jaffarCommon/subprojects/SDL2_TTF/external/harfbuzz/src \ + -I../jaffarCommon/subprojects/SDL2_TTF/external/SDL2/include + +CXXFLAGS := $(CCFLAGS) -std=c++20 + +SRCS = ../bizhawk.cpp \ + ../ppsspp/Common/ABI.cpp \ + ../ppsspp/Common/Arm64Emitter.cpp \ + ../ppsspp/Common/ArmCPUDetect.cpp \ + ../ppsspp/Common/ArmEmitter.cpp \ + ../ppsspp/Common/Buffer.cpp \ + ../ppsspp/Common/Crypto/_md5.cpp \ + ../ppsspp/Common/Crypto/_sha1.cpp \ + ../ppsspp/Common/Crypto/sha256.cpp \ + ../ppsspp/Common/Data/Color/RGBAUtil.cpp \ + ../ppsspp/Common/Data/Convert/ColorConv.cpp \ + ../ppsspp/Common/Data/Convert/SmallDataConvert.cpp \ + ../ppsspp/Common/Data/Encoding/Base64.cpp \ + ../ppsspp/Common/Data/Encoding/Compression.cpp \ + ../ppsspp/Common/Data/Encoding/Utf8.cpp \ + ../ppsspp/Common/Data/Format/DDSLoad.cpp \ + ../ppsspp/Common/Data/Format/IniFile.cpp \ + ../ppsspp/Common/Data/Format/JSONReader.cpp \ + ../ppsspp/Common/Data/Format/JSONWriter.cpp \ + ../ppsspp/Common/Data/Format/RIFF.cpp \ + ../ppsspp/Common/Data/Format/ZIMLoad.cpp \ + ../ppsspp/Common/Data/Format/ZIMSave.cpp \ + ../ppsspp/Common/Data/Hash/_Hash.cpp \ + ../ppsspp/Common/Data/Text/I18n.cpp \ + ../ppsspp/Common/Data/Text/Parsers.cpp \ + ../ppsspp/Common/Data/Text/WrapText.cpp \ + ../ppsspp/Common/ExceptionHandlerSetup.cpp \ + ../ppsspp/Common/FakeCPUDetect.cpp \ + ../ppsspp/Common/File/AndroidContentURI.cpp \ + ../ppsspp/Common/File/AndroidStorage.cpp \ + ../ppsspp/Common/File/DirListing.cpp \ + ../ppsspp/Common/File/DiskFree.cpp \ + ../ppsspp/Common/File/FileDescriptor.cpp \ + ../ppsspp/Common/File/FileUtil.cpp \ + ../ppsspp/Common/File/Path.cpp \ + ../ppsspp/Common/File/PathBrowser.cpp \ + ../ppsspp/Common/File/VFS/DirectoryReader.cpp \ + ../ppsspp/Common/File/VFS/VFS.cpp \ + ../ppsspp/Common/Data/Format/PNGLoad.cpp \ + ../ppsspp/Common/GhidraClient.cpp \ + ../ppsspp/Common/GPU/GPUBackendCommon.cpp \ + ../ppsspp/Common/GPU/Shader.cpp \ + ../ppsspp/Common/GPU/ShaderWriter.cpp \ + ../ppsspp/Common/GPU/thin3d.cpp \ + ../ppsspp/Common/Input/GestureDetector.cpp \ + ../ppsspp/Common/Input/InputState.cpp \ + ../ppsspp/Common/Log.cpp \ + ../ppsspp/Common/Log/ConsoleListener.cpp \ + ../ppsspp/Common/Log/LogManager.cpp \ + ../ppsspp/Common/LogReporting.cpp \ + ../ppsspp/Common/LoongArchCPUDetect.cpp \ + ../ppsspp/Common/Math/curves.cpp \ + ../ppsspp/Common/Math/expression_parser.cpp \ + ../ppsspp/Common/Math/fast/fast_matrix.c \ + ../ppsspp/Common/Math/lin/matrix4x4.cpp \ + ../ppsspp/Common/Math/lin/vec3.cpp \ + ../ppsspp/Common/Math/math_util.cpp \ + ../ppsspp/Common/Math/Statistics.cpp \ + ../ppsspp/Common/MemArenaAndroid.cpp \ + ../ppsspp/Common/MemArenaDarwin.cpp \ + ../ppsspp/Common/MemArenaHorizon.cpp \ + ../ppsspp/Common/MemArenaPosix.cpp \ + ../ppsspp/Common/MemArenaWin32.cpp \ + ../ppsspp/Common/MemoryUtil.cpp \ + ../ppsspp/Common/MemoryUtilHorizon.cpp \ + ../ppsspp/Common/MipsCPUDetect.cpp \ + ../ppsspp/Common/MipsEmitter.cpp \ + ../ppsspp/Common/Net/HTTPClient.cpp \ + ../ppsspp/Common/Net/HTTPHeaders.cpp \ + ../ppsspp/Common/Net/HTTPNaettRequest.cpp \ + ../ppsspp/Common/Net/HTTPRequest.cpp \ + ../ppsspp/Common/Net/HTTPServer.cpp \ + ../ppsspp/Common/Net/NetBuffer.cpp \ + ../ppsspp/Common/Net/Resolve.cpp \ + ../ppsspp/Common/Net/Sinks.cpp \ + ../ppsspp/Common/Net/_URL.cpp \ + ../ppsspp/Common/Net/WebsocketServer.cpp \ + ../ppsspp/Common/OSVersion.cpp \ + ../ppsspp/Common/Profiler/Profiler.cpp \ + ../ppsspp/Common/Render/DrawBuffer.cpp \ + ../ppsspp/Common/Render/ManagedTexture.cpp \ + ../ppsspp/Common/Render/Text/draw_text.cpp \ + ../ppsspp/Common/Render/Text/draw_text_android.cpp \ + ../ppsspp/Common/Render/Text/draw_text_qt.cpp \ + ../ppsspp/Common/Render/Text/draw_text_sdl.cpp \ + ../ppsspp/Common/Render/Text/draw_text_uwp.cpp \ + ../ppsspp/Common/Render/Text/draw_text_win.cpp \ + ../ppsspp/Common/Render/TextureAtlas.cpp \ + ../ppsspp/Common/RiscVCPUDetect.cpp \ + ../ppsspp/Common/RiscVEmitter.cpp \ + ../ppsspp/Common/Serialize/Serializer.cpp \ + ../ppsspp/Common/StringUtils.cpp \ + ../ppsspp/Common/SysError.cpp \ + ../ppsspp/Common/System/Display.cpp \ + ../ppsspp/Common/System/OSD.cpp \ + ../ppsspp/Common/System/Request.cpp \ + ../ppsspp/Common/Thread/ParallelLoop.cpp \ + ../ppsspp/Common/Thread/ThreadManager.cpp \ + ../ppsspp/Common/Thread/ThreadUtil.cpp \ + ../ppsspp/Common/Thunk.cpp \ + ../ppsspp/Common/TimeUtil.cpp \ + ../ppsspp/Common/UI/AsyncImageFileView.cpp \ + ../ppsspp/Common/UI/Context.cpp \ + ../ppsspp/Common/UI/IconCache.cpp \ + ../ppsspp/Common/UI/PopupScreens.cpp \ + ../ppsspp/Common/UI/Root.cpp \ + ../ppsspp/Common/UI/Screen.cpp \ + ../ppsspp/Common/UI/ScrollView.cpp \ + ../ppsspp/Common/UI/Tween.cpp \ + ../ppsspp/Common/UI/UI.cpp \ + ../ppsspp/Common/UI/UIScreen.cpp \ + ../ppsspp/Common/UI/View.cpp \ + ../ppsspp/Common/UI/ViewGroup.cpp \ + ../ppsspp/Common/VR/OpenXRLoader.cpp \ + ../ppsspp/Common/VR/PPSSPPVR.cpp \ + ../ppsspp/Common/VR/VRBase.cpp \ + ../ppsspp/Common/VR/VRFramebuffer.cpp \ + ../ppsspp/Common/VR/VRInput.cpp \ + ../ppsspp/Common/VR/VRMath.cpp \ + ../ppsspp/Common/VR/VRRenderer.cpp \ + ../ppsspp/Common/x64Analyzer.cpp \ + ../ppsspp/Common/x64Emitter.cpp \ + ../ppsspp/Common/File/VFS/ZipFileReader.cpp \ + ../ppsspp/Core/AVIDump.cpp \ + ../ppsspp/Core/Compatibility.cpp \ + ../ppsspp/Core/Config.cpp \ + ../ppsspp/Core/ConfigSettings.cpp \ + ../ppsspp/Core/ControlMapper.cpp \ + ../ppsspp/Core/Core.cpp \ + ../ppsspp/Core/CoreTiming.cpp \ + ../ppsspp/Core/CwCheat.cpp \ + ../ppsspp/Core/LuaContext.cpp \ + ../ppsspp/Core/Screenshot.cpp \ + ../ppsspp/Core/Debugger/Breakpoints.cpp \ + ../ppsspp/Core/Debugger/DisassemblyManager.cpp \ + ../ppsspp/Core/Debugger/MemBlockInfo.cpp \ + ../ppsspp/Core/Debugger/SymbolMap.cpp \ + ../ppsspp/Core/Dialog/PSPDialog.cpp \ + ../ppsspp/Core/Dialog/PSPGamedataInstallDialog.cpp \ + ../ppsspp/Core/Dialog/PSPMsgDialog.cpp \ + ../ppsspp/Core/Dialog/PSPNetconfDialog.cpp \ + ../ppsspp/Core/Dialog/PSPNpSigninDialog.cpp \ + ../ppsspp/Core/Dialog/PSPOskConstants.cpp \ + ../ppsspp/Core/Dialog/PSPOskDialog.cpp \ + ../ppsspp/Core/Dialog/PSPPlaceholderDialog.cpp \ + ../ppsspp/Core/Dialog/PSPSaveDialog.cpp \ + ../ppsspp/Core/Dialog/PSPScreenshotDialog.cpp \ + ../ppsspp/Core/Dialog/SavedataParam.cpp \ + ../ppsspp/Core/ELF/ElfReader.cpp \ + ../ppsspp/Core/ELF/ParamSFO.cpp \ + ../ppsspp/Core/ELF/PBPReader.cpp \ + ../ppsspp/Core/ELF/PrxDecrypter.cpp \ + ../ppsspp/Core/FileLoaders/CachingFileLoader.cpp \ + ../ppsspp/Core/FileLoaders/DiskCachingFileLoader.cpp \ + ../ppsspp/Core/FileLoaders/HTTPFileLoader.cpp \ + ../ppsspp/Core/FileLoaders/LocalFileLoader.cpp \ + ../ppsspp/Core/FileLoaders/RamCachingFileLoader.cpp \ + ../ppsspp/Core/FileLoaders/RetryingFileLoader.cpp \ + ../ppsspp/Core/FileLoaders/ZipFileLoader.cpp \ + ../ppsspp/Core/FileSystems/BlobFileSystem.cpp \ + ../ppsspp/Core/FileSystems/BlockDevices.cpp \ + ../ppsspp/Core/FileSystems/DirectoryFileSystem.cpp \ + ../ppsspp/Core/FileSystems/FileSystem.cpp \ + ../ppsspp/Core/FileSystems/ISOFileSystem.cpp \ + ../ppsspp/Core/FileSystems/MetaFileSystem.cpp \ + ../ppsspp/Core/FileSystems/tlzrc.cpp \ + ../ppsspp/Core/FileSystems/VirtualDiscFileSystem.cpp \ + ../ppsspp/Core/Font/PGF.cpp \ + ../ppsspp/Core/FrameTiming.cpp \ + ../ppsspp/Core/HDRemaster.cpp \ + ../ppsspp/Core/HLE/AtracCtx.cpp \ + ../ppsspp/Core/HLE/AtracCtx2.cpp \ + ../ppsspp/Core/HLE/HLE.cpp \ + ../ppsspp/Core/HLE/HLEHelperThread.cpp \ + ../ppsspp/Core/HLE/HLETables.cpp \ + ../ppsspp/Core/HLE/KUBridge.cpp \ + ../ppsspp/Core/HLE/NetInetConstants.cpp \ + ../ppsspp/Core/HLE/Plugins.cpp \ + ../ppsspp/Core/HLE/proAdhoc.cpp \ + ../ppsspp/Core/HLE/proAdhocServer.cpp \ + ../ppsspp/Core/HLE/ReplaceTables.cpp \ + ../ppsspp/Core/HLE/sceAac.cpp \ + ../ppsspp/Core/HLE/sceAdler.cpp \ + ../ppsspp/Core/HLE/sceAtrac.cpp \ + ../ppsspp/Core/HLE/sceAudio.cpp \ + ../ppsspp/Core/HLE/sceAudiocodec.cpp \ + ../ppsspp/Core/HLE/sceAudioRouting.cpp \ + ../ppsspp/Core/HLE/sceCcc.cpp \ + ../ppsspp/Core/HLE/sceChnnlsv.cpp \ + ../ppsspp/Core/HLE/sceCtrl.cpp \ + ../ppsspp/Core/HLE/sceDeflt.cpp \ + ../ppsspp/Core/HLE/sceDisplay.cpp \ + ../ppsspp/Core/HLE/sceDmac.cpp \ + ../ppsspp/Core/HLE/sceFont.cpp \ + ../ppsspp/Core/HLE/sceG729.cpp \ + ../ppsspp/Core/HLE/sceGameUpdate.cpp \ + ../ppsspp/Core/HLE/sceGe.cpp \ + ../ppsspp/Core/HLE/sceHeap.cpp \ + ../ppsspp/Core/HLE/sceHprm.cpp \ + ../ppsspp/Core/HLE/sceHttp.cpp \ + ../ppsspp/Core/HLE/sceImpose.cpp \ + ../ppsspp/Core/HLE/sceIo.cpp \ + ../ppsspp/Core/HLE/sceJpeg.cpp \ + ../ppsspp/Core/HLE/sceKernel.cpp \ + ../ppsspp/Core/HLE/sceKernelAlarm.cpp \ + ../ppsspp/Core/HLE/sceKernelEventFlag.cpp \ + ../ppsspp/Core/HLE/sceKernelHeap.cpp \ + ../ppsspp/Core/HLE/sceKernelInterrupt.cpp \ + ../ppsspp/Core/HLE/sceKernelMbx.cpp \ + ../ppsspp/Core/HLE/sceKernelMemory.cpp \ + ../ppsspp/Core/HLE/sceKernelModule.cpp \ + ../ppsspp/Core/HLE/sceKernelMsgPipe.cpp \ + ../ppsspp/Core/HLE/sceKernelMutex.cpp \ + ../ppsspp/Core/HLE/sceKernelSemaphore.cpp \ + ../ppsspp/Core/HLE/sceKernelThread.cpp \ + ../ppsspp/Core/HLE/sceKernelTime.cpp \ + ../ppsspp/Core/HLE/sceKernelVTimer.cpp \ + ../ppsspp/Core/HLE/sceMd5.cpp \ + ../ppsspp/Core/HLE/sceMp3.cpp \ + ../ppsspp/Core/HLE/sceMp4.cpp \ + ../ppsspp/Core/HLE/sceMpeg.cpp \ + ../ppsspp/Core/HLE/sceMt19937.cpp \ + ../ppsspp/Core/HLE/sceNet.cpp \ + ../ppsspp/Core/HLE/sceNetAdhoc.cpp \ + ../ppsspp/Core/HLE/sceNetAdhocMatching.cpp \ + ../ppsspp/Core/HLE/sceNetApctl.cpp \ + ../ppsspp/Core/HLE/sceNetInet.cpp \ + ../ppsspp/Core/HLE/sceNetResolver.cpp \ + ../ppsspp/Core/HLE/sceNet_lib.cpp \ + ../ppsspp/Core/HLE/sceNp.cpp \ + ../ppsspp/Core/HLE/sceNp2.cpp \ + ../ppsspp/Core/HLE/sceOpenPSID.cpp \ + ../ppsspp/Core/HLE/sceP3da.cpp \ + ../ppsspp/Core/HLE/sceParseHttp.cpp \ + ../ppsspp/Core/HLE/sceParseUri.cpp \ + ../ppsspp/Core/HLE/scePauth.cpp \ + ../ppsspp/Core/HLE/scePower.cpp \ + ../ppsspp/Core/HLE/scePsmf.cpp \ + ../ppsspp/Core/HLE/scePspNpDrm_user.cpp \ + ../ppsspp/Core/HLE/sceReg.cpp \ + ../ppsspp/Core/HLE/sceRtc.cpp \ + ../ppsspp/Core/HLE/sceSas.cpp \ + ../ppsspp/Core/HLE/sceSfmt19937.cpp \ + ../ppsspp/Core/HLE/sceSha256.cpp \ + ../ppsspp/Core/HLE/sceSircs.cpp \ + ../ppsspp/Core/HLE/sceSsl.cpp \ + ../ppsspp/Core/HLE/sceUmd.cpp \ + ../ppsspp/Core/HLE/sceUsb.cpp \ + ../ppsspp/Core/HLE/sceUsbAcc.cpp \ + ../ppsspp/Core/HLE/sceUsbCam.cpp \ + ../ppsspp/Core/HLE/sceUsbGps.cpp \ + ../ppsspp/Core/HLE/sceUsbMic.cpp \ + ../ppsspp/Core/HLE/sceUtility.cpp \ + ../ppsspp/Core/HLE/sceVaudio.cpp \ + ../ppsspp/Core/HLE/SocketManager.cpp \ + ../ppsspp/Core/HLE/__sceAudio.cpp \ + ../ppsspp/Core/HW/AsyncIOManager.cpp \ + ../ppsspp/Core/HW/Atrac3Standalone.cpp \ + ../ppsspp/Core/HW/BufferQueue.cpp \ + ../ppsspp/Core/HW/Camera.cpp \ + ../ppsspp/Core/HW/Display.cpp \ + ../ppsspp/Core/HW/MediaEngine.cpp \ + ../ppsspp/Core/HW/MemoryStick.cpp \ + ../ppsspp/Core/HW/MpegDemux.cpp \ + ../ppsspp/Core/HW/SasAudio.cpp \ + ../ppsspp/Core/HW/SasReverb.cpp \ + ../ppsspp/Core/HW/SimpleAudioDec.cpp \ + ../ppsspp/Core/HW/StereoResampler.cpp \ + ../ppsspp/Core/Instance.cpp \ + ../ppsspp/Core/KeyMap.cpp \ + ../ppsspp/Core/KeyMapDefaults.cpp \ + ../ppsspp/Core/Loaders.cpp \ + ../ppsspp/Core/MemFault.cpp \ + ../ppsspp/Core/MemMap.cpp \ + ../ppsspp/Core/MemMapFunctions.cpp \ + ../ppsspp/Core/MIPS/ARM64/Arm64Asm.cpp \ + ../ppsspp/Core/MIPS/ARM64/Arm64CompALU.cpp \ + ../ppsspp/Core/MIPS/ARM64/Arm64CompBranch.cpp \ + ../ppsspp/Core/MIPS/ARM64/Arm64CompFPU.cpp \ + ../ppsspp/Core/MIPS/ARM64/Arm64CompLoadStore.cpp \ + ../ppsspp/Core/MIPS/ARM64/Arm64CompReplace.cpp \ + ../ppsspp/Core/MIPS/ARM64/Arm64CompVFPU.cpp \ + ../ppsspp/Core/MIPS/ARM64/Arm64IRAsm.cpp \ + ../ppsspp/Core/MIPS/ARM64/Arm64IRCompALU.cpp \ + ../ppsspp/Core/MIPS/ARM64/Arm64IRCompBranch.cpp \ + ../ppsspp/Core/MIPS/ARM64/Arm64IRCompFPU.cpp \ + ../ppsspp/Core/MIPS/ARM64/Arm64IRCompLoadStore.cpp \ + ../ppsspp/Core/MIPS/ARM64/Arm64IRCompSystem.cpp \ + ../ppsspp/Core/MIPS/ARM64/Arm64IRCompVec.cpp \ + ../ppsspp/Core/MIPS/ARM64/Arm64IRJit.cpp \ + ../ppsspp/Core/MIPS/ARM64/Arm64IRRegCache.cpp \ + ../ppsspp/Core/MIPS/ARM64/Arm64Jit.cpp \ + ../ppsspp/Core/MIPS/ARM64/Arm64RegCache.cpp \ + ../ppsspp/Core/MIPS/ARM64/Arm64RegCacheFPU.cpp \ + ../ppsspp/Core/MIPS/ARM/ArmAsm.cpp \ + ../ppsspp/Core/MIPS/ARM/ArmCompALU.cpp \ + ../ppsspp/Core/MIPS/ARM/ArmCompBranch.cpp \ + ../ppsspp/Core/MIPS/ARM/ArmCompFPU.cpp \ + ../ppsspp/Core/MIPS/ARM/ArmCompLoadStore.cpp \ + ../ppsspp/Core/MIPS/ARM/ArmCompReplace.cpp \ + ../ppsspp/Core/MIPS/ARM/ArmCompVFPU.cpp \ + ../ppsspp/Core/MIPS/ARM/ArmCompVFPUNEON.cpp \ + ../ppsspp/Core/MIPS/ARM/ArmCompVFPUNEONUtil.cpp \ + ../ppsspp/Core/MIPS/ARM/ArmJit.cpp \ + ../ppsspp/Core/MIPS/ARM/ArmRegCache.cpp \ + ../ppsspp/Core/MIPS/ARM/ArmRegCacheFPU.cpp \ + ../ppsspp/Core/MIPS/fake/FakeJit.cpp \ + ../ppsspp/Core/MIPS/IR/IRAnalysis.cpp \ + ../ppsspp/Core/MIPS/IR/IRCompALU.cpp \ + ../ppsspp/Core/MIPS/IR/IRCompBranch.cpp \ + ../ppsspp/Core/MIPS/IR/IRCompFPU.cpp \ + ../ppsspp/Core/MIPS/IR/IRCompLoadStore.cpp \ + ../ppsspp/Core/MIPS/IR/IRCompVFPU.cpp \ + ../ppsspp/Core/MIPS/IR/IRFrontend.cpp \ + ../ppsspp/Core/MIPS/IR/IRInst.cpp \ + ../ppsspp/Core/MIPS/IR/IRInterpreter.cpp \ + ../ppsspp/Core/MIPS/IR/IRJit.cpp \ + ../ppsspp/Core/MIPS/IR/IRNativeCommon.cpp \ + ../ppsspp/Core/MIPS/IR/IRPassSimplify.cpp \ + ../ppsspp/Core/MIPS/IR/IRRegCache.cpp \ + ../ppsspp/Core/MIPS/JitCommon/JitBlockCache.cpp \ + ../ppsspp/Core/MIPS/JitCommon/JitCommon.cpp \ + ../ppsspp/Core/MIPS/JitCommon/JitState.cpp \ + ../ppsspp/Core/MIPS/MIPS.cpp \ + ../ppsspp/Core/MIPS/MIPSAnalyst.cpp \ + ../ppsspp/Core/MIPS/MIPSAsm.cpp \ + ../ppsspp/Core/MIPS/MIPSCodeUtils.cpp \ + ../ppsspp/Core/MIPS/MIPSDebugInterface.cpp \ + ../ppsspp/Core/MIPS/MIPSDis.cpp \ + ../ppsspp/Core/MIPS/MIPSDisVFPU.cpp \ + ../ppsspp/Core/MIPS/MIPS/MipsJit.cpp \ + ../ppsspp/Core/MIPS/MIPSInt.cpp \ + ../ppsspp/Core/MIPS/MIPSIntVFPU.cpp \ + ../ppsspp/Core/MIPS/MIPSStackWalk.cpp \ + ../ppsspp/Core/MIPS/MIPSTables.cpp \ + ../ppsspp/Core/MIPS/MIPSTracer.cpp \ + ../ppsspp/Core/MIPS/MIPSVFPUFallbacks.cpp \ + ../ppsspp/Core/MIPS/MIPSVFPUUtils.cpp \ + ../ppsspp/Core/MIPS/RiscV/RiscVAsm.cpp \ + ../ppsspp/Core/MIPS/RiscV/RiscVCompALU.cpp \ + ../ppsspp/Core/MIPS/RiscV/RiscVCompBranch.cpp \ + ../ppsspp/Core/MIPS/RiscV/RiscVCompFPU.cpp \ + ../ppsspp/Core/MIPS/RiscV/RiscVCompLoadStore.cpp \ + ../ppsspp/Core/MIPS/RiscV/RiscVCompSystem.cpp \ + ../ppsspp/Core/MIPS/RiscV/RiscVCompVec.cpp \ + ../ppsspp/Core/MIPS/RiscV/RiscVJit.cpp \ + ../ppsspp/Core/MIPS/RiscV/RiscVRegCache.cpp \ + ../ppsspp/Core/MIPS/x86/Asm.cpp \ + ../ppsspp/Core/MIPS/x86/CompALU.cpp \ + ../ppsspp/Core/MIPS/x86/CompBranch.cpp \ + ../ppsspp/Core/MIPS/x86/CompFPU.cpp \ + ../ppsspp/Core/MIPS/x86/CompLoadStore.cpp \ + ../ppsspp/Core/MIPS/x86/CompReplace.cpp \ + ../ppsspp/Core/MIPS/x86/CompVFPU.cpp \ + ../ppsspp/Core/MIPS/x86/Jit.cpp \ + ../ppsspp/Core/MIPS/x86/JitSafeMem.cpp \ + ../ppsspp/Core/MIPS/x86/RegCache.cpp \ + ../ppsspp/Core/MIPS/x86/RegCacheFPU.cpp \ + ../ppsspp/Core/MIPS/x86/X64IRAsm.cpp \ + ../ppsspp/Core/MIPS/x86/X64IRCompALU.cpp \ + ../ppsspp/Core/MIPS/x86/X64IRCompBranch.cpp \ + ../ppsspp/Core/MIPS/x86/X64IRCompFPU.cpp \ + ../ppsspp/Core/MIPS/x86/X64IRCompLoadStore.cpp \ + ../ppsspp/Core/MIPS/x86/X64IRCompSystem.cpp \ + ../ppsspp/Core/MIPS/x86/X64IRCompVec.cpp \ + ../ppsspp/Core/MIPS/x86/X64IRJit.cpp \ + ../ppsspp/Core/MIPS/x86/X64IRRegCache.cpp \ + ../ppsspp/Core/PSPLoaders.cpp \ + ../ppsspp/Core/Replay.cpp \ + ../ppsspp/Core/Reporting.cpp \ + ../ppsspp/Core/RetroAchievements.cpp \ + ../ppsspp/Core/SaveState.cpp \ + ../ppsspp/Core/System.cpp \ + ../ppsspp/Core/TiltEventProcessor.cpp \ + ../ppsspp/Core/Util/AtracTrack.cpp \ + ../ppsspp/Core/Util/AudioFormat.cpp \ + ../ppsspp/Core/Util/BlockAllocator.cpp \ + ../ppsspp/Core/Util/DisArm64.cpp \ + ../ppsspp/Core/Util/GameDB.cpp \ + ../ppsspp/Core/Util/GameManager.cpp \ + ../ppsspp/Core/Util/MemStick.cpp \ + ../ppsspp/Core/Util/PortManager.cpp \ + ../ppsspp/Core/Util/PPGeDraw.cpp \ + ../ppsspp/Core/Util/RecentFiles.cpp \ + ../ppsspp/Core/WaveFile.cpp \ + ../ppsspp/ext/at3_standalone/atrac.cpp \ + ../ppsspp/ext/at3_standalone/atrac3.cpp \ + ../ppsspp/ext/at3_standalone/atrac3plus.cpp \ + ../ppsspp/ext/at3_standalone/atrac3plusdec.cpp \ + ../ppsspp/ext/at3_standalone/atrac3plusdsp.cpp \ + ../ppsspp/ext/at3_standalone/compat.cpp \ + ../ppsspp/ext/at3_standalone/fft.cpp \ + ../ppsspp/ext/at3_standalone/get_bits.cpp \ + ../ppsspp/ext/at3_standalone/mem.cpp \ + ../ppsspp/ext/basis_universal/basisu_transcoder.cpp \ + ../ppsspp/ext/cityhash/city.cpp \ + ../ppsspp/ext/disarm.cpp \ + ../ppsspp/ext/gason/gason.cpp \ + ../ppsspp/ext/imgui/imgui.cpp \ + ../ppsspp/ext/imgui/imgui_demo.cpp \ + ../ppsspp/ext/imgui/imgui_draw.cpp \ + ../ppsspp/ext/imgui/imgui_impl_platform.cpp \ + ../ppsspp/ext/imgui/imgui_impl_thin3d.cpp \ + ../ppsspp/ext/imgui/imgui_tables.cpp \ + ../ppsspp/ext/imgui/imgui_widgets.cpp \ + ../ppsspp/ext/jpge/jpgd.cpp \ + ../ppsspp/ext/jpge/jpge.cpp \ + ../ppsspp/ext/libkirk/AES.c \ + ../ppsspp/ext/libkirk/amctrl.c \ + ../ppsspp/ext/libkirk/bn.c \ + ../ppsspp/ext/libkirk/ec.c \ + ../ppsspp/ext/libkirk/kirk_engine.c \ + ../ppsspp/ext/libkirk/SHA1.c \ + ../ppsspp/ext/minimp3/minimp3.cpp \ + ../ppsspp/ext/riscv-disas.cpp \ + ../ppsspp/ext/sfmt19937/SFMT.c \ + ../ppsspp/ext/udis86/decode.c \ + ../ppsspp/ext/udis86/itab.c \ + ../ppsspp/ext/udis86/syn-att.c \ + ../ppsspp/ext/udis86/syn-intel.c \ + ../ppsspp/ext/udis86/syn.c \ + ../ppsspp/ext/udis86/udis86.c \ + ../ppsspp/ext/xbrz/xbrz.cpp \ + ../ppsspp/ext/_xxhash.c \ + ../ppsspp/GPU/Common/DepalettizeShaderCommon.cpp \ + ../ppsspp/GPU/Common/DepthBufferCommon.cpp \ + ../ppsspp/GPU/Common/DepthRaster.cpp \ + ../ppsspp/GPU/Common/Draw2D.cpp \ + ../ppsspp/GPU/Common/DrawEngineCommon.cpp \ + ../ppsspp/GPU/Common/FramebufferManagerCommon.cpp \ + ../ppsspp/GPU/Common/GPUDebugInterface.cpp \ + ../ppsspp/GPU/Common/GPUStateUtils.cpp \ + ../ppsspp/GPU/Common/IndexGenerator.cpp \ + ../ppsspp/GPU/Common/PostShader.cpp \ + ../ppsspp/GPU/Common/PresentationCommon.cpp \ + ../ppsspp/GPU/Common/ReinterpretFramebuffer.cpp \ + ../ppsspp/GPU/Common/ReplacedTexture.cpp \ + ../ppsspp/GPU/Common/ShaderCommon.cpp \ + ../ppsspp/GPU/Common/ShaderId.cpp \ + ../ppsspp/GPU/Common/ShaderUniforms.cpp \ + ../ppsspp/GPU/Common/SoftwareTransformCommon.cpp \ + ../ppsspp/GPU/Common/SplineCommon.cpp \ + ../ppsspp/GPU/Common/StencilCommon.cpp \ + ../ppsspp/GPU/Common/TextureCacheCommon.cpp \ + ../ppsspp/GPU/Common/TextureDecoder.cpp \ + ../ppsspp/GPU/Common/TextureReplacer.cpp \ + ../ppsspp/GPU/Common/TextureScalerCommon.cpp \ + ../ppsspp/GPU/Common/TextureShaderCommon.cpp \ + ../ppsspp/GPU/Common/TransformCommon.cpp \ + ../ppsspp/GPU/Common/VertexDecoderArm.cpp \ + ../ppsspp/GPU/Common/VertexDecoderArm64.cpp \ + ../ppsspp/GPU/Common/VertexDecoderCommon.cpp \ + ../ppsspp/GPU/Common/VertexDecoderHandwritten.cpp \ + ../ppsspp/GPU/Common/VertexDecoderRiscV.cpp \ + ../ppsspp/GPU/Common/VertexDecoderX86.cpp \ + ../ppsspp/GPU/Debugger/Breakpoints.cpp \ + ../ppsspp/GPU/Debugger/Debugger.cpp \ + ../ppsspp/GPU/Debugger/GECommandTable.cpp \ + ../ppsspp/GPU/Debugger/Playback.cpp \ + ../ppsspp/GPU/Debugger/Record.cpp \ + ../ppsspp/GPU/Debugger/State.cpp \ + ../ppsspp/GPU/Debugger/Stepping.cpp \ + ../ppsspp/GPU/GeConstants.cpp \ + ../ppsspp/GPU/GeDisasm.cpp \ + ../ppsspp/GPU/GPU.cpp \ + ../ppsspp/GPU/GPUCommon.cpp \ + ../ppsspp/GPU/GPUCommonHW.cpp \ + ../ppsspp/GPU/GPUState.cpp \ + ../ppsspp/GPU/Math3D.cpp \ + ../ppsspp/GPU/Software/BinManager.cpp \ + ../ppsspp/GPU/Software/Clipper.cpp \ + ../ppsspp/GPU/Software/DrawPixel.cpp \ + ../ppsspp/GPU/Software/DrawPixelX86.cpp \ + ../ppsspp/GPU/Software/FuncId.cpp \ + ../ppsspp/GPU/Software/Lighting.cpp \ + ../ppsspp/GPU/Software/Rasterizer.cpp \ + ../ppsspp/GPU/Software/RasterizerRectangle.cpp \ + ../ppsspp/GPU/Software/RasterizerRegCache.cpp \ + ../ppsspp/GPU/Software/Sampler.cpp \ + ../ppsspp/GPU/Software/SamplerX86.cpp \ + ../ppsspp/GPU/Software/SoftGpu.cpp \ + ../ppsspp/GPU/Software/TransformUnit.cpp \ + ../ppsspp/libretro/libretro.cpp \ + ../ppsspp/libretro/LibretroGraphicsContext.cpp \ + ../ppsspp/ext/zstd/lib/common/pool.c \ + ../ppsspp/ext/zstd/lib/common/error_private.c \ + ../ppsspp/ext/zstd/lib/common/entropy_common.c \ + ../ppsspp/ext/zstd/lib/common/zstd_common.c \ + ../ppsspp/ext/zstd/lib/common/debug.c \ + ../ppsspp/ext/zstd/lib/common/fse_decompress.c \ + ../ppsspp/ext/zstd/lib/common/xxhash.c \ + ../ppsspp/ext/zstd/lib/common/threading.c \ + ../ppsspp/ext/zstd/lib/compress/zstd_opt.c \ + ../ppsspp/ext/zstd/lib/compress/zstd_compress_superblock.c \ + ../ppsspp/ext/zstd/lib/compress/zstd_lazy.c \ + ../ppsspp/ext/zstd/lib/compress/zstd_ldm.c \ + ../ppsspp/ext/zstd/lib/compress/zstd_compress_sequences.c \ + ../ppsspp/ext/zstd/lib/compress/zstd_fast.c \ + ../ppsspp/ext/zstd/lib/compress/hist.c \ + ../ppsspp/ext/zstd/lib/compress/zstd_double_fast.c \ + ../ppsspp/ext/zstd/lib/compress/zstd_compress_literals.c \ + ../ppsspp/ext/zstd/lib/compress/fse_compress.c \ + ../ppsspp/ext/zstd/lib/compress/huf_compress.c \ + ../ppsspp/ext/zstd/lib/compress/zstd_compress.c \ + ../ppsspp/ext/zstd/lib/compress/zstdmt_compress.c \ + ../ppsspp/ext/zstd/lib/deprecated/zbuff_decompress.c \ + ../ppsspp/ext/zstd/lib/deprecated/zbuff_compress.c \ + ../ppsspp/ext/zstd/lib/deprecated/zbuff_common.c \ + ../ppsspp/ext/zstd/lib/decompress/huf_decompress.c \ + ../ppsspp/ext/zstd/lib/decompress/zstd_ddict.c \ + ../ppsspp/ext/zstd/lib/decompress/zstd_decompress.c \ + ../ppsspp/ext/zstd/lib/decompress/zstd_decompress_block.c \ + ../ppsspp/ext/zstd/lib/dictBuilder/cover.c \ + ../ppsspp/ext/zstd/lib/dictBuilder/divsufsort.c \ + ../ppsspp/ext/zstd/lib/dictBuilder/fastcover.c \ + ../ppsspp/ext/zstd/lib/dictBuilder/zdict.c \ + ../ppsspp/ext/libpng17/png.c \ + ../ppsspp/ext/libpng17/pngerror.c \ + ../ppsspp/ext/libpng17/pngget.c \ + ../ppsspp/ext/libpng17/pngmem.c \ + ../ppsspp/ext/libpng17/pngpread.c \ + ../ppsspp/ext/libpng17/pngread.c \ + ../ppsspp/ext/libpng17/pngrio.c \ + ../ppsspp/ext/libpng17/pngrtran.c \ + ../ppsspp/ext/libpng17/pngrutil.c \ + ../ppsspp/ext/libpng17/pngset.c \ + ../ppsspp/ext/libpng17/pngtrans.c \ + ../ppsspp/ext/libpng17/pngwio.c \ + ../ppsspp/ext/libpng17/pngwrite.c \ + ../ppsspp/ext/libpng17/pngwtran.c \ + ../ppsspp/ext/libpng17/pngwutil.c \ + ../ppsspp/ext/libzip/zip_source_get_file_attributes.c \ + ../ppsspp/ext/libzip/zip_source_supports.c \ + ../ppsspp/ext/libzip/zip_get_archive_comment.c \ + ../ppsspp/ext/libzip/zip_stat.c \ + ../ppsspp/ext/libzip/zip_file_error_clear.c \ + ../ppsspp/ext/libzip/zip_random_unix.c \ + ../ppsspp/ext/libzip/zip_source_buffer.c \ + ../ppsspp/ext/libzip/zip_source_file_stdio_named.c \ + ../ppsspp/ext/libzip/zip_file_set_mtime.c \ + ../ppsspp/ext/libzip/zip_get_num_files.c \ + ../ppsspp/ext/libzip/zip_new.c \ + ../ppsspp/ext/libzip/zip_set_file_compression.c \ + ../ppsspp/ext/libzip/zip_source_compress.c \ + ../ppsspp/ext/libzip/zip_set_archive_flag.c \ + ../ppsspp/ext/libzip/zip_source_zip.c \ + ../ppsspp/ext/libzip/zip_add_entry.c \ + ../ppsspp/ext/libzip/zip_stat_index.c \ + ../ppsspp/ext/libzip/zip_fopen_index.c \ + ../ppsspp/ext/libzip/zip_delete.c \ + ../ppsspp/ext/libzip/zip_dirent.c \ + ../ppsspp/ext/libzip/zip_dir_add.c \ + ../ppsspp/ext/libzip/zip_set_file_comment.c \ + ../ppsspp/ext/libzip/zip_source_tell_write.c \ + ../ppsspp/ext/libzip/zip_source_layered.c \ + ../ppsspp/ext/libzip/zip_file_get_offset.c \ + ../ppsspp/ext/libzip/zip_source_accept_empty.c \ + ../ppsspp/ext/libzip/zip_source_window.c \ + ../ppsspp/ext/libzip/zip_close.c \ + ../ppsspp/ext/libzip/zip_stat_init.c \ + ../ppsspp/ext/libzip/zip_entry.c \ + ../ppsspp/ext/libzip/zip_hash.c \ + ../ppsspp/ext/libzip/zip_source_close.c \ + ../ppsspp/ext/libzip/zip_error.c \ + ../ppsspp/ext/libzip/zip_io_util.c \ + ../ppsspp/ext/libzip/zip_get_num_entries.c \ + ../ppsspp/ext/libzip/zip_set_default_password.c \ + ../ppsspp/ext/libzip/zip_get_encryption_implementation.c \ + ../ppsspp/ext/libzip/zip_fclose.c \ + ../ppsspp/ext/libzip/zip_fseek.c \ + ../ppsspp/ext/libzip/zip_source_tell.c \ + ../ppsspp/ext/libzip/zip_file_get_external_attributes.c \ + ../ppsspp/ext/libzip/zip_mkstempm.c \ + ../ppsspp/ext/libzip/zip_fopen_encrypted.c \ + ../ppsspp/ext/libzip/zip_file_set_comment.c \ + ../ppsspp/ext/libzip/zip_file_set_encryption.c \ + ../ppsspp/ext/libzip/zip_file_replace.c \ + ../ppsspp/ext/libzip/zip_replace.c \ + ../ppsspp/ext/libzip/zip_unchange_all.c \ + ../ppsspp/ext/libzip/zip_file_strerror.c \ + ../ppsspp/ext/libzip/zip_error_strerror.c \ + ../ppsspp/ext/libzip/zip_memdup.c \ + ../ppsspp/ext/libzip/zip_utf-8.c \ + ../ppsspp/ext/libzip/zip_get_file_comment.c \ + ../ppsspp/ext/libzip/zip_source_begin_write.c \ + ../ppsspp/ext/libzip/zip_fopen.c \ + ../ppsspp/ext/libzip/zip_error_clear.c \ + ../ppsspp/ext/libzip/zip_get_name.c \ + ../ppsspp/ext/libzip/zip_source_crc.c \ + ../ppsspp/ext/libzip/zip_fread.c \ + ../ppsspp/ext/libzip/zip_source_error.c \ + ../ppsspp/ext/libzip/zip_string.c \ + ../ppsspp/ext/libzip/zip_error_to_str.c \ + ../ppsspp/ext/libzip/zip_progress.c \ + ../ppsspp/ext/libzip/zip_source_read.c \ + ../ppsspp/ext/libzip/zip_error_get.c \ + ../ppsspp/ext/libzip/zip_unchange_data.c \ + ../ppsspp/ext/libzip/zip_pkware.c \ + ../ppsspp/ext/libzip/zip_source_zip_new.c \ + ../ppsspp/ext/libzip/zip_file_add.c \ + ../ppsspp/ext/libzip/zip_extra_field_api.c \ + ../ppsspp/ext/libzip/zip_buffer.c \ + ../ppsspp/ext/libzip/zip_file_set_external_attributes.c \ + ../ppsspp/ext/libzip/zip_err_str.c \ + ../ppsspp/ext/libzip/zip_source_remove.c \ + ../ppsspp/ext/libzip/zip_set_archive_comment.c \ + ../ppsspp/ext/libzip/zip_source_function.c \ + ../ppsspp/ext/libzip/zip_strerror.c \ + ../ppsspp/ext/libzip/zip_source_open.c \ + ../ppsspp/ext/libzip/zip_open.c \ + ../ppsspp/ext/libzip/zip_name_locate.c \ + ../ppsspp/ext/libzip/zip_ftell.c \ + ../ppsspp/ext/libzip/zip_extra_field.c \ + ../ppsspp/ext/libzip/zip_fopen_index_encrypted.c \ + ../ppsspp/ext/libzip/zip_source_seek_write.c \ + ../ppsspp/ext/libzip/zip_fdopen.c \ + ../ppsspp/ext/libzip/zip_file_rename.c \ + ../ppsspp/ext/libzip/zip_source_stat.c \ + ../ppsspp/ext/libzip/zip_set_name.c \ + ../ppsspp/ext/libzip/zip_get_archive_flag.c \ + ../ppsspp/ext/libzip/zip_source_is_deleted.c \ + ../ppsspp/ext/libzip/zip_source_seek.c \ + ../ppsspp/ext/libzip/zip_source_file_stdio.c \ + ../ppsspp/ext/libzip/zip_libzip_version.c \ + ../ppsspp/ext/libzip/zip_unchange_archive.c \ + ../ppsspp/ext/libzip/zip_discard.c \ + ../ppsspp/ext/libzip/zip_error_get_sys_type.c \ + ../ppsspp/ext/libzip/zip_file_get_comment.c \ + ../ppsspp/ext/libzip/zip_unchange.c \ + ../ppsspp/ext/libzip/zip_source_commit_write.c \ + ../ppsspp/ext/libzip/zip_source_pkware_encode.c \ + ../ppsspp/ext/libzip/zip_file_error_get.c \ + ../ppsspp/ext/libzip/zip_source_rollback_write.c \ + ../ppsspp/ext/libzip/zip_source_write.c \ + ../ppsspp/ext/libzip/zip_source_file_common.c \ + ../ppsspp/ext/libzip/zip_source_pkware_decode.c \ + ../ppsspp/ext/libzip/zip_rename.c \ + ../ppsspp/ext/libzip/zip_add.c \ + ../ppsspp/ext/libzip/zip_source_call.c \ + ../ppsspp/ext/libzip/zip_source_free.c \ + ../ppsspp/ext/libzip/zip_source_begin_write_cloning.c \ + ../ppsspp/ext/libzip/zip_algorithm_deflate.c \ + ../ppsspp/ext/libzip/zip_add_dir.c \ + ../ppsspp/ext/snappy/snappy.cpp \ + ../ppsspp/ext/snappy/snappy-sinksource.cpp \ + ../ppsspp/ext/snappy/snappy-stubs-internal.cpp \ + ../ppsspp/ext/snappy/snappy-c.cpp \ + ../ppsspp/ext/rcheevos/src/rc_client.c \ + ../ppsspp/ext/rcheevos/src/rc_util.c \ + ../ppsspp/ext/rcheevos/src/rc_version.c \ + ../ppsspp/ext/rcheevos/src/rc_compat.c \ + ../ppsspp/ext/rcheevos/src/rcheevos/richpresence.c \ + ../ppsspp/ext/rcheevos/src/rcheevos/format.c \ + ../ppsspp/ext/rcheevos/src/rcheevos/rc_validate.c \ + ../ppsspp/ext/rcheevos/src/rcheevos/alloc.c \ + ../ppsspp/ext/rcheevos/src/rcheevos/consoleinfo.c \ + ../ppsspp/ext/rcheevos/src/rcheevos/condset.c \ + ../ppsspp/ext/rcheevos/src/rcheevos/lboard.c \ + ../ppsspp/ext/rcheevos/src/rcheevos/operand.c \ + ../ppsspp/ext/rcheevos/src/rcheevos/value.c \ + ../ppsspp/ext/rcheevos/src/rcheevos/condition.c \ + ../ppsspp/ext/rcheevos/src/rcheevos/trigger.c \ + ../ppsspp/ext/rcheevos/src/rcheevos/memref.c \ + ../ppsspp/ext/rcheevos/src/rcheevos/runtime_progress.c \ + ../ppsspp/ext/rcheevos/src/rcheevos/runtime.c \ + ../ppsspp/ext/rcheevos/src/rc_client_raintegration.c \ + ../ppsspp/ext/rcheevos/src/rurl/url.c \ + ../ppsspp/ext/rcheevos/src/rc_libretro.c \ + ../ppsspp/ext/rcheevos/src/rapi/rc_api_user.c \ + ../ppsspp/ext/rcheevos/src/rapi/rc_api_common.c \ + ../ppsspp/ext/rcheevos/src/rapi/rc_api_editor.c \ + ../ppsspp/ext/rcheevos/src/rapi/rc_api_runtime.c \ + ../ppsspp/ext/rcheevos/src/rapi/rc_api_info.c \ + ../ppsspp/ext/rcheevos/src/rhash/md5.c \ + ../ppsspp/ext/rcheevos/src/rhash/cdreader.c \ + ../ppsspp/ext/rcheevos/src/rhash/aes.c \ + ../ppsspp/ext/rcheevos/src/rhash/hash.c \ + ../ppsspp/ext/lua/lopcodes.c \ + ../ppsspp/ext/lua/lfunc.c \ + ../ppsspp/ext/lua/lstrlib.c \ + ../ppsspp/ext/lua/ldo.c \ + ../ppsspp/ext/lua/lstate.c \ + ../ppsspp/ext/lua/loslib.c \ + ../ppsspp/ext/lua/lmathlib.c \ + ../ppsspp/ext/lua/ltm.c \ + ../ppsspp/ext/lua/lapi.c \ + ../ppsspp/ext/lua/ltablib.c \ + ../ppsspp/ext/lua/ldebug.c \ + ../ppsspp/ext/lua/loadlib.c \ + ../ppsspp/ext/lua/ltable.c \ + ../ppsspp/ext/lua/llex.c \ + ../ppsspp/ext/lua/ldump.c \ + ../ppsspp/ext/lua/lobject.c \ + ../ppsspp/ext/lua/lvm.c \ + ../ppsspp/ext/lua/lutf8lib.c \ + ../ppsspp/ext/lua/lzio.c \ + ../ppsspp/ext/lua/liolib.c \ + ../ppsspp/ext/lua/lparser.c \ + ../ppsspp/ext/lua/lctype.c \ + ../ppsspp/ext/lua/lcode.c \ + ../ppsspp/ext/lua/lbaselib.c \ + ../ppsspp/ext/lua/lundump.c \ + ../ppsspp/ext/lua/lauxlib.c \ + ../ppsspp/ext/lua/lmem.c \ + ../ppsspp/ext/lua/ldblib.c \ + ../ppsspp/ext/lua/lcorolib.c \ + ../ppsspp/ext/lua/linit.c \ + ../ppsspp/ext/lua/lgc.c \ + ../ppsspp/ext/lua/lstring.c \ + ../jaffarCommon/third_party/libco/libco.c \ + ../ppsspp/ext/zlib/adler32.c \ + ../ppsspp/ext/zlib/compress.c \ + ../ppsspp/ext/zlib/crc32.c \ + ../ppsspp/ext/zlib/deflate.c \ + ../ppsspp/ext/zlib/gzclose.c \ + ../ppsspp/ext/zlib/gzlib.c \ + ../ppsspp/ext/zlib/gzread.c \ + ../ppsspp/ext/zlib/gzwrite.c \ + ../ppsspp/ext/zlib/infback.c \ + ../ppsspp/ext/zlib/inffast.c \ + ../ppsspp/ext/zlib/inflate.c \ + ../ppsspp/ext/zlib/inftrees.c \ + ../ppsspp/ext/zlib/trees.c \ + ../ppsspp/ext/zlib/uncompr.c \ + ../ppsspp/ext/zlib/zutil.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/base/ftbase.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/base/ftinit.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/truetype/truetype.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/type1/type1.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/cff/cff.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/cid/type1cid.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/pfr/pfr.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/type42/type42.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/winfonts/winfnt.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/pcf/pcf.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/bdf/bdf.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/sfnt/sfnt.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/autofit/autofit.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/pshinter/pshinter.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/smooth/smooth.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/raster/raster.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/svg/svg.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/sdf/sdf.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/cache/ftcache.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/gzip/ftgzip.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/lzw/ftlzw.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/psaux/psaux.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/psnames/psnames.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/base/ftbbox.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/base/ftbdf.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/base/ftbitmap.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/base/ftcid.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/base/ftfstype.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/base/ftgasp.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/base/ftglyph.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/base/ftgxval.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/base/ftmm.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/base/ftotval.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/base/ftpatent.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/base/ftpfr.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/base/ftstroke.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/base/ftsynth.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/base/fttype1.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/base/ftwinfnt.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/builds/unix/ftsystem.c \ + ../jaffarCommon/subprojects/SDL2_TTF/external/freetype/src/base/ftdebug.c \ + ../jaffarCommon/subprojects/SDL2_TTF/SDL_ttf.c + +# UNAME := $(shell uname) +# ifeq ($(UNAME), Linux) +# TARGET = libppsspp.so +# else +# TARGET = libppsspp.dll +# endif + +LDFLAGS = -shared -s $(CXXFLAGS) + +DEST = ../../Assets/dll +DESTCOPY = ../../output/dll +OBJS := $(addsuffix .o,$(basename $(SRCS))) + +%.o: %.c + $(CC) -c -o $@ $< $(CCFLAGS) + +%.o: %.cpp + $(CXX) -c -o $@ $< $(CXXFLAGS) + +$(TARGET) : $(OBJS) + $(CXX) -o $@ $(LDFLAGS) $(OBJS) -Wl,--no-undefined -L../ppsspp/ffmpeg/linux/x86_64/lib -lavformat -lavcodec -lavutil -lswresample -lswscale -lSDL2 -Wl,-Bsymbolic + patchelf --replace-needed libSDL2-2.0.so.0 libSDL2.so $(TARGET) + +clean: + $(RM) -f $(OBJS) + $(RM) -f $(TARGET) + +CP = cp +install: + $(CP) $(TARGET) $(DEST) +ifneq ("$(wildcard $(DESTCOPY))", "") + $(CP) $(TARGET) $(DESTCOPY) +endif diff --git a/ppsspp/make/SDL2/_real_SDL_config.h b/ppsspp/make/SDL2/_real_SDL_config.h new file mode 100644 index 00000000000..b742e4aa26e --- /dev/null +++ b/ppsspp/make/SDL2/_real_SDL_config.h @@ -0,0 +1,499 @@ +/* include/SDL_config.h. Generated from SDL_config.h.in by configure. */ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef SDL_config_h_ +#define SDL_config_h_ + +/** + * \file SDL_config.h.in + * + * This is a set of defines to configure the SDL features + */ + +/* General platform specific identifiers */ +#include "SDL_platform.h" + +/* Make sure that this isn't included by Visual C++ */ +#ifdef _MSC_VER +#error You should run git checkout -f include/SDL_config.h +#endif + +/* C language features */ +/* #undef const */ +/* #undef inline */ +/* #undef volatile */ + +/* C datatypes */ +#if defined(__LP64__) || defined(_LP64) || defined(_WIN64) +#define SIZEOF_VOIDP 8 +#else +#define SIZEOF_VOIDP 4 +#endif + +#define HAVE_GCC_ATOMICS 1 +/* #undef HAVE_GCC_SYNC_LOCK_TEST_AND_SET */ + +/* Comment this if you want to build without any C library requirements */ +#define HAVE_LIBC 1 +#ifdef HAVE_LIBC + +/* Useful headers */ +#define STDC_HEADERS 1 +#define HAVE_ALLOCA_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_FLOAT_H 1 +#define HAVE_ICONV_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_LIMITS_H 1 +#define HAVE_MALLOC_H 1 +#define HAVE_MATH_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_SIGNAL_H 1 +#define HAVE_STDARG_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_STDIO_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_STRING_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_WCHAR_H 1 +#define HAVE_LINUX_INPUT_H 1 +/* #undef HAVE_PTHREAD_NP_H */ +/* #undef HAVE_LIBUNWIND_H */ + +/* C library functions */ +#define HAVE_DLOPEN 1 +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#ifndef __WIN32__ /* Don't use C runtime versions of these on Windows */ +#define HAVE_GETENV 1 +#define HAVE_SETENV 1 +#define HAVE_PUTENV 1 +#define HAVE_UNSETENV 1 +#endif +#define HAVE_QSORT 1 +#define HAVE_BSEARCH 1 +#define HAVE_ABS 1 +#define HAVE_BCOPY 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_WCSLEN 1 +#define HAVE_WCSLCPY 1 +#define HAVE_WCSLCAT 1 +/* #undef HAVE__WCSDUP */ +#define HAVE_WCSDUP 1 +#define HAVE_WCSSTR 1 +#define HAVE_WCSCMP 1 +#define HAVE_WCSNCMP 1 +#define HAVE_WCSCASECMP 1 +/* #undef HAVE__WCSICMP */ +#define HAVE_WCSNCASECMP 1 +/* #undef HAVE__WCSNICMP */ +#define HAVE_STRLEN 1 +#define HAVE_STRLCPY 1 +#define HAVE_STRLCAT 1 +/* #undef HAVE__STRREV */ +/* #undef HAVE__STRUPR */ +/* #undef HAVE__STRLWR */ +#define HAVE_INDEX 1 +#define HAVE_RINDEX 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_STRTOK_R 1 +/* #undef HAVE_ITOA */ +/* #undef HAVE__LTOA */ +/* #undef HAVE__UITOA */ +/* #undef HAVE__ULTOA */ +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +/* #undef HAVE__I64TOA */ +/* #undef HAVE__UI64TOA */ +#define HAVE_STRTOLL 1 +#define HAVE_STRTOULL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +/* #undef HAVE__STRICMP */ +#define HAVE_STRCASECMP 1 +/* #undef HAVE__STRNICMP */ +#define HAVE_STRNCASECMP 1 +#define HAVE_STRCASESTR 1 +/* #undef HAVE_SSCANF */ +#define HAVE_VSSCANF 1 +/* #undef HAVE_SNPRINTF */ +#define HAVE_VSNPRINTF 1 +#define HAVE_M_PI /**/ +#define HAVE_ACOS 1 +#define HAVE_ACOSF 1 +#define HAVE_ASIN 1 +#define HAVE_ASINF 1 +#define HAVE_ATAN 1 +#define HAVE_ATANF 1 +#define HAVE_ATAN2 1 +#define HAVE_ATAN2F 1 +#define HAVE_CEIL 1 +#define HAVE_CEILF 1 +#define HAVE_COPYSIGN 1 +#define HAVE_COPYSIGNF 1 +#define HAVE_COS 1 +#define HAVE_COSF 1 +#define HAVE_EXP 1 +#define HAVE_EXPF 1 +#define HAVE_FABS 1 +#define HAVE_FABSF 1 +#define HAVE_FLOOR 1 +#define HAVE_FLOORF 1 +#define HAVE_FMOD 1 +#define HAVE_FMODF 1 +#define HAVE_LOG 1 +#define HAVE_LOGF 1 +#define HAVE_LOG10 1 +#define HAVE_LOG10F 1 +#define HAVE_LROUND 1 +#define HAVE_LROUNDF 1 +#define HAVE_POW 1 +#define HAVE_POWF 1 +#define HAVE_ROUND 1 +#define HAVE_ROUNDF 1 +#define HAVE_SCALBN 1 +#define HAVE_SCALBNF 1 +#define HAVE_SIN 1 +#define HAVE_SINF 1 +#define HAVE_SQRT 1 +#define HAVE_SQRTF 1 +#define HAVE_TAN 1 +#define HAVE_TANF 1 +#define HAVE_TRUNC 1 +#define HAVE_TRUNCF 1 +#define HAVE_FOPEN64 1 +#define HAVE_FSEEKO 1 +#define HAVE_FSEEKO64 1 +#define HAVE_SIGACTION 1 +#define HAVE_SA_SIGACTION 1 +#define HAVE_SETJMP 1 +#define HAVE_NANOSLEEP 1 +#define HAVE_SYSCONF 1 +/* #undef HAVE_SYSCTLBYNAME */ +#define HAVE_CLOCK_GETTIME 1 +/* #undef HAVE_GETPAGESIZE */ +#define HAVE_MPROTECT 1 +#define HAVE_ICONV 1 +/* #undef SDL_USE_LIBICONV */ +#define HAVE_PTHREAD_SETNAME_NP 1 +/* #undef HAVE_PTHREAD_SET_NAME_NP */ +#define HAVE_SEM_TIMEDWAIT 1 +#define HAVE_GETAUXVAL 1 +/* #undef HAVE_ELF_AUX_INFO */ +#define HAVE_POLL 1 +#define HAVE_MEMFD_CREATE 1 +#define HAVE_POSIX_FALLOCATE 1 +#define HAVE__EXIT 1 + +#else +#define HAVE_STDARG_H 1 +#define HAVE_STDDEF_H 1 +#define HAVE_STDINT_H 1 +#endif /* HAVE_LIBC */ + +#define HAVE_O_CLOEXEC 1 +/* #undef HAVE_ALTIVEC_H */ +#define HAVE_DBUS_DBUS_H 1 +#define HAVE_FCITX 1 +#define HAVE_SYS_INOTIFY_H 1 +#define HAVE_INOTIFY_INIT 1 +#define HAVE_INOTIFY_INIT1 1 +#define HAVE_INOTIFY 1 +#define HAVE_IBUS_IBUS_H 1 +#define HAVE_IMMINTRIN_H 1 +#define HAVE_LIBUDEV_H 1 +/* #undef HAVE_LIBUSB */ +#define HAVE_LIBSAMPLERATE_H 1 +/* #undef HAVE_LIBDECOR_H */ +/* #undef HAVE_LSXINTRIN_H */ +/* #undef HAVE_LASXINTRIN_H */ + +/* #undef HAVE_DDRAW_H */ +/* #undef HAVE_DINPUT_H */ +/* #undef HAVE_DSOUND_H */ +/* #undef HAVE_DXGI_H */ +/* #undef HAVE_WINDOWS_GAMING_INPUT_H */ +/* #undef HAVE_XINPUT_H */ + +/* #undef HAVE_MMDEVICEAPI_H */ +/* #undef HAVE_AUDIOCLIENT_H */ +/* #undef HAVE_TPCSHRD_H */ +/* #undef HAVE_SENSORSAPI_H */ +/* #undef HAVE_ROAPI_H */ +/* #undef HAVE_SHELLSCALINGAPI_H */ + +/* SDL internal assertion support */ +/* #undef SDL_DEFAULT_ASSERT_LEVEL */ + +/* Allow disabling of core subsystems */ +/* #undef SDL_ATOMIC_DISABLED */ +#define SDL_AUDIO_DISABLED 1 +/* #undef SDL_CPUINFO_DISABLED */ +/* #undef SDL_EVENTS_DISABLED */ +/* #undef SDL_FILE_DISABLED */ +/* #undef SDL_JOYSTICK_DISABLED */ +/* #undef SDL_HAPTIC_DISABLED */ +/* #undef SDL_HIDAPI_DISABLED */ +/* #undef SDL_SENSOR_DISABLED */ +/* #undef SDL_LOADSO_DISABLED */ +/* #undef SDL_RENDER_DISABLED */ +/* #undef SDL_THREADS_DISABLED */ +/* #undef SDL_TIMERS_DISABLED */ +/* #undef SDL_VIDEO_DISABLED */ +/* #undef SDL_POWER_DISABLED */ +/* #undef SDL_FILESYSTEM_DISABLED */ +/* #undef SDL_LOCALE_DISABLED */ +/* #undef SDL_MISC_DISABLED */ + +/* Enable various audio drivers */ +/* #undef SDL_AUDIO_DRIVER_AAUDIO */ +/* #undef SDL_AUDIO_DRIVER_ALSA */ +/* #undef SDL_AUDIO_DRIVER_ALSA_DYNAMIC */ +/* #undef SDL_AUDIO_DRIVER_ANDROID */ +/* #undef SDL_AUDIO_DRIVER_ARTS */ +/* #undef SDL_AUDIO_DRIVER_ARTS_DYNAMIC */ +/* #undef SDL_AUDIO_DRIVER_COREAUDIO */ +/* #undef SDL_AUDIO_DRIVER_DISK */ +/* #undef SDL_AUDIO_DRIVER_DSOUND */ +/* #undef SDL_AUDIO_DRIVER_DUMMY */ +/* #undef SDL_AUDIO_DRIVER_EMSCRIPTEN */ +/* #undef SDL_AUDIO_DRIVER_ESD */ +/* #undef SDL_AUDIO_DRIVER_ESD_DYNAMIC */ +/* #undef SDL_AUDIO_DRIVER_FUSIONSOUND */ +/* #undef SDL_AUDIO_DRIVER_FUSIONSOUND_DYNAMIC */ +/* #undef SDL_AUDIO_DRIVER_HAIKU */ +/* #undef SDL_AUDIO_DRIVER_JACK */ +/* #undef SDL_AUDIO_DRIVER_JACK_DYNAMIC */ +/* #undef SDL_AUDIO_DRIVER_NACL */ +/* #undef SDL_AUDIO_DRIVER_NAS */ +/* #undef SDL_AUDIO_DRIVER_NAS_DYNAMIC */ +/* #undef SDL_AUDIO_DRIVER_NETBSD */ +/* #undef SDL_AUDIO_DRIVER_OPENSLES */ +/* #undef SDL_AUDIO_DRIVER_OSS */ +/* #undef SDL_AUDIO_DRIVER_PAUDIO */ +/* #undef SDL_AUDIO_DRIVER_PIPEWIRE */ +/* #undef SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC */ +/* #undef SDL_AUDIO_DRIVER_PULSEAUDIO */ +/* #undef SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC */ +/* #undef SDL_AUDIO_DRIVER_QSA */ +/* #undef SDL_AUDIO_DRIVER_SNDIO */ +/* #undef SDL_AUDIO_DRIVER_SNDIO_DYNAMIC */ +/* #undef SDL_AUDIO_DRIVER_SUNAUDIO */ +/* #undef SDL_AUDIO_DRIVER_WASAPI */ +/* #undef SDL_AUDIO_DRIVER_WINMM */ +/* #undef SDL_AUDIO_DRIVER_OS2 */ + +/* Enable various input drivers */ +#define SDL_INPUT_LINUXEV 1 +/* #undef SDL_INPUT_FBSDKBIO */ +#define SDL_INPUT_LINUXKD 1 +/* #undef SDL_INPUT_WSCONS */ +/* #undef SDL_JOYSTICK_HAIKU */ +/* #undef SDL_JOYSTICK_DINPUT */ +/* #undef SDL_JOYSTICK_WGI */ +/* #undef SDL_JOYSTICK_XINPUT */ +/* #undef SDL_JOYSTICK_DUMMY */ +/* #undef SDL_JOYSTICK_IOKIT */ +/* #undef SDL_JOYSTICK_MFI */ +#define SDL_JOYSTICK_LINUX 1 +/* #undef SDL_JOYSTICK_ANDROID */ +/* #undef SDL_JOYSTICK_OS2 */ +/* #undef SDL_JOYSTICK_USBHID */ +/* #undef SDL_HAVE_MACHINE_JOYSTICK_H */ +#define SDL_JOYSTICK_HIDAPI 1 +/* #undef SDL_JOYSTICK_RAWINPUT */ +/* #undef SDL_JOYSTICK_EMSCRIPTEN */ +#define SDL_JOYSTICK_VIRTUAL 1 +/* #undef SDL_HAPTIC_DUMMY */ +/* #undef SDL_HAPTIC_ANDROID */ +#define SDL_HAPTIC_LINUX 1 +/* #undef SDL_HAPTIC_IOKIT */ +/* #undef SDL_HAPTIC_DINPUT */ +/* #undef SDL_HAPTIC_XINPUT */ + +/* Enable various sensor drivers */ +/* #undef SDL_SENSOR_ANDROID */ +/* #undef SDL_SENSOR_COREMOTION */ +/* #undef SDL_SENSOR_WINDOWS */ +#define SDL_SENSOR_DUMMY 1 + +/* Enable various shared object loading systems */ +#define SDL_LOADSO_DLOPEN 1 +/* #undef SDL_LOADSO_DUMMY */ +/* #undef SDL_LOADSO_LDG */ +/* #undef SDL_LOADSO_WINDOWS */ +/* #undef SDL_LOADSO_OS2 */ + +/* Enable various threading systems */ +/* #undef SDL_THREAD_GENERIC_COND_SUFFIX */ +#define SDL_THREAD_PTHREAD 1 +#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1 +/* #undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP */ +/* #undef SDL_THREAD_WINDOWS */ +/* #undef SDL_THREAD_OS2 */ + +/* Enable various timer systems */ +/* #undef SDL_TIMER_HAIKU */ +/* #undef SDL_TIMER_DUMMY */ +#define SDL_TIMER_UNIX 1 +/* #undef SDL_TIMER_WINDOWS */ +/* #undef SDL_TIMER_OS2 */ + +/* Enable various video drivers */ +/* #undef SDL_VIDEO_DRIVER_HAIKU */ +/* #undef SDL_VIDEO_DRIVER_COCOA */ +/* #undef SDL_VIDEO_DRIVER_DIRECTFB */ +/* #undef SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC */ +#define SDL_VIDEO_DRIVER_DUMMY 1 +/* #undef SDL_VIDEO_DRIVER_WINDOWS */ +/* #undef SDL_VIDEO_DRIVER_WAYLAND */ +/* #undef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ +/* #undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC */ +/* #undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL */ +/* #undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR */ +/* #undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON */ +/* #undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR */ +/* #undef SDL_VIDEO_DRIVER_X11 */ +/* #undef SDL_VIDEO_DRIVER_RPI */ +/* #undef SDL_VIDEO_DRIVER_KMSDRM */ +/* #undef SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC */ +/* #undef SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC_GBM */ +/* #undef SDL_VIDEO_DRIVER_ANDROID */ +/* #undef SDL_VIDEO_DRIVER_EMSCRIPTEN */ +/* #undef SDL_VIDEO_DRIVER_OFFSCREEN */ +/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC */ +/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT */ +/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR */ +/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 */ +/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES */ +/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR */ +/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS */ +/* #undef SDL_VIDEO_DRIVER_X11_XCURSOR */ +/* #undef SDL_VIDEO_DRIVER_X11_XDBE */ +/* #undef SDL_VIDEO_DRIVER_X11_XINPUT2 */ +/* #undef SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH */ +/* #undef SDL_VIDEO_DRIVER_X11_XFIXES */ +/* #undef SDL_VIDEO_DRIVER_X11_XRANDR */ +/* #undef SDL_VIDEO_DRIVER_X11_XSCRNSAVER */ +/* #undef SDL_VIDEO_DRIVER_X11_XSHAPE */ +/* #undef SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS */ +/* #undef SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM */ +/* #undef SDL_VIDEO_DRIVER_NACL */ +/* #undef SDL_VIDEO_DRIVER_VIVANTE */ +/* #undef SDL_VIDEO_DRIVER_VIVANTE_VDK */ +/* #undef SDL_VIDEO_DRIVER_OS2 */ +/* #undef SDL_VIDEO_DRIVER_QNX */ +/* #undef SDL_VIDEO_DRIVER_RISCOS */ + +/* #undef SDL_VIDEO_RENDER_D3D */ +/* #undef SDL_VIDEO_RENDER_D3D11 */ +/* #undef SDL_VIDEO_RENDER_D3D12 */ +/* #undef SDL_VIDEO_RENDER_OGL */ +/* #undef SDL_VIDEO_RENDER_OGL_ES */ +/* #undef SDL_VIDEO_RENDER_OGL_ES2 */ +/* #undef SDL_VIDEO_RENDER_DIRECTFB */ +/* #undef SDL_VIDEO_RENDER_METAL */ + +/* Enable OpenGL support */ +/* #undef SDL_VIDEO_OPENGL */ +/* #undef SDL_VIDEO_OPENGL_ES */ +/* #undef SDL_VIDEO_OPENGL_ES2 */ +/* #undef SDL_VIDEO_OPENGL_BGL */ +/* #undef SDL_VIDEO_OPENGL_CGL */ +#define SDL_VIDEO_OPENGL_EGL 1 +/* #undef SDL_VIDEO_OPENGL_GLX */ +/* #undef SDL_VIDEO_OPENGL_WGL */ +/* #undef SDL_VIDEO_OPENGL_OSMESA */ +/* #undef SDL_VIDEO_OPENGL_OSMESA_DYNAMIC */ + +/* Enable Vulkan support */ +/* #undef SDL_VIDEO_VULKAN */ + +/* Enable Metal support */ +/* #undef SDL_VIDEO_METAL */ + +/* Enable system power support */ +#define SDL_POWER_LINUX 1 +/* #undef SDL_POWER_WINDOWS */ +/* #undef SDL_POWER_MACOSX */ +/* #undef SDL_POWER_HAIKU */ +/* #undef SDL_POWER_ANDROID */ +/* #undef SDL_POWER_EMSCRIPTEN */ +/* #undef SDL_POWER_HARDWIRED */ + +/* Enable system filesystem support */ +/* #undef SDL_FILESYSTEM_ANDROID */ +/* #undef SDL_FILESYSTEM_HAIKU */ +/* #undef SDL_FILESYSTEM_COCOA */ +/* #undef SDL_FILESYSTEM_DUMMY */ +/* #undef SDL_FILESYSTEM_RISCOS */ +#define SDL_FILESYSTEM_UNIX 1 +/* #undef SDL_FILESYSTEM_WINDOWS */ +/* #undef SDL_FILESYSTEM_NACL */ +/* #undef SDL_FILESYSTEM_EMSCRIPTEN */ +/* #undef SDL_FILESYSTEM_OS2 */ +/* #undef SDL_FILESYSTEM_VITA */ +/* #undef SDL_FILESYSTEM_PSP */ +/* #undef SDL_FILESYSTEM_PS2 */ + +/* Enable misc subsystem */ +/* #undef SDL_MISC_DUMMY */ + +/* Enable locale subsystem */ +/* #undef SDL_LOCALE_DUMMY */ + +/* Enable assembly routines */ +/* #undef SDL_ALTIVEC_BLITTERS */ +/* #undef SDL_ARM_SIMD_BLITTERS */ +/* #undef SDL_ARM_NEON_BLITTERS */ + +/* Whether SDL_DYNAMIC_API needs dlopen() */ +#define DYNAPI_NEEDS_DLOPEN 1 + +/* Enable ime support */ +#define SDL_USE_IME 1 + +/* Enable dynamic udev support */ +#define SDL_UDEV_DYNAMIC "libudev.so.1" + +/* Enable dynamic libusb support */ +/* #undef SDL_LIBUSB_DYNAMIC */ + +/* Enable dynamic libsamplerate support */ +#define SDL_LIBSAMPLERATE_DYNAMIC "libsamplerate.so.0" + +/* Libdecor get min/max content size functions */ +/* #undef SDL_HAVE_LIBDECOR_GET_MIN_MAX */ + +#endif /* SDL_config_h_ */ diff --git a/ppsspp/msvc/.gitignore b/ppsspp/msvc/.gitignore new file mode 100644 index 00000000000..b348a486270 --- /dev/null +++ b/ppsspp/msvc/.gitignore @@ -0,0 +1,6 @@ +x64 +licenses +FFmpeg +*.aps +*.rc +*.h diff --git a/ppsspp/msvc/SDL2/SDL2.lib b/ppsspp/msvc/SDL2/SDL2.lib new file mode 100644 index 00000000000..93961caa27c Binary files /dev/null and b/ppsspp/msvc/SDL2/SDL2.lib differ diff --git a/ppsspp/msvc/SDL2/_real_SDL_config.h b/ppsspp/msvc/SDL2/_real_SDL_config.h new file mode 100644 index 00000000000..36b01805878 --- /dev/null +++ b/ppsspp/msvc/SDL2/_real_SDL_config.h @@ -0,0 +1,225 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2017 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef SDL_config_windows_h_ +#define SDL_config_windows_h_ +#define SDL_config_h_ + +#include "SDL_platform.h" + +/* This is a set of defines to configure the SDL features */ + +#if !defined(_STDINT_H_) && (!defined(HAVE_STDINT_H) || !_HAVE_STDINT_H) +#if defined(__GNUC__) || defined(__DMC__) || defined(__WATCOMC__) +#define HAVE_STDINT_H 1 +#elif defined(_MSC_VER) +typedef signed __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef signed __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef signed __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; +#ifndef _UINTPTR_T_DEFINED +#ifdef _WIN64 +typedef unsigned __int64 uintptr_t; +#else +typedef unsigned int uintptr_t; +#endif +#define _UINTPTR_T_DEFINED +#endif +/* Older Visual C++ headers don't have the Win64-compatible typedefs... */ +#if ((_MSC_VER <= 1200) && (!defined(DWORD_PTR))) +#define DWORD_PTR DWORD +#endif +#if ((_MSC_VER <= 1200) && (!defined(LONG_PTR))) +#define LONG_PTR LONG +#endif +#else /* !__GNUC__ && !_MSC_VER */ +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; +#ifndef _SIZE_T_DEFINED_ +#define _SIZE_T_DEFINED_ +typedef unsigned int size_t; +#endif +typedef unsigned int uintptr_t; +#endif /* __GNUC__ || _MSC_VER */ +#endif /* !_STDINT_H_ && !HAVE_STDINT_H */ + +#ifdef _WIN64 +# define SIZEOF_VOIDP 8 +#else +# define SIZEOF_VOIDP 4 +#endif + +#define HAVE_DDRAW_H 1 +#define HAVE_DINPUT_H 1 +#define HAVE_DSOUND_H 1 +#define HAVE_DXGI_H 0 +#define HAVE_XINPUT_H 1 + +/* This is disabled by default to avoid C runtime dependencies and manifest requirements */ +#ifdef HAVE_LIBC +/* Useful headers */ +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#define HAVE_SIGNAL_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE__STRREV 1 +#define HAVE__STRUPR 1 +#define HAVE__STRLWR 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE__LTOA 1 +#define HAVE__ULTOA 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE__STRICMP 1 +#define HAVE__STRNICMP 1 +#define HAVE_ATAN 1 +#define HAVE_ATAN2 1 +#define HAVE_ACOS 1 +#define HAVE_ASIN 1 +#define HAVE_CEIL 1 +#define HAVE_COS 1 +#define HAVE_COSF 1 +#define HAVE_FABS 1 +#define HAVE_FLOOR 1 +#define HAVE_LOG 1 +#define HAVE_POW 1 +#define HAVE_SIN 1 +#define HAVE_SINF 1 +#define HAVE_SQRT 1 +#define HAVE_SQRTF 1 +#define HAVE_TAN 1 +#define HAVE_TANF 1 +#if _MSC_VER >= 1800 +#define HAVE_STRTOLL 1 +#define HAVE_VSSCANF 1 +#define HAVE_COPYSIGN 1 +#define HAVE_SCALBN 1 +#endif +#if !defined(_MSC_VER) || defined(_USE_MATH_DEFINES) +#define HAVE_M_PI 1 +#endif +#else +#define HAVE_STDARG_H 1 +#define HAVE_STDDEF_H 1 +#endif + +/* Enable various audio drivers */ +#define SDL_AUDIO_DRIVER_WASAPI 1 +#define SDL_AUDIO_DRIVER_DSOUND 1 +#define SDL_AUDIO_DRIVER_XAUDIO2 0 +#define SDL_AUDIO_DRIVER_WINMM 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various input drivers */ +#define SDL_JOYSTICK_DINPUT 1 +#define SDL_JOYSTICK_XINPUT 1 +#define SDL_HAPTIC_DINPUT 1 +#define SDL_HAPTIC_XINPUT 1 + +/* Enable various shared object loading systems */ +#define SDL_LOADSO_WINDOWS 1 + +/* Enable various threading systems */ +#define SDL_THREAD_WINDOWS 1 + +/* Enable various timer systems */ +#define SDL_TIMER_WINDOWS 1 + +/* Enable various video drivers */ +#define SDL_VIDEO_DRIVER_DUMMY 1 +#define SDL_VIDEO_DRIVER_WINDOWS 1 + +#ifndef SDL_VIDEO_RENDER_D3D +#define SDL_VIDEO_RENDER_D3D 1 +#endif +#ifndef SDL_VIDEO_RENDER_D3D11 +#define SDL_VIDEO_RENDER_D3D11 0 +#endif + +/* Enable OpenGL support */ +#ifndef SDL_VIDEO_OPENGL +#define SDL_VIDEO_OPENGL 1 +#endif +#ifndef SDL_VIDEO_OPENGL_WGL +#define SDL_VIDEO_OPENGL_WGL 1 +#endif +#ifndef SDL_VIDEO_RENDER_OGL +#define SDL_VIDEO_RENDER_OGL 1 +#endif +#ifndef SDL_VIDEO_RENDER_OGL_ES2 +#define SDL_VIDEO_RENDER_OGL_ES2 0 +#endif +#ifndef SDL_VIDEO_OPENGL_ES2 +#define SDL_VIDEO_OPENGL_ES2 0 +#endif +#ifndef SDL_VIDEO_OPENGL_EGL +#define SDL_VIDEO_OPENGL_EGL 0 +#endif + +/* Enable Vulkan support */ +#define SDL_VIDEO_VULKAN 0 + +/* Enable system power support */ +#define SDL_POWER_WINDOWS 1 + +/* Enable filesystem support */ +#define SDL_FILESYSTEM_WINDOWS 0 + +/* Enable assembly routines (Win64 doesn't have inline asm) */ +#ifndef _WIN64 +#define SDL_ASSEMBLY_ROUTINES 1 +#endif + +#endif /* SDL_config_windows_h_ */ diff --git a/ppsspp/msvc/libppsspp.sln b/ppsspp/msvc/libppsspp.sln new file mode 100644 index 00000000000..616c764869d --- /dev/null +++ b/ppsspp/msvc/libppsspp.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libppsspp", "libppsspp.vcxproj", "{F07F76D3-08E6-4EBC-82F9-53FF90ABD9A9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F07F76D3-08E6-4EBC-82F9-53FF90ABD9A9}.Debug|x64.ActiveCfg = Debug|x64 + {F07F76D3-08E6-4EBC-82F9-53FF90ABD9A9}.Debug|x64.Build.0 = Debug|x64 + {F07F76D3-08E6-4EBC-82F9-53FF90ABD9A9}.Release|x64.ActiveCfg = Release|x64 + {F07F76D3-08E6-4EBC-82F9-53FF90ABD9A9}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {AFADDF43-3213-47F1-88CA-ABF561D97D0E} + EndGlobalSection +EndGlobal diff --git a/ppsspp/msvc/libppsspp.vcxproj b/ppsspp/msvc/libppsspp.vcxproj new file mode 100644 index 00000000000..3f65e459f4d --- /dev/null +++ b/ppsspp/msvc/libppsspp.vcxproj @@ -0,0 +1,937 @@ + + + + + Debug + x64 + + + Release + x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(IntDir)$(RelativeDir)_Display + $(IntDir)$(RelativeDir)_Display + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(IntDir)$(RelativeDir)_Breakpoints + $(IntDir)$(RelativeDir)_Breakpoints + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(IntDir)$(RelativeDir)_aes + $(IntDir)$(RelativeDir)_aes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {F07F76D3-08E6-4EBC-82F9-53FF90ABD9A9} + libppsspp + 10.0 + + + + DynamicLibrary + true + MultiByte + ClangCL + -fwrapv + + + DynamicLibrary + false + true + MultiByte + ClangCL + -fwrapv + + + + + + + + + + + + + .;..\ppsspp\ext;..\ppsspp\ext\glslang;..\ppsspp;..\ppsspp\libretro;..\ppsspp\ext\OpenXR-SDK\include;..\ppsspp\Common;..\ppsspp\ext\armips;..\ppsspp\ext\libzip;..\ppsspp\ext\libpng17;..\ppsspp\ext\zstd\lib;..\ppsspp\ext\libchdr\include;..\ppsspp\ext\miniupnp\miniupnpc\src;..\ppsspp\ext\miniupnp\miniupnpc\include;..\ppsspp\ext\snappy\;..\ppsspp\ext\rcheevos\include\;..\ppsspp\ext\cmake\cpu_features\..\..\cpu_features\include;..\ppsspp\ext\libchdr\deps\lzma-22.01\include\;..\ppsspp\ext\lua\;..\ppsspp\ext\zlib\;..\ppsspp\ext\glew;..\ppsspp\ext\glslang-build;..\ppsspp\ext\glslang;..\ppsspp\ffmpeg\linux\x86_64\include\;..\ppsspp\ext\miniupnp-build\;..\jaffarCommon\include;..\jaffarCommon\third_party;..\ppsspp\ext\native\tools\prebuilt;..\ppsspp\ext\native\tools\prebuilt\freetype;..\jaffarCommon\subprojects\SDL2_TTF\external\SDL2\include;$(IncludePath) + ..\Assets\dll + + + .;..\ppsspp\ext;..\ppsspp\ext\glslang;..\ppsspp;..\ppsspp\libretro;..\ppsspp\ext\OpenXR-SDK\include;..\ppsspp\Common;..\ppsspp\ext\armips;..\ppsspp\ext\libzip;..\ppsspp\ext\libpng17;..\ppsspp\ext\zstd\lib;..\ppsspp\ext\libchdr\include;..\ppsspp\ext\miniupnp\miniupnpc\src;..\ppsspp\ext\miniupnp\miniupnpc\include;..\ppsspp\ext\snappy\;..\ppsspp\ext\rcheevos\include\;..\ppsspp\ext\cmake\cpu_features\..\..\cpu_features\include;..\ppsspp\ext\libchdr\deps\lzma-22.01\include\;..\ppsspp\ext\lua\;..\ppsspp\ext\zlib\;..\ppsspp\ext\glew;..\ppsspp\ext\glslang-build;..\ppsspp\ext\glslang;..\ppsspp\ffmpeg\linux\x86_64\include\;..\ppsspp\ext\miniupnp-build\;..\jaffarCommon\include;..\jaffarCommon\third_party;..\ppsspp\ext\native\tools\prebuilt;..\ppsspp\ext\native\tools\prebuilt\freetype;..\jaffarCommon\subprojects\SDL2_TTF\external\SDL2\include;$(IncludePath) + ..\Assets\dll + + + + Level3 + Disabled + 4244;4800;4804;4996 + $(ProjectDir)\.. + _WINDLL;%(PreprocessorDefinitions); + USE_FFMPEG=1; + NDEBUG; + _NDEBUG; + HAVE_GETAUXVAL; + HTTPS_NOT_AVAILABLE; + MASKED_PSP_MEMORY; + MINIUPNPC_SET_SOCKET_TIMEOUT; + NO_MMAP; + _BSD_SOURCE; + _DEFAULT_SOURCE; + _FILE_OFFSET_BITS=64; + _XOPEN_SOURCE_EXTENDED; + __BSD_VISIBLE=1; + __STDC_CONSTANT_MACROS; + STACK_LINE_READER_BUFFER_SIZE=1024; + SFMT_MEXP=19937; + ENABLE_HLSL; + ENABLE_OPT=0; + _7ZIP_ST; + SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS; + __STDC_LIMIT_MACROS; + HAVE_LIBAVCODEC_CONST_AVCODEC=1; + ppsspp_libretro_EXPORTS; + NO_ARMIPS; + ZSTD_DISABLE_ASM; + USE_SDL2_TTF; + __INLINE__=inline; + _WINDOWS; + _UNICODE; + UNICODE; + USE_FFMPEG; + NO_ARMIPS; + + true + stdcpp20 + $(IntDir)$(RelativeDir) + $(IntDir)$(RelativeDir) + $(IntDir)$(RelativeDir) + $(IntDir)$(RelativeDir) + $(IntDir)$(RelativeDir) + $(IntDir)$(RelativeDir) + $(IntDir)$(RelativeDir)vc$(PlatformToolsetVersion).pdb + + + true + ..\ppsspp\ffmpeg\Windows\x86_64\lib;.\SDL2;..\ppsspp\ext\native\tools\prebuilt\win64 + $(CoreLibraryDependencies);%(AdditionalDependencies);avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;ws2_32.lib;iphlpapi.lib;winmm.lib;freetype.lib;SDL2.lib + $(OutDir)$(RelativeDir)$(TargetName)$(TargetExt) + $(IntDir)$(RelativeDir)$(TargetName).ilk + $(IntDir)$(RelativeDir)$(TargetName)$(TargetExt).intermediate.manifest + $(OutDir)$(RelativeDir)$(TargetName).pgd + $(IntDir)$(RelativeDir)$(TargetName).iobj + + + + + + + + + Level3 + MaxSpeed + true + true + 4244;4800;4804;4996 + $(ProjectDir)\.. + _WINDLL;%(PreprocessorDefinitions); + USE_FFMPEG=1; + NDEBUG; + _NDEBUG; + HAVE_GETAUXVAL; + HTTPS_NOT_AVAILABLE; + MASKED_PSP_MEMORY; + MINIUPNPC_SET_SOCKET_TIMEOUT; + NO_MMAP; + SHARED_ZLIB; + _BSD_SOURCE; + _DEFAULT_SOURCE; + _FILE_OFFSET_BITS=64; + _XOPEN_SOURCE_EXTENDED; + __BSD_VISIBLE=1; + __STDC_CONSTANT_MACROS; + STACK_LINE_READER_BUFFER_SIZE=1024; + SFMT_MEXP=19937; + ENABLE_HLSL; + ENABLE_OPT=0; + _7ZIP_ST; + SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS; + __STDC_LIMIT_MACROS; + HAVE_LIBAVCODEC_CONST_AVCODEC=1; + ppsspp_libretro_EXPORTS; + NO_ARMIPS; + ZSTD_DISABLE_ASM; + USE_SDL2_TTF; + __INLINE__=inline; + _WINDOWS; + _UNICODE; + UNICODE; + USE_FFMPEG; + NO_ARMIPS; + + true + stdcpp20 + $(IntDir)$(RelativeDir) + $(IntDir)$(RelativeDir) + $(IntDir)$(RelativeDir) + $(IntDir)$(RelativeDir) + $(IntDir)$(RelativeDir) + $(IntDir)$(RelativeDir) + $(IntDir)$(RelativeDir)vc$(PlatformToolsetVersion).pdb + + + true + true + true + ..\ppsspp\ffmpeg\Windows\x86_64\lib;.\SDL2;..\ppsspp\ext\native\tools\prebuilt\win64 + $(CoreLibraryDependencies);%(AdditionalDependencies);avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;ws2_32.lib;iphlpapi.lib;winmm.lib;freetype.lib;SDL2.lib + $(OutDir)$(RelativeDir)$(TargetName)$(TargetExt) + $(IntDir)$(RelativeDir)$(TargetName).ilk + $(IntDir)$(RelativeDir)$(TargetName)$(TargetExt).intermediate.manifest + $(OutDir)$(RelativeDir)$(TargetName).pgd + $(IntDir)$(RelativeDir)$(TargetName).iobj + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ppsspp/ppsspp b/ppsspp/ppsspp new file mode 160000 index 00000000000..843adf6f226 --- /dev/null +++ b/ppsspp/ppsspp @@ -0,0 +1 @@ +Subproject commit 843adf6f22686c0581b4e49dbe25d3d95fd52c4c diff --git a/src/BizHawk.Client.Common/RomLoader.cs b/src/BizHawk.Client.Common/RomLoader.cs index ccb14d42ea6..85e5b63fdbe 100644 --- a/src/BizHawk.Client.Common/RomLoader.cs +++ b/src/BizHawk.Client.Common/RomLoader.cs @@ -280,6 +280,10 @@ void NoCoreForSystem(string sysID) game.System = VSystemID.Raw.PCE; break; + case DiscType.SonyPSP: + game.System = VSystemID.Raw.PSP; + break; + case DiscType.JaguarCD: game.System = VSystemID.Raw.Jaguar; break; @@ -305,9 +309,6 @@ void NoCoreForSystem(string sysID) case DiscType.SonyPS2: NoCoreForSystem(VSystemID.Raw.PS2); break; - case DiscType.SonyPSP: - NoCoreForSystem(VSystemID.Raw.PSP); - break; case DiscType.Wii: NoCoreForSystem(VSystemID.Raw.Wii); break; diff --git a/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/LibPPSSPP.cs b/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/LibPPSSPP.cs new file mode 100644 index 00000000000..5272b0ed933 --- /dev/null +++ b/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/LibPPSSPP.cs @@ -0,0 +1,78 @@ +using System.Runtime.InteropServices; +using BizHawk.BizInvoke; + +namespace BizHawk.Emulation.Cores.Consoles.Sony.PSP +{ + public abstract class LibPPSSPP + { + private const CallingConvention CC = CallingConvention.Cdecl; + + [UnmanagedFunctionPointer(CC)] + public delegate void CDReadCallback(int lba, IntPtr dst); + + [UnmanagedFunctionPointer(CC)] + public delegate int CDSectorCountCallback(); + + [UnmanagedFunctionPointer(CC)] + public delegate void InputCallback(); + + [BizImport(CC)] + public abstract void SetCdCallbacks(CDReadCallback cdrc, CDSectorCountCallback cdscc); + + [BizImport(CC)] + public abstract void SetInputCallback(InputCallback ipc); + + [BizImport(CC, Compatibility = true)] + public abstract bool Init(string gameFile, string userDataPath); + + [BizImport(CC, Compatibility = true)] + public abstract void FrameAdvance(FrameInfo f); + + [BizImport(CC, Compatibility = true)] + public abstract int GetStateSize(); + + [BizImport(CC, Compatibility = true)] + public abstract void SaveState(byte[] buffer); + + [BizImport(CC, Compatibility = true)] + public abstract void LoadState(byte[] buffer, int stateLen); + + [BizImport(CC, Compatibility = true)] + public abstract bool loadResource(string resourceName, byte[] buffer, int resourceLen); + + [BizImport(CC, Compatibility = true)] + + public abstract void Deinit(); + + [BizImport(CC)] + public abstract void GetVideo(int[] buffer); + + [BizImport(CC)] + public abstract int GetAudio(short[] buffer); + + [StructLayout(LayoutKind.Sequential)] + public struct GamepadInputs + { + public int Up; + public int Down; + public int Left; + public int Right; + public int Start; + public int Select; + public int ButtonSquare; + public int ButtonTriangle; + public int ButtonCircle; + public int ButtonCross; + public int ButtonLTrigger; + public int ButtonRTrigger; + public int LeftAnalogX; + public int LeftAnalogY; + } + + [StructLayout(LayoutKind.Sequential)] + public class FrameInfo + { + public GamepadInputs input; + } + } +} diff --git a/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.Controllers.cs b/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.Controllers.cs new file mode 100644 index 00000000000..e405be578e2 --- /dev/null +++ b/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.Controllers.cs @@ -0,0 +1,69 @@ +using BizHawk.Common; +using BizHawk.Emulation.Common; + +namespace BizHawk.Emulation.Cores.Consoles.Sony.PSP +{ + public partial class PPSSPP + { + private static ControllerDefinition CreateControllerDefinition(bool isMultiDisc) + { + var controller = new ControllerDefinition("PSP Controller"); + + foreach (var button in JoystickButtonCollection) controller.BoolButtons.Add($"P1 {button}"); + foreach (var axis in JoystickAxisCollection) controller.AddAxis($"P1 {axis}", (-32768).RangeTo(32767), 0); + + // If this is multi-disc, add a cd swap option + if (isMultiDisc) + { + controller.BoolButtons.Add("Next Disc"); + controller.BoolButtons.Add("Prev Disc"); + } + + return controller.MakeImmutable(); + } + + + private static string[] JoystickButtonCollection = [ + JoystickButtons.Up, + JoystickButtons.Down, + JoystickButtons.Left, + JoystickButtons.Right, + JoystickButtons.Start, + JoystickButtons.Select, + JoystickButtons.ButtonSquare, + JoystickButtons.ButtonTriangle, + JoystickButtons.ButtonCircle, + JoystickButtons.ButtonCross, + JoystickButtons.ButtonLTrigger, + JoystickButtons.ButtonRTrigger, + ]; + + private static string[] JoystickAxisCollection = [ + JoystickAxes.LeftAnalogX, + JoystickAxes.LeftAnalogY, + ]; + + private static class JoystickButtons + { + public const string Up = "Up"; + public const string Down = "Down"; + public const string Left = "Left"; + public const string Right = "Right"; + public const string Start = "Start"; + public const string Select = "Select"; + public const string ButtonSquare = "Square"; + public const string ButtonTriangle = "Triangle"; + public const string ButtonCircle = "Circle"; + public const string ButtonCross = "Cross"; + public const string ButtonLTrigger = "L Trigger"; + public const string ButtonRTrigger = "R Trigger"; + } + + private static class JoystickAxes + { + public const string LeftAnalogX = "Left Analog X"; + public const string LeftAnalogY = "Left Analog Y"; + } + } +} + diff --git a/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.IDriveLight.cs b/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.IDriveLight.cs new file mode 100644 index 00000000000..6c857475f11 --- /dev/null +++ b/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.IDriveLight.cs @@ -0,0 +1,11 @@ +using BizHawk.Emulation.Common; + +namespace BizHawk.Emulation.Cores.Consoles.Sony.PSP +{ + public partial class PPSSPP : IDriveLight + { + public bool DriveLightEnabled { get; private set; } + public bool DriveLightOn { get; private set; } + public string DriveLightIconDescription => "Drive Activity"; + } +} \ No newline at end of file diff --git a/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.IEmulator.cs b/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.IEmulator.cs new file mode 100644 index 00000000000..8c4f03e4c0f --- /dev/null +++ b/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.IEmulator.cs @@ -0,0 +1,124 @@ +using BizHawk.Emulation.Common; + +namespace BizHawk.Emulation.Cores.Consoles.Sony.PSP +{ + public partial class PPSSPP : IEmulator + { + private readonly BasicServiceProvider _serviceProvider; + + public IEmulatorServiceProvider ServiceProvider => _serviceProvider; + + public ControllerDefinition ControllerDefinition { get; private set; } + + public int Frame { get; set; } + + public string SystemId => VSystemID.Raw.PSP; + + public bool DeterministicEmulation { get; } + + protected LibPPSSPP.FrameInfo FrameAdvancePrep(IController controller, bool render, bool rendersound) + { + var fi = new LibPPSSPP.FrameInfo(); + + // Disc management + if (_isMultidisc) + { + if (controller.IsPressed("Next Disc")) SelectNextDisc(); + if (controller.IsPressed("Prev Disc")) SelectPrevDisc(); + } + + fi.input.Up = controller.IsPressed($"P1 {JoystickButtons.Up}") ? 1 : 0; + fi.input.Down = controller.IsPressed($"P1 {JoystickButtons.Down}") ? 1 : 0; + fi.input.Left = controller.IsPressed($"P1 {JoystickButtons.Left}") ? 1 : 0; + fi.input.Right = controller.IsPressed($"P1 {JoystickButtons.Right}") ? 1 : 0; + fi.input.Start = controller.IsPressed($"P1 {JoystickButtons.Start}") ? 1 : 0; + fi.input.Select = controller.IsPressed($"P1 {JoystickButtons.Select}") ? 1 : 0; + fi.input.ButtonSquare = controller.IsPressed($"P1 {JoystickButtons.ButtonSquare}") ? 1 : 0; + fi.input.ButtonTriangle = controller.IsPressed($"P1 {JoystickButtons.ButtonTriangle}") ? 1 : 0; + fi.input.ButtonCircle = controller.IsPressed($"P1 {JoystickButtons.ButtonCircle}") ? 1 : 0; + fi.input.ButtonCross = controller.IsPressed($"P1 {JoystickButtons.ButtonCross}") ? 1 : 0; + fi.input.ButtonLTrigger = controller.IsPressed($"P1 {JoystickButtons.ButtonLTrigger}") ? 1 : 0; + fi.input.ButtonRTrigger = controller.IsPressed($"P1 {JoystickButtons.ButtonRTrigger}") ? 1 : 0; + fi.input.LeftAnalogX = controller.AxisValue($"P1 {JoystickAxes.LeftAnalogX}"); + fi.input.LeftAnalogY = controller.AxisValue($"P1 {JoystickAxes.LeftAnalogY}"); + + DriveLightOn = false; + + return fi; + } + + public bool FrameAdvance(IController controller, bool render, bool renderSound = true) + { + _controller = controller; + IsLagFrame = true; + +#if false + if (_controller.IsPressed("Reset")) + { + _core.Encore_Reset(_context); + // memory domain pointers are no longer valid, reset them + WireMemoryDomains(); + } +#endif + + var f = FrameAdvancePrep(controller, render, renderSound); + _libPPSSPP.FrameAdvance(f); + + OnVideoRefresh(); + + if (renderSound) + { + ProcessSound(); + } + + Frame++; + if (IsLagFrame) + { + LagCount++; + } + + return true; + } + + private void OnVideoRefresh() + { + VideoDirty = true; +#if false + _core.Encore_GetVideoBufferDimensions(_context, out _encoreVideoProvider.BW, out _encoreVideoProvider.BH); + _encoreVideoProvider.VideoDirty = true; + + _core.Encore_GetTouchScreenLayout(_context, out var x, out var y, out var width, out var height, out var rotated, out var enabled); + TouchScreenRectangle = new(x, y, width, height); + TouchScreenRotated = rotated; + TouchScreenEnabled = enabled; +#endif + } + + public void ResetCounters() + { + Frame = 0; + LagCount = 0; + IsLagFrame = false; + } + + private bool _disposed = false; + + public void Dispose() + { + // Just in case, do not try to dispose once it has been disposed once + if (_disposed) + { + return; + } + + _disposed = true; + + // Shutting down ppsspp core + _libPPSSPP.Deinit(); + + // Freeing up disc assets + foreach (var disc in _discAssets) disc.DiscData.Dispose(); + } + } +} + diff --git a/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.IInputPollable.cs b/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.IInputPollable.cs new file mode 100644 index 00000000000..11350daf41a --- /dev/null +++ b/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.IInputPollable.cs @@ -0,0 +1,13 @@ +using BizHawk.Emulation.Common; + +namespace BizHawk.Emulation.Cores.Consoles.Sony.PSP +{ + public partial class PPSSPP : IInputPollable + { + public int LagCount { get; set; } + public bool IsLagFrame { get; set; } + public IInputCallbackSystem InputCallbacks { get; } = new InputCallbackSystem(); + + private IController _controller = NullController.Instance; + } +} diff --git a/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.ISoundProvider.cs b/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.ISoundProvider.cs new file mode 100644 index 00000000000..fcbc10f7306 --- /dev/null +++ b/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.ISoundProvider.cs @@ -0,0 +1,44 @@ +using BizHawk.Emulation.Common; + +namespace BizHawk.Emulation.Cores.Consoles.Sony.PSP +{ + public partial class PPSSPP : ISoundProvider + { + private short[] _sampleBuf = new short[4096 * 2]; + private int _nsamps; + + private void ProcessSound() + { + _nsamps = _libPPSSPP.GetAudio(_sampleBuf) / 2; + } + + public bool CanProvideAsync => false; + + public SyncSoundMode SyncMode => SyncSoundMode.Sync; + + public void DiscardSamples() + { + _nsamps = 0; + } + + public void GetSamplesAsync(short[] samples) + { + throw new NotSupportedException("Aync mode is not supported"); + } + + public void GetSamplesSync(out short[] samples, out int nsamp) + { + samples = _sampleBuf; + nsamp = _nsamps; + DiscardSamples(); + } + + public void SetSyncMode(SyncSoundMode mode) + { + if (mode == SyncSoundMode.Async) + { + throw new NotSupportedException("Async mode is not supported"); + } + } + } +} diff --git a/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.IStatable.cs b/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.IStatable.cs new file mode 100644 index 00000000000..c5f5a7ceeb6 --- /dev/null +++ b/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.IStatable.cs @@ -0,0 +1,53 @@ +using System.IO; + +using BizHawk.Emulation.Common; + +namespace BizHawk.Emulation.Cores.Consoles.Sony.PSP +{ + public partial class PPSSPP : IStatable + { + private byte[] _stateBuf = [ ]; + + public bool AvoidRewind => false; + + public void SaveStateBinary(BinaryWriter writer) + { + var stateLen = _libPPSSPP.GetStateSize(); + writer.Write(stateLen); + + if (stateLen != _stateBuf.Length) + { + _stateBuf = new byte[stateLen]; + } + + _libPPSSPP.SaveState(_stateBuf); + writer.Write(_stateBuf, 0, stateLen); + + // other variables + writer.Write(IsLagFrame); + writer.Write(LagCount); + writer.Write(Frame); + } + + public void LoadStateBinary(BinaryReader reader) + { + var stateLen = reader.ReadInt32(); + + if (stateLen != _stateBuf.Length) + { + _stateBuf = new byte[stateLen]; + } + + reader.Read(_stateBuf, 0, stateLen); + _libPPSSPP.LoadState(_stateBuf, stateLen); + + // other variables + IsLagFrame = reader.ReadBoolean(); + LagCount = reader.ReadInt32(); + Frame = reader.ReadInt32(); + + // memory domain pointers are no longer valid, reset them + // WireMemoryDomains(); + } + } +} diff --git a/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.IVideoProvider.cs b/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.IVideoProvider.cs new file mode 100644 index 00000000000..7993c5816b4 --- /dev/null +++ b/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.IVideoProvider.cs @@ -0,0 +1,44 @@ +using BizHawk.Emulation.Common; + +namespace BizHawk.Emulation.Cores.Consoles.Sony.PSP +{ + public partial class PPSSPP : IVideoProvider + { + private const int BW = 480; + private const int BH = 272; + internal bool VideoDirty; + + protected readonly IntPtr _context; + + // ReSharper disable ConvertToAutoPropertyWhenPossible + public int VirtualWidth => BW; + public int VirtualHeight => BH; + public int BufferWidth => BW; + public int BufferHeight => BH; + public int VsyncNumerator => 268111856; + public int VsyncDenominator => 4481136; + public int BackgroundColor => 0; + + private int[] _vbuf = new int[BW * BH]; + + public int[] GetVideoBuffer() + { +#if false + if (VideoDirty) + { + if (_vbuf.Length < BW * BH) + { + _vbuf = new int[BW * BH]; + } + + _core.PPSSPP_ReadFrameBuffer(_context, _vbuf); + VideoDirty = false; + } +#endif + + _libPPSSPP.GetVideo(_vbuf); + return _vbuf; + } + } +} + diff --git a/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.cs b/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.cs new file mode 100644 index 00000000000..d6982456491 --- /dev/null +++ b/src/BizHawk.Emulation.Cores/Consoles/Sony/PSP/PPSSPP.cs @@ -0,0 +1,173 @@ +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using BizHawk.BizInvoke; +using BizHawk.Common; +using BizHawk.Emulation.Common; +using BizHawk.Emulation.Cores.Properties; +using BizHawk.Emulation.DiscSystem; + +namespace BizHawk.Emulation.Cores.Consoles.Sony.PSP +{ + [PortedCore( + name: CoreNames.PPSSPP, + author: "Henrik Rydgård et al", + portedVersion: "2025.03.09 (ecbbadd)", + portedUrl: "https://github.com/hrydgard/ppsspp", + isReleased: false)] + public partial class PPSSPP : IEmulator, IVideoProvider, ISoundProvider, IInputPollable, IStatable + { + private static DynamicLibraryImportResolver _resolver; + private LibPPSSPP _libPPSSPP; + private readonly List _discAssets; + + [CoreConstructor(VSystemID.Raw.PSP)] + public PPSSPP(CoreLoadParameters lp) + { + DriveLightEnabled = true; + _discAssets = lp.Discs; + + // If no discs loaded, then there's nothing to emulate + if (_discAssets.Count == 0) throw new InvalidOperationException("No CDs provided for emulation"); + _isMultidisc = _discAssets.Count > 1; + + _CDReadCallback = CDRead; + _CDSectorCountCallback = CDSectorCount; + _discIndex = 0; + foreach (var disc in _discAssets) _cdReaders.Add(new(disc.DiscData)); + + Console.WriteLine($"[CD] Sector count: {_discAssets[0].DiscData.Session1.LeadoutLBA}"); + ControllerDefinition = CreateControllerDefinition(_isMultidisc); + + // Registering service provider + _serviceProvider = new(this); + _serviceProvider.Register(this); + _serviceProvider.Register(this); + + // Loading LibPPSSPP + _resolver = new(OSTailoredCode.IsUnixHost ? "libppsspp.so" : "libppsspp.dll", hasLimitedLifetime: true); + _libPPSSPP = BizInvoker.GetInvoker(_resolver, CallingConventionAdapters.Native); + + // Setting input callback + _inputCallback = InputCallback; + _libPPSSPP.SetInputCallback(_inputCallback); + + // Setting CD callbacks + _libPPSSPP.SetCdCallbacks(_CDReadCallback, _CDSectorCountCallback); + + //// Pre-loading emulator resources + + // Getting compat.ini -- required to set game-specific compatibility flags + string resourceName = ""; + + resourceName = "compat.ini"; + var compatIniData = Resources.PPSSPP_COMPAT_INI.Value; + if (!_libPPSSPP.loadResource(resourceName, compatIniData, compatIniData.Length)) throw new InvalidOperationException($"Could not load resource: {resourceName}"); + + // Getting compat_vr.ini -- required to set more game-specific compatibility flags + resourceName = "compatvr.ini"; + var compatvrIniData = Resources.PPSSPP_COMPATVR_INI.Value; + if (!_libPPSSPP.loadResource(resourceName, compatvrIniData, compatvrIniData.Length)) throw new InvalidOperationException($"Could not load resource: {resourceName}"); + + // Getting UI atlas font -- required to show console system text + resourceName = "font_atlas.zim"; + var atlasZimData = Resources.PPSSPP_FONT_ATLAS_ZIM.Value; + if (!_libPPSSPP.loadResource(resourceName, atlasZimData, atlasZimData.Length)) throw new InvalidOperationException($"Could not load resource: {resourceName}"); + + // Getting UI atlas font metadata -- required to show console system text + resourceName = "font_atlas.meta"; + var atlasMetadataData = Resources.PPSSPP_FONT_ATLAS_METADATA.Value; + if (!_libPPSSPP.loadResource(resourceName, atlasMetadataData, atlasMetadataData.Length)) throw new InvalidOperationException($"Could not load resource: {resourceName}"); + + // Getting ppge atlas font -- required to show console system text + resourceName = "ppge_atlas.zim"; + var ppgeAtlasZimData = Resources.PPSSPP_PPGE_ATLAS_ZIM.Value; + if (!_libPPSSPP.loadResource(resourceName, ppgeAtlasZimData, ppgeAtlasZimData.Length)) throw new InvalidOperationException($"Could not load resource: {resourceName}"); + + // Getting ppge atlas font metadata -- required to show console system text + resourceName = "ppge_atlas.meta"; + var ppgeAtlasMetadataData = Resources.PPSSPP_PPGE_ATLAS_METADATA.Value; + if (!_libPPSSPP.loadResource(resourceName, ppgeAtlasMetadataData, ppgeAtlasMetadataData.Length)) throw new InvalidOperationException($"Could not load resource: {resourceName}"); + + // Getting PPGe font -- required to show console system text + resourceName = "PPGeFont.ttf"; + var PPGeFontData = Resources.PPGE_FONT_ROBOTO_CONDENSED.Value; + if (!_libPPSSPP.loadResource(resourceName, PPGeFontData, PPGeFontData.Length)) throw new InvalidOperationException($"Could not load resource: {resourceName}"); + + // Getting user data folder for savestates / misc files + DeterministicEmulation = lp.DeterministicEmulationRequested; + string userPath = lp.Comm.CoreFileProvider.GetUserPath(SystemId, temp: true) + Path.DirectorySeparatorChar; + userPath = userPath.Replace('\\', '/'); // LibPPSSPP uses / + + ////////////// Initializing Core + string cdName = _discAssets[0].DiscName; + Console.WriteLine($"Launching Core with Game: '{cdName}'"); + if (!_libPPSSPP.Init(gameFile: cdName, userPath)) + { + throw new InvalidOperationException("Core rejected the rom!"); + } + } + + // Input callback + private readonly LibPPSSPP.InputCallback _inputCallback; + + // CD Handling logic + private bool _isMultidisc; + private bool _discInserted = true; + private readonly LibPPSSPP.CDReadCallback _CDReadCallback; + private readonly LibPPSSPP.CDSectorCountCallback _CDSectorCountCallback; + private int _discIndex; + private readonly List _cdReaders = [ ]; + private static int CD_SECTOR_SIZE = 2048; + private readonly byte[] _sectorBuffer = new byte[CD_SECTOR_SIZE]; + + private void SelectNextDisc() + { + _discIndex++; + if (_discIndex == _discAssets.Count) _discIndex = 0; + Console.WriteLine($"Selected CDROM {_discIndex}: {_discAssets[_discIndex].DiscName}"); + } + + private void SelectPrevDisc() + { + _discIndex--; + if (_discIndex < 0) _discIndex = _discAssets.Count - 1; + Console.WriteLine($"Selected CDROM {_discIndex}: {_discAssets[_discIndex].DiscName}"); + } + + private void CDRead(int lba, IntPtr dest) + { + if (_discIndex < _discAssets.Count) + { + _cdReaders[_discIndex].ReadLBA_2048(lba, _sectorBuffer, 0); + Marshal.Copy(_sectorBuffer, 0, dest, CD_SECTOR_SIZE); + } + DriveLightOn = true; + } + + private int CDSectorCount() + { + if (_discIndex < _discAssets.Count) return _discAssets[_discIndex].DiscData.Session1.LeadoutLBA; + return -1; + } + + private void InputCallback() + { + IsLagFrame = false; + } + + protected void SaveStateBinaryInternal(BinaryWriter writer) + { + writer.Write(_discIndex); + writer.Write(_discInserted); + writer.Write(DriveLightOn); + } + + protected void LoadStateBinaryInternal(BinaryReader reader) + { + _discIndex = reader.ReadInt32(); + _discInserted = reader.ReadBoolean(); + DriveLightOn = reader.ReadBoolean(); + } + } +} diff --git a/src/BizHawk.Emulation.Cores/CoreNames.cs b/src/BizHawk.Emulation.Cores/CoreNames.cs index 097f1fdb763..5470b7b23e8 100644 --- a/src/BizHawk.Emulation.Cores/CoreNames.cs +++ b/src/BizHawk.Emulation.Cores/CoreNames.cs @@ -50,6 +50,7 @@ public static class CoreNames public const string Opera = "Opera"; public const string PceHawk = "PCEHawk"; public const string PicoDrive = "PicoDrive"; + public const string PPSSPP = "PPSSPP"; public const string QuickNes = "quickerNES"; public const string Sameboy = "SameBoy"; public const string Saturnus = "Saturnus"; diff --git a/src/BizHawk.Emulation.Cores/Properties/Resources.cs b/src/BizHawk.Emulation.Cores/Properties/Resources.cs index 400c83a058f..dd635b5950c 100644 --- a/src/BizHawk.Emulation.Cores/Properties/Resources.cs +++ b/src/BizHawk.Emulation.Cores/Properties/Resources.cs @@ -44,5 +44,12 @@ internal static class Resources { internal static readonly Lazy JAGUAR_MSERIES_ROM = new(() => ReadEmbeddedByteArray("JAGUAR_MSERIES.ROM.zst")); internal static readonly Lazy JAGUAR_MEMTRACK_ROM = new(() => ReadEmbeddedByteArray("JAGUAR_MEMTRACK.ROM.zst")); internal static readonly Lazy DSDA_DOOM_WAD = new(() => ReadEmbeddedByteArray("dsda-doom.zst")); + internal static readonly Lazy PPSSPP_COMPAT_INI = new(() => ReadEmbeddedByteArray("ppsspp_compat.ini")); + internal static readonly Lazy PPSSPP_COMPATVR_INI = new(() => ReadEmbeddedByteArray("ppsspp_compatvr.ini")); + internal static readonly Lazy PPSSPP_PPGE_ATLAS_ZIM = new(() => ReadEmbeddedByteArray("ppsspp_ppge_atlas.zim")); + internal static readonly Lazy PPSSPP_PPGE_ATLAS_METADATA = new(() => ReadEmbeddedByteArray("ppsspp_ppge_atlas.meta")); + internal static readonly Lazy PPSSPP_FONT_ATLAS_ZIM = new(() => ReadEmbeddedByteArray("ppsspp_font_atlas.zim")); + internal static readonly Lazy PPSSPP_FONT_ATLAS_METADATA = new(() => ReadEmbeddedByteArray("ppsspp_font_atlas.meta")); + internal static readonly Lazy PPGE_FONT_ROBOTO_CONDENSED = new(() => ReadEmbeddedByteArray("ppsspp_Roboto-Condensed.ttf")); } } diff --git a/src/BizHawk.Emulation.Cores/Resources/ppsspp_Roboto-Condensed.ttf b/src/BizHawk.Emulation.Cores/Resources/ppsspp_Roboto-Condensed.ttf new file mode 100644 index 00000000000..ec7d1e016c1 Binary files /dev/null and b/src/BizHawk.Emulation.Cores/Resources/ppsspp_Roboto-Condensed.ttf differ diff --git a/src/BizHawk.Emulation.Cores/Resources/ppsspp_compat.ini b/src/BizHawk.Emulation.Cores/Resources/ppsspp_compat.ini new file mode 100644 index 00000000000..7e8b75d9504 --- /dev/null +++ b/src/BizHawk.Emulation.Cores/Resources/ppsspp_compat.ini @@ -0,0 +1,1866 @@ +# ======================================================================================== +# compat.ini for PPSSPP +# ======================================================================================== +# +# This file is not meant to be user-editable, although is kept as a separate ini +# file instead of compiled into the code for debugging purposes. +# +# The uses cases are strict: +# * Enable fixes for things we can't reasonably emulate without completely ruining +# performance for other games, such as the screen copies in Dangan Ronpa +# * Disabling accuracy features like 16-bit depth rounding, when we can't seem to +# implement them at all in a 100% compatible way +# * Emergency game-specific compatibility fixes before releases, such as the GTA +# music problem where every attempted fix has reduced compatibility with other games +# * Enable "unsafe" performance optimizations that some games can tolerate and +# others cannot. We do not currently have any of those. +# +# This functionality should NOT be used for any of the following: +# * Cheats +# * Fun hacks, like enlarged heads or whatever +# * Fixing general compatibility issues. First try to find a general solution. Try hard. +# +# Game IDs can be looked up at GameFAQs, for example: +# http://www.gamefaqs.com/psp/925776-grand-theft-auto-liberty-city-stories/data +# Sometimes the information may be incomplete though. +# +# ======================================================================================== +# Issue numbers refer to issues on https://github.com/hrydgard/ppsspp/issues +# ======================================================================================== + +[VertexDepthRounding] +# Phantasy Star Portable needs depth rounding to 16-bit precision for text to show up. +# It's enough to do it at the vertex granularity. #3777 +# Phantasy Star Portable +ULJM05309 = true +ULUS10410 = true +ULES01218 = true +ULJM08023 = true +ULES01218 = true +# Phantasy Star Portable 1 Demo +NPUH90023 = true +# Phantasy Star Portable 2 +ULES01439 = true +ULUS10529 = true +ULJM05493 = true +NPJH50043 = true +ULJM08030 = true +NPUH90023 = true +ULJM91014 = true +NPJH90002 = true +ULJM05732 = true +NPJH50332 = true +# Phantasy Star Portable 2 JP Demo +ULJM91018 = true +NPJH90062 = true +# Phantasy Star Portable Infinity Demo +NPJH90157 = true # Infinity demo + +# Puyo Puyo Fever 2 #3663 (layering) +ULJM05058 = true +# NBA 2K13 #6603 (menu glitches) +ULAS42332 = true +ULJS00551 = true +NPJH50713 = true +ULJS00596 = true +ULES01578 = true +ULUS10598 = true +# Power Stone Collection #6257 (map arrow) +ULES00496 = true +ULUS10171 = true +ULJM05178 = true +# Taiko no Tatsujin Portable DX #7920 (missing text) +ULJS00383 = true +NPJH50426 = true +ULAS42282 = true +# PhotoKano #7920 (missing text) +ULJS00378 = true +NPJH50579 = true +ULJS19069 = true +NPJH50579 = true + +# After Burner: Black Falcon (#8514, only affects video) +ULUS10244 = true +ULES00753 = true +ULES00785 = true + +# Matching Maker 3 x Tousouchuu (#15913) +ULJS00242 = true + +[PixelDepthRounding] +# Heroes Phantasia requires pixel depth rounding. #6485 (flickering overlaid sprites) +NPJH50558 = true +ULJS00456 = true +ULJS00454 = true + +# Tales of Phantasia: Full Voice Edition +# Attempted workaround for stencil testing driver bug on Arm Exynos (similar to the previous Adreno bug). +# Seems that writing to depth disables a faulty optimization it's trying to do (as we saw in stencil draw). +ULJS00079 = true +ULJS19016 = true +UCAS40110 = true +NPJH50854 = true + +# Heroes Phantasia Limited Edition Disc requires pixel depth rounding. +ULJS00455 = true +# Phantasy Star games flickering +# Phantasy Star Portable +ULJM05309 = true +ULUS10410 = true +ULES01218 = true +ULJM08023 = true +ULES01218 = true +# Phantasy Star Portable 1 Demo +NPUH90023 = true +# Phantasy Star Portable 2 +ULES01439 = true +ULUS10529 = true +ULJM05493 = true +NPJH50043 = true +ULJM08030 = true +NPUH90023 = true +ULJM91014 = true +NPJH90002 = true +ULJM05732 = true +NPJH50332 = true +# Phantasy Star Portable 2 JP Demo +ULJM91018 = true +NPJH90062 = true +# Phantasy Star Portable Infinity Demo +NPJH90157 = true # Infinity demo + +# Nayuta no Kiseki might improve with pixel depth rounding. See issue #8744. +ULJM06113 = true +NPJH50625 = true +ULJM08069 = true +NPJH50625 = true + +[DepthRangeHack] +# Phantasy Star Portable 2 and Infinity both use viewport depth outside [0, 1]. +# This gets clamped in our current implementation, but attempts to fix it run into +# Other bugs, so we've restored this hack for now. +# Phantasy Star Portable +ULJM05309 = true +ULUS10410 = true +ULES01218 = true +ULJM08023 = true +ULES01218 = true +# Phantasy Star Portable 1 Demo +NPUH90023 = true +# Phantasy Star Portable 2 +ULES01439 = true +ULUS10529 = true +ULJM05493 = true +NPJH50043 = true +ULJM08030 = true +NPUH90023 = true +ULJM91014 = true +NPJH90002 = true +ULJM05732 = true +NPJH50332 = true +# Phantasy Star Portable 2 JP Demo +ULJM91018 = true +NPJH90062 = true +# Phantasy Star Portable Infinity Demo +NPJH90157 = true # Infinity demo + +[ClearToRAM] +# SOCOM Navy Seals games require this. See issue #8973. +# Navy Seals : Tactical Strike +UCES00855 = true +UCUS98649 = true +NPJG00035 = true +NPJG90068 = true +UCJS10102 = true +# Tactical Strike demo +NPUG70003 = true +# Fireteam Bravo +UCKS45021 = true +UCUS98615 = true +UCES00038 = true +ULES00038 = true +# Fireteam Bravo 2 +UCES00543 = true +UCUS98645 = true +# Fireteam Bravo 2 Demo +UCUS98677 = true +UCUS98691 = true + +# DBZ Tenkaichi Tag Team, see issue #14283 +ULJS00311 = true +ULAS42247 = true +ULUS10537 = true +ULUS10737 = true +ULJS19067 = true +ULAS42318 = true +NPUH90087 = true # demo +NPEH90042 = true # demo + +[Force04154000Download] +# This applies a hack to Dangan Ronpa, its demo, and its sequel. +# The game draws solid colors to a small framebuffer, and then reads this directly in VRAM. +# We force this framebuffer to 1x and force download it automatically. +NPJH50631 = true +NPJH50372 = true +NPJH90164 = true +NPJH50515 = true +# Let's also apply to Me & My Katamari. +ULUS10094 = true +ULES00339 = true +ULJS00033 = true +UCKS45022 = true +ULJS19009 = true +NPJH50141 = true + +[DrawSyncEatCycles] +# This replaced Crash Tag Team Racing hack to also fix Gundam games +# It makes sceGeDrawSync eat a lot of cycles which can affect timing in lots of games, +# might be negative for others, but happens to fix games below. +# Gundam Battle Royale might need it to avoid crashes when certain Ace enemies shows up +ULJS00083 = true +ULKS46104 = true +ULJS19015 = true +# Gundam Battle Chronicle needs it to avoid crashes after most battles +ULJS00122 = true +ULKS46158 = true +ULJS19021 = true +# Gundam Battle Universe same problem as above +ULJS00145 = true +ULKS46183 = true +ULJS00260 = true +ULJS19041 = true +NPJH50843 = true +# Helps with Jeanne d'Arc weird 40/40 fps problem #5154 +UCAS40129 = true +UCJS10048 = true +UCKS45033 = true +UCJS18014 = true +UCUS98700 = true +NPJG00032 = true +UCJX90019 = true +# Fixes some double framerate issues in Patapon 2, contributed by pamford45 +UCJS10089 = true +NPJG00010 = true +PSPJ30000 = true +UCAS40232 = true +UCAS40239 = true +UCES01177 = true +UCUS98732 = true +UCJS18036 = true +UCAS40292 = true +UCJS18053 = true + +# Rewrite +# fixes softlocks, see #15904 +ULJM06364 = true +ULJM06365 = true + +# Crash Tag Team Racing used to need it to pass checking memory stick screen. +# ULES00168 = true +# ULES00169 = true +# ULES00170 = true +# ULES00171 = true +# ULES00172 = true +# ULJM05036 = true +# ULUS10044 = true + +[KernelGetSystemTimeLowEatMoreCycles] +# Brothers in Arms: D-Day works around weird FPS(falling under 100% even on powerful hardware) as well as it's animation speed #18509 +# recommend to OC PSP CPU to at least twice as much as real PSP to get constant 60 fps +ULES00608 = true +ULUS10193 = true + +[DrawSyncInstant] +# Bizarre timing issue in Sakura-sou no Pet na Kanojo, see issue #15224. Note that an instant DrawSync is not logical. +NPJH50745 = true + +[FakeMipmapChange] +# This hacks separates each mipmap to independent textures to display wrong-size mipmaps. +# For example this requires games like Tactics Ogre(Japanese) to display multi bytes fonts stored in mipmaps. +# See issue #5350. +# Tactics Ogre (Japanese) +ULJM05753 = true +NPJH50348 = true +ULJM06009 = true +# We handle the US/EU versions by detecting its weird use of two identical mipmaps and treating it as a normal 2D texture (#17491 / #17980) + +[RequireBufferedRendering] +# Warn the user that the game will not work and have issue, if buffered rendering is not enabled. +# Midnight Club: LA Remix +ULUS10383 = true +ULES01144 = true +ULJS00180 = true +ULJS00267 = true +ULJM05904 = true +NPJH50440 = true +# Midnight Club 3 : DUB edition +ULUS10021 = true +ULES00108 = true +# GTA : VCS +ULUS10160 = true +ULES00502 = true +ULES00503 = true +ULJM05297 = true +ULJM05395 = true +ULJM05884 = true +NPJH50827 = true +# GTA : VCS Prototypes +ULET00417 = true +# GTA : LCS +ULUS10041 = true +ULES00151 = true +ULES00182 = true +ULJM05255 = true +ULJM05359 = true +ULJM05885 = true +NPJH50825 = true +ULKS46157 = true +# GTA : LCS Prototypes +ULUS01826 = true +ULUX80146 = true +# Sindacco Chronicles total conversion +ULUS01826 = true + +# GOW : Ghost of Sparta +UCUS98737 = true +UCAS40323 = true +NPHG00092 = true +NPEG00044 = true +NPEG00045 = true +NPJG00120 = true +NPUG80508 = true +UCJS10114 = true +UCES01401 = true +UCES01473 = true +# GOW : Ghost of Sparta Demo +NPJG90095 = true +NPEG90035 = true +NPUG70125 = true +# GOW : Chains Of Olympus +UCAS40198 = true +UCUS98653 = true +UCES00842 = true +ULJM05438 = true +ULJM05348 = true +UCKS45084 = true +NPUG80325 = true +NPEG00023 = true +NPHG00027 = true +NPHG00028 = true +NPJH50170 = true +UCET00844 = true +# GOW: Chains of Olympus Demo +UCUS98705 = true +UCED00971 = true +UCUS98713 = true +# Daxter +UCUS98618 = true +UCUS98654 = true +UCES00044 = true +NPUG80329 = true +NPEG00025 = true +UCKS45025 = true +# Ys Seven +ULUS10551 = true +ULJM05475 = true +NPEH00065 = true +NPJH50350 = true +ULJM08041 = true +NPEH00065 = true +# The Legend of Heroes: Trails in the Sky +ULUS10540 = true +ULUS10578 = true +ULES01556 = true +ULJM05170 = true +ULJM08033 = true +NPJH50373 = true +# Grand Knights History +ULJS00394 = true +ULJS19068 = true +NPJH50518 = true +# Tactics Ogre +ULUS10565 = true +ULES01500 = true +ULJM05753 = true +NPJH50348 = true +ULJM06009 = true +UCKS45164 = true +# Metal Gear Solid : Peace Walker +ULUS10509 = true +ULES01372 = true +ULJM08038 = true +NPJH50045 = true +ULJM05630 = true +NPJH90082 = true +NPJH90063 = true +# Star Ocean : Second Evolution +ULUS10375 = true +ULES01187 = true +ULJM05591 = true +ULJM05325 = true +UCAS40203 = true +# Driver 76 +ULUS10235 = true +ULES00740 = true +# Chili Con Carnage +ULUS10216 = true +ULES00629 = true +# Digimon Adventure +NPJH50686 = true +ULJS00541 = true +ULAS42340 = true +# Danganronpa +ULJS00337 = true +ULJS19060 = true +NPJH50372 = true +NPJH50515 = true +# Danganronpa Demo +NPJH90164 = true +# Super Danganronpa 2 +ULJS00521 = true +ULJS00522 = true +NPJH50631 = true +# The Simpsons Game +ULUS10295 = true +ULES00975 = true +ULES00979 = true +ULES00978 = true +ULES00977 = true +ULES00976 = true +# Jeanne d'Arc +UCUS98700 = true +UCJS10048 = true +# Jeanne d'Arc Senkou Taikenban (Demo) +UCJX90019 = true +# Dante's Inferno +ULUS10469 = true +ULES01384 = true +ULJM05621 = true +NPJH50220 = true +ULJM05799 = true +ULKS46248 = true +# Test Drive Unlimited +ULET00386 = true +ULUS10249 = true +ULES00637 = true +ULKS46126 = true +# Silent Hill: Shattered Memories +ULUS10450 = true +ULES01352 = true +ULJM05564 = true +NPJH50148 = true +ULAS42189 = true +# Silent Hill: Origins +ULUS10285 = true +ULES00869 = true +ULJM05281 = true +NPJH50051 = true +# Manhunt 2 +ULUS10280 = true +ULES00756 = true +# LEGO Star Wars II: The Original Trilogy +ULUS10155 = true +ULES00479 = true +# LEGO Indiana Jones: The Original Adventures +ULUS10365 = true +ULES01086 = true +# LEGO Batman: The Videogame +ULUS10380 = true +ULES01151 = true +# Burnout Dominator +ULUS10236 = true +ULES00750 = true +ULJM05242 = true +ULJM05371 = true +NPJH50304 = true +ULES00703 = true +# Yu-Gi-Oh Tag Force 6 +ULJM05940 = true +NPJH50794 = true + +# Cave Story (homebrew) +CAVE00992 = true + +# TODO: There are many more. + +[RequireBlockTransfer] +# Warn the user that the game will have issue graphic, if simulate block transfer is not enabled. +# The Legend of Heroes: Trails in the Sky need it to fix graphical glitch in menu screen. See issues #8053 +ULUS10540 = true +ULUS10578 = true +ULES01556 = true +ULJM05170 = true +ULJM08033 = true +NPJH50373 = true +NPUH10191 = true +NPUH10197 = true +# Grand Knights History need it to fix blackboxes on characters and flickering texture . See issues #2135, #6099 +ULJS00394 = true +ULJS19068 = true +NPJH50518 = true +# Gradius Collection (see #13887) +ULUS10103 = true +ULES00381 = true +ULJM05091 = true +# GachiTora! Abarenbou Kyoushi in High School need it to render shadows properly (see #14136) +ULJS00355 = true +NPJH50409 = true +# MegaMan Maverick Hunter X (see #10085) +ULES00251 = true +ULUS10068 = true +ULJM05043 = true + +[DisableAccurateDepth] +# Midnight Club: LA Remix +ULUS10383 = true +ULES01144 = true +ULJS00180 = true +ULJS00267 = true +ULJM05904 = true +NPJH50440 = true +# Midnight Club 3 : DUB edition +ULUS10021 = true +ULES00108 = true + +# Shadow of Destiny (#9545) +ULUS10459 = true +NPJH50036 = true + +# Burnout games have problems with this on Mali, and have no use for it +# Legends +#ULES00125 = true +#ULUS10025 = true +#ULJM05228 = true +#NPJH50305 = true +#ULJM05049 = true +#ULKS46027 = true +#ULAS42019 = true + +# Dominator +ULUS10236 = true +ULES00750 = true +ULJM05242 = true +ULJM05371 = true +NPJH50304 = true +ULES00703 = true +ULAS42095 = true + +[RequireDefaultCPUClock] +# GOW : Ghost of Sparta +UCUS98737 = true +UCAS40323 = true +NPHG00092 = true +NPEG00044 = true +NPEG00045 = true +NPJG00120 = true +NPUG80508 = true +UCJS10114 = true +UCES01401 = true +UCES01473 = true +# GOW : Ghost of Sparta Demo +NPJG90095 = true +NPEG90035 = true +NPUG70125 = true +# Tekken 6 +ULUS10466 = true +ULES01376 = true +ULJS00224 = true +NPUH10047 = true +ULAS42214 = true +ULJS19054 = true +NPJH50184 = true + +[MGS2AcidHack] +ULUS10006 = true # Metal Gear Acid +ULES00008 = true +ULJM05001 = true +ULAS42007 = true +ULJM08001 = true +ULUS10077 = true # Metal Gear Acid 2 +ULAS42035 = true +ULES00284 = true +ULJM05047 = true +ULKS46065 = true +ULJM08011 = true + +[SonicRivalsHack] +ULES00622 = true # SR1 +ULUS10195 = true # SR1 +ULUS10323 = true # SR2 +ULES00940 = true # SR2 +ULET00958 = true + +[BlockTransferAllowCreateFB] +# Digimon Adventure (JP and English patches) +NPJH50686 = true +ULJS00541 = true +ULAS42340 = true + +# MotoGP +ULUS10153 = true +UCES00373 = true +ULJS00078 = true +UCAS40104 = true + +# Ys Seven disabled (caused glitches, see #13529) +# ULUS10551 = true +# ULJM05475 = true +# ULJM05475 = true +# NPEH00065 = true +# NPJH50350 = true + +# Burnout Legends +ULES00125 = true +ULUS10025 = true +ULJM05228 = true +NPJH50305 = true +ULJM05049 = true +ULKS46027 = true +ULAS42019 = true + +# Burnout Dominator +ULUS10236 = true +ULES00750 = true +ULJM05242 = true +ULJM05371 = true +NPJH50304 = true +ULES00703 = true + +# Test Drive Unlimited +ULET00386 = true +ULUS10249 = true +ULES00637 = true +ULKS46126 = true + +# Naruto Shippuden: Ultimate Ninja Impact +ULUS10582 = true +ULES01537 = true +ULJS00390 = true +ULAS42297 = true +ULJS19071 = true +NPJH50435 = true +NPJH50435 = true + +# Naruto Shippuden: Ultimate Ninja Heroes 3 (issue #16733) +ULJS00236 = true +ULAS42208 = true +ULUS10518 = true +ULAS42231 = true +ULJS19066 = true +ULAS42317 = true +ULUS10518 = true + +# Gradius Collection +ULUS10103 = true +ULES00381 = true +ULJM05091 = true +ULJM05222 = true +ULAS42040 = true +ULKS46064 = true + +# Shaun White Snowboarding (player shadow) +ULES01185 = true +ULUS10399 = true +ULJM05412 = true +NPJH50083 = true +ULJM05570 = true + +# Cars Race-o-rama +ULUS10428 = true +ULES01333 = true + +# MX vs ATV Reflex +ULES01375 = true +ULUS10429 = true + +# Silent Hill: Origins +# Avoids readback. +ULES00869 = true +ULUS10285 = true +ULKS46161 = true +ULJM05281 = true +NPJH50051 = true + +# Silent Hill: Shattered Memories +# Avoids readback. +ULUS10450 = true +ULES01352 = true +ULJM05564 = true +NPJH50148 = true +ULAS42189 = true + +# Toca Race Driver 3 / DTM Race Driver 3 / V8 Supercars Shootout 3 +# Avoids readback. +ULES00613 = true +ULES00615 = true +ULES00614 = true + +# Toca Race Driver 2 / DTM Race Driver 2 +# Avoids readback. +ULES00040 = true +ULES00041 = true +ULJM05160 = true + +# Narikiri Dungeon X. See issue #16714. +ULJS00293 = true + +[IntraVRAMBlockTransferAllowCreateFB] +# Final Fantasy - Type 0 +ULJM05900 = true +ULJM05901 = true +NPJH50443 = true +NPJH50444 = true +ULJM06217 = true +ULJM06218 = true +UCAS40346 = true +UCAS40347 = true + +# Boku no Natsuyasumi: Mushi Mushi Hakase to Teppen-yama no Himitsu!! +UCJS10038 = true +UCJS18013 = true + +# Megaman Maverick Hunter X (see #10085) +ULES00251 = true +ULUS10068 = true +ULJM05043 = true + +# R-TYPE TACTICS (see #14198) +ULJS00111 = true # Japan +NPJH50106 = true # Japan +UCKS45065 = true # Korea +UCAS40168 = true # Asia +ULES01121 = true # Europe + +ULUS10343 = true # US, (R-TYPE COMMAND) +NPUH90008 = true # (R-TYPE COMMAND demo) + +# R-TYPE TACTICS II -Operation BITTER CHOCOLATE- +NPJH50119 = true +ULJS00233 = true +NPJH90089 = true # (demo) +NPJH90065 = true # Unknown + +# Colin McRae 2005 (sun effect, see #7810) +ULES00111 = true +ULKS46010 = true +ULJM05223 = true +ULJM05362 = true + +# Iron Man, see [BlockTransferDepth] below. +ULES01070 = true +ULES01071 = true +ULUS10347 = true + +# Note! This whole flag is disabled temporarily by appending "Disabled" to its name). See 7914 +[YugiohSaveFixDisabled] +# The cause of Yu-gi-oh series 's bad save (cannot save) are load "save status" and use cwcheat, +# but the real cause still unknown. #7914 + +# Yu-Gi-Oh! Duel Monsters GX: Tag Force +ULJM05151 = true +ULES00600 = true +ULUS10136 = true + +# Yu-Gi-Oh! Duel Monsters GX: Tag Force 2 +ULUS10302 = true +ULJM05260 = true +ULES00925 = true +ULES00926 = true + +# Yu-Gi-Oh! Duel Monsters GX: Tag Force 3 +ULES01183 = true +ULJM05373 = true + +# Yu-Gi-Oh! 5D's Tag Force 4 +ULUS10481 = true +ULJM05479 = true +ULES01362 = true + +# Yu-Gi-Oh! 5D's Tag Force 5 +ULUS10555 = true +ULJM05734 = true +ULES01474 = true + +# Yu-Gi-Oh! 5D's Tag Force 6 +ULJM05940 = true +NPJH50794 = true + +# Yu-Gi-Oh! 5D's Tag Force +ULJM05940 = true + +# Yu-Gi-Oh! ARC-V Tag Force Special +NPJH00142 = true + +[ForceUMDDelay] +# F1 2006 won't boot at all with our standard unrealistically fast timing. +UCES00238 = true +UCJS10045 = true +# F1 2005, japan only? +UCJS10019 = true + +# Arctic Adventures - Polar's Puzzles +NPEZ00219 = true +NPUZ00114 = true + +# Innocent Life (see issue #2830) +UCAS40079 = true +ULUS10219 = true +ULES00658 = true +UCAS40187 = true +ULJS00119 = true +ULKS46167 = true +NPJH50017 = true + +# Pangya Fantasy Golf (see issue #17458) +ULUS10438 = true +ULJM05687 = true +ULJM05440 = true +ULKS46164 = true + +# Qix++ (see issue #13724) +ULJM05617 = true +NPJH50199 = true + +# Mahou Shoujo Madoka Magica Portable #6557 +ULJS00430 = true +ULJS00429 = true + +# Harvest Moon US (issue #18287) +ULUS10458 = true +ULES01489 = true +NPJH50019 = true +ULJS19039 = true +ULJS00188 = true + +# Twisted Metal sound effects break without this +UCES00018 = true +UCUS98601 = true + +# PlayStation Network Collection: Power Pack (#19571) +UCES01160 = true + +# PlayStation Network Collection: Puzzle Pack +UCES01159 = true + +# Bust-a-move Deluxe / Ghost (#8795) +ULUS10057 = true +ULES00233 = true + +# Castlevania X Chronicles - Rondo of Blood subgame (#11091) +NPJH50028 = true +ULES00841 = true +ULJM05287 = true +ULKS46155 = true +ULUS10277 = true + +# Crash of the Titans - #12510 +ULES00915 = true +ULES00916 = true +ULES00917 = true +ULES00918 = true +ULUS10304 = true + +[GoWFramerateHack60] +# Replaces ForceMax60FPS for GOW games, should provide smoother experience +# Also works around softlock in GOW:GOS , see #8299 +# GOW : Ghost of Sparta +UCUS98737 = true +UCAS40323 = true +NPHG00092 = true +NPEG00044 = true +NPEG00045 = true +NPJG00120 = true +NPUG80508 = true +UCJS10114 = true +UCES01401 = true +UCES01473 = true +# GOW : Ghost of Sparta Demo +NPEG90035 = true +NPUG70125 = true +NPJG90095 = true +# GOW : Chains Of Olympus +UCAS40198 = true +UCUS98653 = true +UCES00842 = true +ULJM05438 = true +ULJM05348 = true +UCKS45084 = true +NPUG80325 = true +NPEG00023 = true +NPHG00027 = true +NPHG00028 = true +NPJH50170 = true +UCET00844 = true +# GOW: Chains of Olympus Demo +UCUS98705 = true +UCED00971 = true +UCUS98713 = true + +[FramerateHack30] +# Note that this hack is not universal, will not work for games simply added to the list +# 30 fps hacks for games that run well are disabled by default since it's only an option for users with very weak hardware +# GOW in 30 fps doesn't suffer from softlock #8299, so the hack is actually simpler +# GOW : Ghost of Sparta +# UCUS98737 = true +# UCAS40323 = true +# NPHG00092 = true +# NPEG00044 = true +# NPEG00045 = true +# NPJG00120 = true +# NPUG80508 = true +# UCJS10114 = true +# UCES01401 = true +# UCES01473 = true +# GOW : Ghost of Sparta Demo +# NPEG90035 = true +# NPUG70125 = true +# NPJG90095 = true +# GOW : Chains Of Olympus +# UCAS40198 = true +# UCUS98653 = true +# UCES00842 = true +# ULJM05438 = true +# ULJM05348 = true +# UCKS45084 = true +# NPUG80325 = true +# NPEG00023 = true +# NPHG00027 = true +# NPHG00028 = true +# NPJH50170 = true +# UCET00844 = true +# GOW: Chains of Olympus Demo +# UCUS98705 = true +# UCED00971 = true +# UCUS98713 = true + +# Brian Lara 2007: Pressure Play +# workaround for incorrect fps/game speed +ULES00814 = true +ULES00815 = true + +# Blitz: Overtime +# workaround for incorrect fps/game speed +ULUS10200 = true + +[ForceMax60FPS] +# Some games are very heavy and render as fast as they can. They benefit greatly from +# capping the framerate at 60fps. + +# F1 2006 has extremely long loading times if we don't limit the framerate. +UCES00238 = true +UCJS10045 = true +# F1 2005, japan only? +UCJS10019 = true + +# The Transformers games are also afflicted with long loading times and render too fast like GoW. + +# Transformers - The Game +ULES00823 = true +ULES00824 = true +ULES00825 = true +ULUS10274 = true + +# Transformers - Revenge of the Fallen +ULES01286 = true +ULES01287 = true +ULUS10433 = true + +# Tekken 6 +ULUS10466 = true +ULES01376 = true +ULJS00224 = true +NPUH10047 = true +ULAS42214 = true +ULJS19054 = true +NPJH50184 = true + +# Hot Wheels - Ultimate Racing (issue #12604, this is a workaround) +ULUS10239 = true +ULES00828 = true + +# Fat Princess: Fistful of Cake loading speeds benefit greatly. +UCAS40285 = true +UCES01312 = true +NPJG00045 = true +NPHG00025 = true +UCKS45137 = true +UCUS98740 = true + +# Mumbo Jumbo games (see issue #12857) +ULUS10287 = true # Super Collapse 3 +ULES01027 = true # Super Collapse 3 +ULUS10203 = true # Platypus +ULES01029 = true # Platypus +ULUS10227 = true # 7 Wonders of the Ancient World +ULES01037 = true # 7 Wonders of the Ancient World + +# Super Monkey Ball Adventures also benefits from this (#7674). +ULES00364 = true +ULUS10132 = true + +# Homebrew Kurok (we don't normally add homebrew here but it has a distinctive GameID) +KURO00767 = true + +# Scooby-Doo! Who's Watching Who? +ULUS10168 = true +ULES00571 = true + +# Tron Evolution +ULUS10548 = true +ULES01494 = true +ULES01495 = true + +# Atari Classics Evolved +ULUS10325 = true + +# Kurohyou 2: Ryu ga Gotoku Ashura Hen (Japan) +NPJH50562 = true +NPJH50333 = true + +# Silent Hill Origin +ULUS10285 = true +ULES00869 = true + +# Resistance Retribution +UCES01184 = true +UCUS98668 = true +UCJP00174 = true + +# Spider-Man 3 +ULES00938 = true +ULUS10317 = true + +# NBA 2K13 +ULUS10598 = true +ULES01578 = true + +# Killzone: Liberation (see issue #6207) +UCES00279 = true +UCKS45041 = true +UCUS98646 = true +UCET00278 = true +UCUS98670 = true +UCUS98646 = true + +# Infected +ULES00337 = true +ULES00338 = true +ULUS10054 = true + +[JitInvalidationHack] +# This is an absolutely awful hack that somehow prevents issues when clearing the JIT, +# if the game has copied code with EmuHack opcodes or something. Hopefully will be able +# to remove this in the future. +# See #3854. +# Tony Hawk's Underground +ULUS10014 = true +ULES00033 = true +ULES00034 = true +ULES00035 = true +# MTX MotoTrax +ULUS10138 = true +ULES00581 = true + +[HideISOFiles] +# DJ Max Portable has some crude copy-protection functionality where it looks for ISO/CSO files +# in a few directories. Prevent this by hiding the files from the game. +# To be sure, catch all versions and remixes of the game that's been seen in reports. +# It checks the following directories: +# / +# /PSP/ +# /PSP/COMMON +# /PSP/GAME + +ULKS46116 = true +ULKS46189 = true +ULKS46190 = true +ULKS46236 = true +ULKS46240 = true +ULKS46059 = true +ULUS10403 = true +ULUS10538 = true +ULKS46050 = true +ULJM05836 = true +ULJM46236 = true +ULJM06034 = true +NPHH00260 = true +CF0020046 = true +CF0020074 = true +NPJH50471 = true +ULJM06033 = true +NPJH50559 = true +NPEH00030 = true + +[MoreAccurateVMMUL] +# Fixes leg shaking in Tekken 6. The potential for slowdown in other games is large enough +# that we will not generally apply this accurate mode where not needed. +ULUS10466 = true +ULES01376 = true +ULJS00224 = true +NPUH10047 = true +ULAS42214 = true +ULJS19054 = true +NPJH50184 = true + +[ForceSoftwareRenderer] +# Darkstalkers +ULES00016 = true +ULUS10005 = true +ULJM05005 = true + +[DarkStalkersPresentHack] +# Darkstalkers +ULES00016 = true +ULUS10005 = true +ULJM05005 = true + +[ReportSmallMemStick] +# Harry Potter and the Goblet of Fire - issue #13266 +ULUS10032 = true +ULES00210 = true +ULES00214 = true +ULES00215 = true +ULES00216 = true +ULKS46047 = true +# Street Fighter Alpha 3 MAX - issue #10462 +ULJM05082 = true +ULUS10062 = true +ULES00235 = true +ULJM05225 = true +CPCS01043 = true +ULUS10062 = true +# LEGO Star Wars II: The Original Trilogy +ULES00479 = true +ULUS10155 = true +# Tony Hawk's Underground 2 Remix +ULES00033 = true +ULUS10014 = true +# Virtua Tennis: World Tour +ULES00126 = true +ULJM05079 = true +ULKS46023 = true +ULUS10037 = true +# Warriors Orochi - issue #16827 +ULJM05314 = true +ULUS10341 = true +ULES01054 = true +ULJM08022 = true +NPJH50126 = true +ULJM08052 = true +ULAS42316 = true +# Doko Demo Issho - issue #18420 +UCJS10002 = true +UCJS10039 = true +UCJS18012 = true + +[MemstickFixedFree] +# Assassin's Creed : Bloodlines - issue #12761 +ULJM05571 = true +ULES01367 = true +NPEH00029 = true +ULUS10455 = true + +[BlueToAlpha] +# Some games render first to RGB of a 4444 texture, then they switch to 565 and render masked to blue, +# just to be able to render to the alpha channel of the 4444. We can detect that and reroute rendering +# to avoid problems. + +# Split/Second +ULES01402 = true +ULUS10513 = true +ULJM05812 = true +NPJH50371 = true + +# Colin McRae's DiRT 2 - issue #13012 (car reflections) +ULUS10471 = true +ULJM05533 = true +NPJH50006 = true +ULES01301 = true + +# Outrun 2006: Coast to Coast - issue #11358 (car reflections) +ULES00262 = true +ULUS10064 = true +ULKS46087 = true + +[ForceMaxDepthResolution] +# See #17014 - some games don't need our heuristics that drop down to 16-bit depth. + +# Outrun 2006: Coast to Coast - issue #11358 (car reflections) +ULES00262 = true +ULUS10064 = true +ULKS46087 = true + +# Split/Second +ULES01402 = true +ULUS10513 = true +ULJM05812 = true +NPJH50371 = true + +# Cars Race-o-rama +ULUS10428 = true +ULES01333 = true + +# Test Drive Unlimited +ULET00386 = true +ULUS10249 = true +ULES00637 = true +ULKS46126 = true + +[DateLimited] +# Car Jack Streets - issue #12698 +NPUZ00043 = true +NPEZ00198 = true + +[ShaderColorBitmask] +# Colin McRae's DiRT 2 - issue #13012 (water) +ULUS10471 = true +ULJM05533 = true +NPJH50006 = true +ULES01301 = true + +# Outrun 2006: Coast to Coast - issue #11358 (car reflections), #11928 (water) +ULES00262 = true +ULUS10064 = true +ULKS46087 = true + +# Burnout Dominator - lens flare effect (issue #11100) +ULUS10236 = true +ULES00750 = true +ULJM05242 = true +ULJM05371 = true +NPJH50304 = true +ULES00703 = true +ULAS42095 = true + +# Need for Speed - Shift (same as Burnout Dominator) +ULUS10462 = true +ULES01275 = true +ULJM05494 = true +NPJH50143 = true +ULJM05738 = true + +# Dragon Ball Z: Tenkaichi Tag Team: Shadows, see issue #18494 +ULUS10537 = true +ULES01456 = true +ULJS00311 = true +ULJS19067 = true +ULAS42247 = true +ULAS42318 = true + +[DisableFirstFrameReadback] +# SOCOM: Fireteam Bravo 3 (see issue #18958, hopefully fixes crash in Stockpile mission, #10461) +UCES-01242 = true +NPJG-00035 = true +NPHG-00032 = true + +[MpegAvcWarmUp] +# God Eater issue #13527 ,It is custom mpeg library that required sceMpegGetAvcAu return ERROR_MPEG_NO_DATA but break FIFA 14 issue #14086 +# God Eater 1 +ULJS00237 = true +ULKS46238 = true + +# God Eater 2 +ULJS00597 = true +NPJH50832 = true +ULJS19093 = true +NPJH50832 = true + +# God Eater Burst +ULJS00351 = true +NPJH50352 = true +ULJS00350 = true +ULKS46263 = true +ULUS10563 = true +ULES01519 = true +ULJS19056 = true +NPJH50352 = true +ULUS10563FV = true +ULJS19081 = true +NPJH50352 = true + +# Field Commander, see issue #10209 +ULUS10088 = true +ULES00335 = true +ULKS46070 = true + +# Valkyrie Profile Lenneth (last video crash, see #6008) +ULUS10107 = true +ULJM05101 = true +ULES00724 = true +ULJM05320 = true + +[CenteredLines] +# Echochrome looks better with these. Related: #15556 +UCES01011 = true +UCAS40197 = true +NPEG00006 = true +NPUG80135 = true + +# Webfest homebrew game (wireframe 3D rendering) looks substantially better with this. +WEBF00752 = true + +[ZZT3SelectHack] +# Bypass softlock on Zettai Zetsumei Toshi 3 character select screen #4901 +# This problem affects the game also on PS3 +ULJS00191 = true +UCAS40252 = true +UCKS45119 = true +NPJH50907 = true +UCAS40328 = true +ULJS19050 = true +NPJH50907 = true + +[AllowLargeFBTextureOffsets] +# Final Fantasy - Type 0, see #18879 +ULJM05900 = true +ULJM05901 = true +NPJH50443 = true +NPJH50444 = true +ULJM06217 = true +ULJM06218 = true +UCAS40346 = true +UCAS40347 = true + +# Quickfix for Clone Wars, see #12949 +ULES01284 = true +ULES01285 = true +ULUS10477 = true + +# Star Wars: The Force Unleashed +ULUS10345 = true +ULKS46143 = true +ULES00981 = true +ULES00982 = true +LBSW10345 = true # Some modded version found in our report logs + +# Juiced 2 bloom effect (see #7295) +ULES00928 = true +ULUS10312 = true +ULKS46154 = true + +[FramebufferAllowLargeVerticalOffset] +# Tokimeki Memorial 4 (see #6379) +NPJH50127 = true +ULKS46226 = true +ULAS42206 = true +ULJM05541 = true + +# Breath of Fire III +ULES00193 = true +ULJM05029 = true +ULJM05224 = true +NPJH50214 = true + +[AtracLoopHack] +#Atrac looped incorrectly see #7601 #13773 #11586 #10139 #12083 + +#Coded Arms: Contagion +ULUS10184 = true +ULJM05243 = true +ULKS46139 = true + +#Gripshift +ULUS10040 = true +ULES00177 = true +ULKS46040 = true +ULJM05089 = true + +#Jackass the Game +ULUS10303 = true +ULES00897 = true + +#Shrek smash +ULUS10194 = true +ULES00618 = true + +# Silver Fall +ULES00808 = true +ULUS10270 = true + +[DeswizzleDepth] +# Ratchet & Clank smoke effects (#15859) +UCUS98633 = true +UCAS40145 = true +UCES00420 = true +UCJS10052 = true +UCKS45048 = true +UCJS18030 = true +UCJS18047 = true +NPJG00015 = true + +# Jak & Daxter smoke effects (#20002) +UCES01225 = true +UCUS98634 = true +UCUS98755 = true # demo +NPUG80330 = true +NPHG00042 = true +NPUG98755 = true +NPEG90022 = true +UCES01378 = true +UCKS45131 = true +UCJS10103 = true +NPJG00038 = true + +[SplitFramebufferMargin] +# Killzone: Liberation (see issue #6207) +UCES00279 = true +UCKS45041 = true +UCUS98646 = true +UCET00278 = true +UCUS98670 = true +UCUS98646 = true + +[UseFFMPEGFindStreamInfo] +# The Warriors: Works around regression (#8991) by reverting to the old behavior +ULUS10213 = true +ULES00483 = true + +# G.I Joe The Rise of Cobra hang workaround (#12374) +ULUS10435 = true +ULES01277 = true + +[ForceLowerResolutionForEffectsOn] +# The water effect of DiRT 2 and Outrun doesn't work in higher resolutions. + +# Colin McRae's DiRT 2 - issue #13012 (water) +ULUS10471 = true +ULJM05533 = true +NPJH50006 = true +ULES01301 = true + +# Outrun 2006: Coast to Coast - issue #11358 (car reflections), #11928 (water) +ULES00262 = true +ULUS10064 = true +ULKS46087 = true + +# Burnout Dominator - lens flare effect (issue #11100) +# Some of the steps don't work at high resolution yet. +ULUS10236 = true +ULES00750 = true +ULJM05242 = true +ULJM05371 = true +NPJH50304 = true +ULES00703 = true +ULAS42095 = true + +# Need for Speed - Shift (same as Burnout Dominator) +ULUS10462 = true +ULES01275 = true +ULJM05494 = true +NPJH50143 = true +ULJM05738 = true + +# Motorstorm - See #16429 +UCES01250 = true +UCAS40266 = true +UCUS98743 = true +UCES01250 = true +UCKS45124 = true +UCJS10104 = true +NPJG00047 = true + +# Tiger Woods 06 - bloom during rain +ULUS10028 = true +ULES00153 = true +ULES00154 = true +ULJM05059 = true +ULAS42020 = true + +[ForceLowerResolutionForEffectsOff] +# Some games really don't work with this. Ratchet & Clank looks terrible. +UCUS98633 = true +UCAS40145 = true +UCES00420 = true +UCJS10052 = true +UCKS45048 = true +UCES00420 = true +UCJS18030 = true +UCJS18047 = true +NPJG00015 = true + +# The various Tantalus games will not work with this. + +# Cars Race-o-rama +ULUS10428 = true +ULES01333 = true + +# MX vs ATV Reflex +ULES01375 = true +ULUS10429 = true + +# MX vs ATV Untamed +ULUS10330 = true +ULES00993 = true +ULKS46176 = true + +# Spongebob: The Yellow Avenger +ULES00280 = true +ULUS10092 = true + +# Also, it's a really bad idea in Kurohyou. + +# Kurohyou: Ryu ga Gotoku Shinshou +ULJM05713 = true +NPJH50333 = true +ULAS42244 = true +UCKS45159 = true +ULJM08047 = true + +# Kurohyou 2: Ryu ga Gotoku Ashura Hen (Japan) +NPJH50562 = true +NPJH50333 = true + +[NearestFilteringOnFramebufferCreate] +# Ridge Racer speedometer dynamic CLUT problem - they rely on some palette entries +# from memory, and render to the rest of the palette. The palette entries loaded from memory +# must not be blurred by filtering, so nearest it is. See issue #8509 + +# Ridge Racer +ULJS00001 = true +ULUS10001 = true +UCKS45002 = true +UCES00002 = true +ULJS19002 = true +UCKS45053 = true +NPJH50140 = true + +# Ridge Racer 2 +ULJS00080 = true +UCKS45032 = true +UCES00422 = true +UCAS40273 = true +NPJH50366 = true + +[AllowDownloadCLUT] +# Temporary compatibility option, while working on the GPU CLUT-from-framebuffer path. +# Not required for any games now that it works, but might be useful for development. + +[SecondaryTextureCache] +# Was previously the "Retain changed textures" setting. +# See https://github.com/hrydgard/ppsspp/issues/16339#issuecomment-1304826656 + +# Popolocrois +UCJS10005 = true +UCAS40009 = true +ULUS10018 = true +UCJS18003 = true +ULES00291 = true +NPJG00033 = true + +# Fushigi no Dungeon: Fuurai no Shiren 4 Plus - Kami no Hitomi to Akuma no Heso +ULJS00547 = true +NPJH50698 = true + +[EnglishOrJapaneseOnly] +# Twinbee Portable, see issue #16382 +ULAS42089 = true +ULJM05221 = true +ULJM05323 = true + +[OldAdrenoPixelDepthRoundingGL] +# See #16015 + +# Naruto Shippuden: Ultimate Ninja Impact +ULUS10582 = true +ULES01537 = true +ULJS00390 = true +ULAS42297 = true +ULJS19071 = true +NPJH50435 = true +NPJH50435 = true + +# Kingdom Hearts - Birth By Sleep +ULES01441 = true +ULJM05600 = true +ULUS10505 = true +ULJM05775 = true # Final MIX +PSPJ30012 = true +UCAS40295 = true +UCKS45143 = true +UCAS40317 = true +UCAS40326 = true +UCKS45168 = true +ULJM06213 = true +ULJM06214 = true + +# Monster Hunter Portable 3rd +NPJB40001 = true +NPJH55800 = true +ULJM05800 = true +ULJM08058 = true + +# Persona 3 Portable +ULES01523 = true +ULUS10512 = true +UCAS40288 = true +ULJM05489 = true +UCKS45140 = true +ULJM08044 = true +NPJH50040 = true +UCKS45175 = true + +# Hack/Link +ULJS00266 = true +ULJS00279 = true +ULJS19058 = true + +# Midnight Club: LA Remix +ULUS10383 = true +ULES01144 = true +ULJS00180 = true +ULJS00267 = true +ULJM05904 = true +NPJH50440 = true + +# ModNation Racers +UCES01327 = true +UCUS98741 = true +UCAS40306 = true +UCJS10112 = true +NPJG00116 = true +NPUG70097 = true # Demo + +# Toca Race Driver 3 / DTM Race Driver 3 / V8 Supercars Shootout 3 +ULES00613 = true +ULES00615 = true +ULES00614 = true + +# Toca Race Driver 2 / DTM Race Driver 2 +ULES00040 = true +ULES00041 = true +ULJM05160 = true + +[ForceCircleButtonConfirm] +# Shining Ark, issue #15663 +NPJH50717 = true +ULJM06223 = true + +# Danball Senki, issue #17622 +ULJS00361 = true +# Danball Senki Boost +ULJM05990 = true + +# Shining Blade +NPJH50530 = true + +[DisallowFramebufferAtOffset] +# Little Big Planet, see #16030 +UCUS98744 = true +UCES01264 = true +UCJS10107 = true +NPJG00073 = true +UCAS40262 = true + +# WWE Smackdown vs RAW 2006 : See #13797 +ULES00227 = true +ULKS46057 = true +ULUS10050 = true + +# WWE Smackdown vs RAW 2007 +ULUS10199 = True +ULES00631 = True +ULJM05233 = True + +# Rainbow Six: Vegas: See #9324 +# Replaces a heuristic we added in #16971, which broke Castlevania - Symphony of the Night. +ULES00584 = true +ULUS10206 = true + +[RockmanDash2SoundFix] +# Rockman Dash 2, see #11442 +ULJM05037 = true +ULJM05216 = true +NPJH50181 = true + +[SoftwareRasterDepth] +# Midnight Club: LA Remix (see #18625) +ULUS10383 = true +ULES01144 = true +ULJS00180 = true +ULJS00267 = true +ULJM05904 = true +NPJH50440 = true + +# Syphon Filter - Dark Mirror (light flares, see #10229) +UCES00310 = true +UCUS98641 = true +UCUS98656 = true +UCUS98656 = true # Demo + +# Syphon Filter - Logan's Shadow (light flares, see #10229) +UCUS98606 = true +UCES00710 = true +NPUG80173 = true +NPUA80013 = true # Demo +UCUS98704 = true # Demo +NPEG90002 = true # Demo +SYPH04036 = true # Prototype? + +# Syphon Filter - Combat Ops (weird multiplayer-only variant) +NPUG80114 = true +NPEG00004 = true + +# Wipeout Pure (see #13344, sun lens flare) +UCUS98612 = true +UCJS10007 = true +UCES00001 = true +UCKS45008 = true +NPJG00059 = true + +# Resistance Retribution (needs testing) +UCES01184 = true +UCUS98668 = true +UCJP00174 = true + +# Armored Core: Silent Line (see #17597) +ULJM05552 = true +UCAS40289 = true +NPUH10025 = true +NPEH00047 = true + +[BlockTransferDepth] +# Iron Man - see issue #16530 +# Note that this option also requires IntraVRAMBlockTransferAllowCreateFB. +ULES01070 = true +ULES01071 = true +ULUS10347 = true + +# Hayate no Gotoku!! Nightmare Paradise - see issue #17878 +ULJM05416 = true + +[DaxterRotatedAnalogStick] +# Daxter (see issue #17015) +UCUS98618 = true +UCUS98654 = true +UCES00044 = true +NPUG80329 = true +NPEG00025 = true +UCKS45025 = true + +# GOW : Ghost of Sparta +UCUS98737 = true +UCAS40323 = true +NPHG00092 = true +NPEG00044 = true +NPEG00045 = true +NPJG00120 = true +NPUG80508 = true +UCJS10114 = true +UCES01401 = true +UCES01473 = true +# GOW : Ghost of Sparta Demo +NPJG90095 = true +NPEG90035 = true +NPUG70125 = true +# GOW : Chains Of Olympus +UCAS40198 = true +UCUS98653 = true +UCES00842 = true +ULJM05438 = true +ULJM05348 = true +UCKS45084 = true +NPUG80325 = true +NPEG00023 = true +NPHG00027 = true +NPHG00028 = true +NPJH50170 = true +UCET00844 = true +# GOW: Chains of Olympus Demo +UCUS98705 = true +UCED00971 = true +UCUS98713 = true + +[SOCOMClut8Replacement] +# SOCOM and other games use CLUT8 with crafty sampling as if it was CLUT16. Issue #16210 +UCES00855 = true +UCUS98649 = true +NPUG70003 = true # demo +UCUS98714 = true # demo + +# SOCOM Fireteam Bravo 3 +UCES01242 = true +NPHG00032 = true +UCUS98716 = true +NPEG90024 = true # demo + +# SOCOM Navy Seals Portable (Japanese version) +UCJS10102 = true +NPJG00035 = true +NPJG90068 = true # demo + +[Fontltn12Hack] +# optimumFont do not return ltn12.pgf see #11055 +NPJH00052 = true + +[LoadCLUTFromCurrentFrameOnly] +# Helps Syphon Filter: Logan's Shadow color issue, # where we accidentally load a CLUT from an outdated framebuffer. +# Perhaps this should be the default. +UCUS98606 = true +UCES00710 = true +NPUG80173 = true +NPUA80013 = true # Demo +UCUS98704 = true # Demo +NPEG90002 = true # Demo +SYPH04036 = true # Prototype? + +[ForceUMDReadSpeed] +# Aces of War required slow read speed (even in Real PSP), see #11062 +ULES00590 = true +ULJM05075 = true +# Sengoku Musou 3Z Special DLC see #9993 +ULJM06024 = true + +# Bejeweled 2. This shouldn't really fix anything since it's a PSN game that didn't run from UMD, +# but apparently it does work around the timing error. See issue #15304 . +NPUG30038 = true +NPEG00036 = true + +# Doko Demo Issho, load savedata error see #18420 +UCJS10002 = true +UCJS18002 = true + +# Driver 76, see #16904 #12054 +ULUS10235 = true +ULES00740 = true + +# Harukanaru Toki no Naka de 3 with Izayoiki Aizouban, see #6127 +ULJM05441 = true +KOEIP0167 = true +ULJM06245 = true + +# Ace Combat: Joint Assault #12434 +ULUS10511 = true +ULES01408 = true + +# Ace Combat X2: Joint Assault #5545 +ULJS00290 = true +ULKS46254 = true +ULJS19057 = true +NPJH50263 = true + +# Tales of the World: Radiant Mythology 2 - #19196 +ULJS00175 = true +UCAS40244 = true +UCKS45110 = true +ULJS19044 = true +NPJH50852 = true + +# Crash of the Titans - #12510 +ULES00915 = true +ULES00916 = true +ULES00917 = true +ULES00918 = true +ULUS10304 = true + +[TacticsOgreEliminateDebugReadback] +ULUS10565 = true +ULES01500 = true +ULJM05753 = true +NPJH50348 = true +ULJM06009 = true +UCKS45164 = true + +[DisableMemcpySlicing] +UCES01184 = true +UCUS98668 = true +UCJP00174 = true diff --git a/src/BizHawk.Emulation.Cores/Resources/ppsspp_compatvr.ini b/src/BizHawk.Emulation.Cores/Resources/ppsspp_compatvr.ini new file mode 100644 index 00000000000..e05251c5a5c --- /dev/null +++ b/src/BizHawk.Emulation.Cores/Resources/ppsspp_compatvr.ini @@ -0,0 +1,1376 @@ +# ======================================================================================== +# compatvr.ini for PPSSPP +# ======================================================================================== +# +# This file is not meant to be user-editable, although is kept as a separate ini +# file instead of compiled into the code for debugging purposes. +# +# The uses cases are strict: +# * Enable fixes for things we can't reasonably emulate without completely ruining +# performance for other games, such as the screen copies in Dangan Ronpa +# * Disabling accuracy features like 16-bit depth rounding, when we can't seem to +# implement them at all in a 100% compatible way +# * Emergency game-specific compatibility fixes before releases, such as the GTA +# music problem where every attempted fix has reduced compatibility with other games +# * Enable "unsafe" performance optimizations that some games can tolerate and +# others cannot. We do not currently have any of those. +# * This file is only for VR (virtual reality). For non-VR purposes, use compat.ini. +# +# This functionality should NOT be used for any of the following: +# * Cheats +# * Fun hacks, like enlarged heads or whatever +# * Fixing general compatibility issues. First try to find a general solution. Try hard. +# +# Game IDs can be looked up at GameFAQs, for example: +# http://www.gamefaqs.com/psp/925776-grand-theft-auto-liberty-city-stories/data +# Sometimes the information may be incomplete though. +# +# ======================================================================================== +# Issue numbers refer to issues on https://github.com/hrydgard/ppsspp/issues +# ======================================================================================== + + +[ForceFlatScreen] +# Forces flat screen rendering in games which don't work in VR. + +# Madden NFL 06 +ULES00147 = true +ULUS10024 = true + +# Madden NFL 07 +ULUS10117 = true + +# Madden NFL 08 +ULES00867 = true +ULUS10275 = true + +# Madden NFL 09 +ULES01093 = true +ULUS10352 = true + +# Madden NFL 10 +NPEH00010 = true +ULUS10441 = true + +# Madden NFL 11 +ULJM05757 = true +ULUS10541 = true + +# Madden NFL 12 +ULUS10581 = true + +# Red Bull X-Fighters +NPEZ00100 = true +NPUZ00048 = true + + +[ForceMono] +# Forces disabled stereo as the game rendering cannot be called twice + +# MotorStorm: Arctic Edge +NPJG00047 = true +UCAS40266 = true +UCES01250 = true +UCJS10104 = true +UCKS45124 = true +UCUS98743 = true + +# Ultimate Ghosts 'n Goblins +NPJH50235 = true +UCKS45037 = true +ULJM05147 = true +ULES00419 = true +ULUS10105 = true + + +[IdentityViewHack] +# Disables head tracking for render passes where view matrix is identity + +# Sonic Rivals 1 +ULES00622 = true +ULUS10195 = true + +# Sonic Rivals 2 +ULES00940 = true +ULUS10323 = true + + +[MirroringVariant] +# Forces mirroring of the view matrix + +# Shadow of Destiny / Shadow of Memories +NPJH50036 = 3 +ULUS10459 = 3 +VP051J1 = 3 + +# Tony Hawk's Underground 2 Remix +ULES00033 = 3 +ULES00034 = 3 +ULES00035 = 3 +ULUS10014 = 3 + + +[ProjectionHack] +# Forces ignoring of projection matrix pivot point. + +# Gran Turismo: The Real Driving Simulator +NPJG00027 = true +UCAS40265 = true +UCES01245 = true +UCJS10100 = true +UCUS98632 = true + + +[Skyplane] +# Workaround to remove the background skyplane and add clearing framebuffer with a fog color. + +# Grand Theft Auto: Liberty City Stories +NPJH50825 = true +ULES00051 = true +ULES00151 = true +ULES00181 = true +ULES00182 = true +ULJM05255 = true +ULJM05359 = true +ULJM05885 = true +ULUS10041 = true +# Sindacco Chronicles total conversion +ULUS01826 = true + +# Grand Theft Auto: Vice City Stories +NPJH50827 = true +ULES00502 = true +ULES00503 = true +ULJM05297 = true +ULJM05395 = true +ULJM05884 = true +ULUS10160 = true + + +[UnitsPerMeter] +# Scale of game world to convert the world units into meters. This enables following VR features: +# + 3D stereoscopy (that can work only with accurate values) +# * 6DoF motion tracking (that can work with inaccurate values) + +# cube.elf +ELF000000 = 10.0 + +# 300: March to Glory +ULES00766 = 0.95 +ULUS10241 = 0.95 + +# 50 Cent: Bulletproof G Unit Edition +ULES00451 = 1.0 +ULES00452 = 1.0 +ULUS10128 = 1.0 + +# 7 Wonders of the Ancient World +ULES01037 = 1.0 +ULUS10227 = 1.0 + +# Ace Combat X: Skies of Deception +UCAS40120 = 1.0 +UCAS40169 = 1.0 +UCES00423 = 1.0 +UCKS45038 = 1.0 +UCKS45067 = 1.0 +ULJS00086 = 1.0 +ULJS19018 = 1.0 +ULUS10176 = 1.0 + +# Activision Hits Remixed +ULES00640 = 1.0 +ULUS10186 = 1.0 + +# Age of Zombies +NPEZ00044 = 1.0 +NPUZ00024 = 1.0 + +# Alien Syndrome +ULES00772 = 1.0 +ULUS10245 = 1.0 + +# Ape Escape Academy +NPJG00048 = 100.0 +UCAS40007 = 100.0 +UCES00010 = 100.0 +UCJS10003 = 100.0 +UCJS18007 = 100.0 +UCJS18043 = 100.0 +UCUS98619 = 100.0 + +# Ape Escape Academy 2 +NPJG00049 = 100.0 +UCAS40041 = 100.0 +UCAS40052 = 100.0 +UCAS40123 = 100.0 +UCES00302 = 100.0 +UCJS10020 = 100.0 +UCJS18009 = 100.0 +UCKS45024 = 100.0 + +# Archer Maclean's Mercury +UCAS40021 = 10.0 +UCJS10011 = 10.0 +UCKS45007 = 10.0 +ULES00011 = 10.0 +ULUS10017 = 10.0 + +# Army of Two: The 40th Day +NPEH90028 = 128.0 +NPUH90067 = 128.0 +ULAS42215 = 128.0 +ULES01381 = 128.0 +ULJM05643 = 128.0 +ULJM05849 = 128.0 +ULUS10472 = 128.0 + +# Armored Core 3 Portable +NPEH00045 = 1.0 +NPUH10023 = 1.0 +UCAS40268 = 1.0 +ULJM05492 = 1.0 +ULKS46210 = 1.0 + +# Armored Core: Formula Front - Extreme Battle +NPJH50041 = 1.0 +UCAS40004 = 1.0 +UCAS40036 = 1.0 +ULES00219 = 1.0 +ULJS00003 = 1.0 +ULJS19001 = 1.0 +ULKS46003 = 1.0 +ULUS10034 = 1.0 + +# Armored Core: Last Raven Portable +NPEH00046 = 1.0 +NPUH10024 = 1.0 +ULJM05611 = 1.0 +UCAS40302 = 1.0 +UCKS45148 = 1.0 + +# Assassin's Creed: Bloodlines +NPEH00029 = 1.0 +NPUH10032 = 1.0 +ULES01367 = 1.0 +ULKS46231 = 1.0 +ULJM05571 = 1.0 +ULJM05720 = 1.0 +ULUS10455 = 1.0 + +# Astonishia Story +ULES00363 = 1.0 +ULJM05176 = 1.0 +ULKS46021 = 1.0 +ULUS10083 = 1.0 + +# Atari Classics Evolved +ULUS10325 = 1.0 + +# ATV Offroad Fury Pro +UCES00786 = 1.0 +UCUS98648 = 1.0 +UCUS98681 = 1.0 + +# Audition Portable +ULKS46122 = 32.0 + +# B-Boy +UCED00432 = 1.0 +UCES00249 = 1.0 +ULUS10363 = 1.0 + +# Battle Poker +NPUZ00020 = 1.0 + +# BattleZone +ULES00522 = 1.0 +ULET00456 = 1.0 +ULUS10156 = 1.0 + +# Beam 'em up +NPEZ00081 = 1.0 + +# Beaterator +ULES01023 = 1.0 +ULUS10405 = 1.0 + +# Beats +NPEG00001 = 1.0 +NPHG00002 = 1.0 +NPJG00001 = 1.0 +NPUG80060 = 1.0 + +# Big head snooker +NPEZ00104 = 1.0 + +# Black Rock Shooter: The Game +JRPG00001 = 80.0 +JRPG00002 = 80.0 +NPEH00138 = 80.0 +NPJH50448 = 80.0 +NPUH10126 = 80.0 +ULJM05859 = 80.0 + +# Blast Off +NPEZ00041 = 1.0 +NPUZ00021 = 1.0 + +# BlazBlue: Calamity Trigger Portable +NPJH50180 = 1.0 +UCAS40299 = 1.0 +ULJM05613 = 1.0 +ULJM05970 = 1.0 +ULUS10519 = 1.0 + +# BlazBlue: Continuum Shift II +NPJH50401 = 1.0 +UCKS45170 = 1.0 +ULES01526 = 1.0 +ULJM05850 = 1.0 +ULUS10579 = 1.0 + +# Bleach: Heat the Soul 1 +UCAS40011 = 1.0 +UCJS18005 = 1.0 +UCJS10008 = 1.0 + +# Bleach: Heat the Soul 2 +UCAS40024 = 0.98 +UCAS40130 = 0.98 +UCJS18010 = 0.98 +UCJS10017 = 0.98 + +# Bleach: Heat the Soul 3 +UCAS40098 = 0.96 +UCAS40177 = 0.96 +UCJS10042 = 0.96 +UCJS18015 = 0.96 + +# Bleach: Heat the Soul 4 +UCAS40149 = 0.96 +UCAS40216 = 0.96 +UCJS10057 = 0.96 +UCJS18025 = 0.96 + +# Bleach: Heat the Soul 5 +UCAS40210 = 0.96 +UCJS10082 = 0.96 +UCJS18033 = 0.96 + +# Bleach: Heat the Soul 6 +NPJG00021 = 0.96 +UCAS40258 = 0.96 +UCAS40308 = 0.96 +UCJS10093 = 0.96 +UCJS18039 = 0.96 + +# Bleach: Heat the Soul 7 +NPJG00114 = 0.96 +UCAS40314 = 0.96 +UCJS10110 = 0.96 +UCJS18057 = 0.96 +UCKS45158 = 0.96 + +# Bleach: Soul Carnival 1 +NPJG00008 = 1.0 +UCAS40227 = 1.0 +UCAS40234 = 1.0 +UCAS40296 = 1.0 +UCJS10085 = 1.0 +UCJS18038 = 1.0 +UCKS45102 = 1.0 +ULJS10085 = 1.0 + +# Bleach: Soul Carnival 2 +NPJG00070 = 1.0 +UCJS10106 = 1.0 +UCAS40291 = 1.0 +UCAS40297 = 1.0 + +# Bloons +NPEZ00045 = 1.0 +NPUZ00010 = 1.0 + +# Bomberman Land Portable +NPJH50142 = 10.0 +ULAS42097 = 10.0 +ULES00959 = 10.0 +ULJM05181 = 10.0 +ULJM05319 = 10.0 +ULUS10319 = 10.0 + +# Bowling 3D +NPUZ00002 = 1.0 + +# Brain Challenge +NPEH00003 = 30.0 +NPJH00002 = 30.0 +NPUH10006 = 30.0 + +# BreakQuest +NPEZ00011 = 1.0 +NPUZ00031 = 1.0 + +# Bubble Trubble +NPEZ00023 = 1.0 +NPUZ00007 = 1.0 + +# Burnout Legends +ULES00125 = 2.0 +ULUS10025 = 2.0 +ULJM05228 = 2.0 +NPJH50305 = 2.0 +ULJM05049 = 2.0 +ULKS46027 = 2.0 +ULAS42019 = 2.0 + +# Bust-A-Move Deluxe +NPJH50087 = 1.0 +ULES00233 = 1.0 +ULUS10057 = 1.0 +ULJM05116 = 1.0 + +# Cabela's African Safari +ULUS10175 = 1.0 + +# Call of Duty: Roads to Victory +ULES00643 = 1.05 +ULES00644 = 1.05 +ULUS10218 = 1.05 + +# Capcom Classics Collection Reloaded +ULAS42072 = 1.0 +ULES00377 = 1.0 +ULJM05104 = 1.0 +ULJM05280 = 1.0 +ULUS10134 = 1.0 + +# Castlevania: The Dracula X Chronicles +NPJH50028 = 100.0 +ULES00841 = 100.0 +ULJM05287 = 100.0 +ULKS46155 = 100.0 +ULUS10277 = 100.0 + +# Championship Manager +ULES00174 = 1.0 + +# Charge! Tank Squad +NPEX00005 = 1.0 +NPJG00103 = 1.0 +NPUX80433 = 1.0 + +# Chessmaster: The Art of Learning +ULES01013 = 1.0 +ULUS10335 = 1.0 + +# Circles, Circles, Circles +NPEZ00007 = 1.0 +NPUZ00028 = 1.0 + +# Coded Arms: Contagion +ULAS42099 = 1.0 +ULES00718 = 1.0 +ULJM05243 = 1.0 +ULKS46139 = 1.0 +ULUS10184 = 1.0 + +# Coded Soul: Uketsugareshi Idea +NPJG00043 = 9.5 +UCAS40180 = 9.5 +UCJS10061 = 9.5 +UCKS45071 = 9.5 + +# Crash Tag Team Racing +ULES00168 = 1.0 +ULES00169 = 1.0 +ULES00170 = 1.0 +ULES00171 = 1.0 +ULES00172 = 1.0 +ULJM05036 = 1.0 +ULUS10044 = 1.0 + +# Crazy Taxi: Fare Wars +NPJH50490 = 10.0 +ULES00811 = 10.0 +ULJM05340 = 10.0 +ULUS10273 = 10.0 + +# Creature Defense +NPEH00027 = 1.0 +NPJH00006 = 1.0 +NPUH10034 = 1.0 + +# Crimson Gem Saga +UCAS40212 = 1.0 +ULJM05369 = 1.0 +ULKS46142 = 1.0 +ULUS10400 = 1.0 + +# Crimson Room Reverse +NPJH50046 = 32.0 +NPUH10037 = 32.0 +ULJM05408 = 32.0 + +# Crisis Core: Final Fantasy VII +UCAS40167 = 100.0 +UCAS40204 = 100.0 +UCAS40272 = 100.0 +UCKS45052 = 100.0 +ULES01044 = 100.0 +ULES01045 = 100.0 +ULES01046 = 100.0 +ULES01047 = 100.0 +ULJM05254 = 100.0 +ULJM05275 = 100.0 +ULJM05517 = 100.0 +ULUS10336 = 100.0 + +# Crush +ULES00765 = 1.0 +ULUS10238 = 1.0 + +# Crystal Defenders +NPEH00017 = 1.0 +NPJH00005 = 1.0 +NPJH90066 = 1.0 +NPUH10026 = 1.0 +NPUH90048 = 1.0 + +# Cube +ULES00722 = 10.0 +ULJS00108 = 10.0 +ULUS10223 = 10.0 + +# Cubixx +NPEZ00101 = 1.0 +NPUZ00080 = 1.0 + +# D-Cube Planet +NPEZ00008 = 20.0 +NPUZ00027 = 20.0 + +# Dangan-Ronpa +NPJH50515 = 8.0 +ULJS00337 = 8.0 +ULJS00438 = 8.0 +ULJS19060 = 8.0 + +# Daxter +NPEG00025 = 2.0 +UCES00044 = 2.0 +UCKS45025 = 2.0 +UCUS98618 = 2.0 +UCUS98654 = 2.0 + +# Dead or Alive Paradise +NPEH00038 = 0.8 +NPJH50239 = 0.8 +ULES01416 = 0.8 +ULES01431 = 0.8 +ULJM05640 = 0.8 +ULJM08046 = 0.8 +ULKS46246 = 0.8 +ULUS10521 = 0.8 + +# Death Jr. +ULES00144 = 1.0 +ULUS10027 = 1.0 + +# Deflector +NPEZ00127 = 1.0 +NPUZ00040 = 1.0 + +# Diamond and the Sound of a Gunshot +UCJS10092 = 1.0 +UCKS45120 = 1.0 + +# Dissidia 012: Duodecim Final Fantasy +NPJH50377 = 1.0 +UCAS40333 = 1.0 +UCAS40329 = 1.0 +UCAS40335 = 1.0 +UCKS45166 = 1.0 +ULES01505 = 1.0 +ULJM05814 = 1.0 +ULJM06121 = 1.0 +ULUS10566 = 1.0 + +# Dissidia: Final Fantasy +NPEH90014 = 1.0 +NPJH50065 = 1.0 +NPJH50330 = 1.0 +NPUH90029 = 1.0 +UCAS40322 = 1.0 +ULES01270 = 1.0 +ULJM05262 = 1.0 +ULJM05405 = 1.0 +ULJM05550 = 1.0 +ULJM05760 = 1.0 +ULJM05761 = 1.0 +ULUS10437 = 1.0 + +# Disney G-Force +ULES01238 = 1.0 +ULES01239 = 1.0 +ULES01240 = 1.0 +ULUS10439 = 1.0 + +# Disney Hannah Montana: Rock Out the Show +ULES01303 = 1.0 +ULUS10431 = 1.0 + +# Disney/Pixar Cars +UCKS45018 = 1.0 +ULES00319 = 1.0 +ULES00320 = 1.0 +ULES00321 = 1.0 +ULES00322 = 1.0 +ULES00323 = 1.0 +ULES00324 = 1.0 +ULES00325 = 1.0 +ULES00326 = 1.0 +ULES00327 = 1.0 +ULJM05149 = 1.0 +ULUS10073 = 1.0 + +# Disney/Pixar Ratatouille +UCKS45050 = 10.0 +ULES00734 = 10.0 +ULES00735 = 10.0 +ULES00736 = 10.0 +ULES00737 = 10.0 +ULES00738 = 10.0 +ULES00741 = 10.0 +ULES00742 = 10.0 +ULES00743 = 10.0 +ULES00744 = 10.0 +ULES00745 = 10.0 +ULES00746 = 10.0 +ULES00747 = 10.0 +ULES00748 = 10.0 +ULES00749 = 10.0 +ULUS10247 = 10.0 + +# DJ Max Fever +NPEH00030 = 1.0 +ULUS10403 = 1.0 + +# DJ Max Portable 2 +ULKS46116 = 1.0 + +# DJ Max Portable 3 +NPJH50471 = 1.0 +ULKS46236 = 1.0 +ULJM05836 = 1.0 +ULJM06033 = 1.0 +ULUS10538 = 1.0 + +# DJ Max Portable: Black Square +NPJH50559 = 1.0 +ULJM06034 = 1.0 +ULKS46189 = 1.0 + +# DJ Max Portable: Clazziquai Edition +ULKS46190 = 1.0 +ULKS46191 = 1.0 + +# DJ Max Portable Hot Tunes +ULKS46240 = 1.0 + +# DreamWorks Shrek the Third +ULES00812 = 0.5 +ULES00813 = 0.5 +ULKS46141 = 0.5 +ULUS10248 = 0.5 + +# Dynasty Warriors +NPJH50030 = 0.1 +ULES00026 = 0.1 +ULES00118 = 0.1 +ULES00119 = 0.1 +ULJM05003 = 0.1 +ULJM08008 = 0.1 +ULJM08017 = 0.1 +ULKS46012 = 0.1 +ULUS10004 = 0.1 + +# Eragon +ULES00474 = 0.1 +ULES00475 = 0.1 +ULUS10146 = 0.1 + +# Evangelion Shin Gekijoban: 3nd Impact +ULAS42293 = 1.0 +ULJS00408 = 1.0 +NPJH50457 = 1.0 + +# F1 Grand Prix +UCAS40026 = 0.1 +UCES00004 = 0.1 +UCJS10019 = 0.1 + +# Family Guy +ULES00567 = 1.0 +ULES00601 = 1.0 +ULUS10185 = 1.0 + +# Fat Princess: Fistful of Cake +NPHG00025 = 80.0 +NPJG00045 = 80.0 +UCAS40285 = 80.0 +UCES01312 = 80.0 +UCKS45137 = 80.0 +UCUS98740 = 80.0 + +# Final Fantasy I +NPJH50406 = 6.8 +UCAS40146 = 6.8 +UCKS45056 = 6.8 +ULES00986 = 6.8 +ULJM05241 = 6.8 +ULJM05514 = 6.8 +ULUS10251 = 6.8 + +# Final Fantasy II +NPJH50407 = 1.0 +UCAS40152 = 1.0 +ULJM05245 = 1.0 +ULJM05515 = 1.0 +ULES00987 = 1.0 +ULUS10263 = 1.0 + +# Final Fantasy III +NPEH00134 = 8.0 +NPHH00351 = 8.0 +NPJH50626 = 8.0 +NPUH10125 = 8.0 +ULJM06133 = 8.0 + +# Final Fantasy IV +NPJH50414 = 1.0 +UCAS40334 = 1.0 +UCAS40342 = 1.0 +ULES01521 = 1.0 +ULJM05855 = 1.0 +ULJM06122 = 1.0 +ULUS10560 = 1.0 + +# Final Fantasy Tactics: The War of the Lions +NPJH50408 = 1.0 +UCAS40148 = 1.0 +ULES00850 = 1.0 +ULJM05194 = 1.0 +ULJM05516 = 1.0 +ULUS10297 = 1.0 + +# Final Fantasy Type-0 +NPJH50443 = 100.0 +NPJH50444 = 100.0 +UCAS40346 = 100.0 +ULJM05900 = 100.0 +ULJM06217 = 100.0 + +# flOw +NPEG00003 = 1000.0 +NPJG00004 = 1000.0 +NPUG80086 = 1000.0 + +# Free Running +ULES00704 = 1.0 + +# Ghost in the Shell: Stand Alone Complex +UCAS40025 = 83.0 +UCJS10018 = 83.0 +ULES00135 = 83.0 +ULES00153 = 83.0 +ULUS10020 = 83.0 + +# Ghostbusters: The Video Game +UCES01276 = 3.28 +ULUS10485 = 3.28 +ULUS10486 = 3.28 + +# Gitaroo Man Lives! +NPJH50035 = 50.0 +ULES00383 = 50.0 +ULJM05130 = 50.0 +ULKS46071 = 50.0 +ULUS10207 = 50.0 + +# Gods Eater Burst +NPJH50352 = 100.0 +ULES01519 = 100.0 +ULJS00350 = 100.0 +ULJS00351 = 100.0 +ULJS19056 = 100.0 +ULJS19081 = 100.0 +ULKS46263 = 100.0 +ULUS10563 = 100.0 + +# God of War: Ghost of Sparta +NPEG00044 = 1.0 +NPHG00092 = 1.0 +NPJG00120 = 1.0 +UCAS40323 = 1.0 +UCES01401 = 1.0 +UCES01473 = 1.0 +UCJS10114 = 1.0 +UCKS45161 = 1.0 +UCUS98737 = 1.0 + +# God of War: Chains of Olympus +NPEG00023 = 1.0 +NPUG80325 = 1.0 +UCAS40191 = 1.0 +UCAS40198 = 1.0 +UCED00970 = 1.0 +UCED00971 = 1.0 +UCES00842 = 1.0 +ULJM05348 = 1.0 +UCKS45084 = 1.0 +UCUS98653 = 1.0 +UCUS98705 = 1.0 +UCUS98713 = 1.0 + +# Gran Turismo: The Real Driving Simulator +NPJG00027 = 1.0 +UCAS40265 = 1.0 +UCES01245 = 1.0 +UCJS10100 = 1.0 +UCUS98632 = 1.0 + +# Grand Theft Auto: Chinatown Wars +NPJH00138 = 1.0 +ULES01347 = 1.0 +ULJM05604 = 1.0 +ULUS10490 = 1.0 + +# Grand Theft Auto: Liberty City Stories +NPJH50825 = 0.5 +ULES00051 = 0.5 +ULES00151 = 0.5 +ULES00181 = 0.5 +ULES00182 = 0.5 +ULJM05255 = 0.5 +ULJM05359 = 0.5 +ULJM05885 = 0.5 +ULUS10041 = 0.5 +# Sindacco Chronicles total conversion +ULUS01826 = 0.5 + +# Grand Theft Auto: Vice City Stories +NPJH50827 = 1.0 +ULES00502 = 1.0 +ULES00503 = 1.0 +ULJM05297 = 1.0 +ULJM05395 = 1.0 +ULJM05884 = 1.0 +ULUS10160 = 1.0 + +# Gun Showdown +ULES00484 = 1.0 +ULUS10158 = 1.0 + +# Gungnir +NPEH00135 = 1.0 +NPJH50397 = 1.0 +ULJM05779 = 1.0 +ULUS10592 = 1.0 + +# Harry Potter and the Goblet of Fire +ULES00210 = 1.0 +ULES00214 = 1.0 +ULES00215 = 1.0 +ULES00216 = 1.0 +ULUS10032 = 1.0 + +# Hatsune Miku: Project Diva +NPJH50494 = 3.6 +UCKS45123 = 3.6 +ULAS42163 = 3.6 +ULJM05472 = 3.6 +ULJM05682 = 3.6 + +# Hatsune Miku: Project Diva 2nd +NPJH50475 = 4.0 +ULJM05681 = 4.0 +ULJM05952 = 4.0 + +# Indiana Jones and the Staff of Kings +ULES00939 = 1.0 +ULUS10316 = 1.0 + +# Iron Man 2 +ULES01422 = 1.000999 +ULUS10497 = 1.000999 + +# James Cameron's Avatar: The Game +NPEH00031 = 1.0 +ULES01357 = 1.0 +ULUS10451 = 1.0 + +# Jeanne d'Arc +NPJG00032 = 7.0 +UCAS40129 = 7.0 +UCJS10048 = 7.0 +UCJS18014 = 7.0 +UCJX90019 = 7.0 +UCKS45033 = 7.0 +UCUS98700 = 7.0 +UCUS98706 = 7.0 +ULAS40129 = 7.0 + +# Kingdom Hearts: Birth by Sleep +UCAS40295 = 1.0 +UCAS40317 = 1.0 +UCAS40326 = 1.0 +UCKS45143 = 1.0 +UCKS45168 = 1.0 +ULES01441 = 1.0 +ULJM05600 = 1.0 +ULJM05775 = 1.0 +ULJM06213 = 1.0 +ULJM06214 = 1.0 +ULUS10505 = 1.0 + +# Kingdom of Paradise 1 +UCAS40018 = 9.0 +UCAS40023 = 9.0 +UCAS40089 = 9.0 +UCES00178 = 9.0 +UCET00247 = 9.0 +UCJM95402 = 9.0 +UCJS10010 = 9.0 +UCKS45011 = 9.0 +UCUS98623 = 9.0 + +# Kingdom of Paradise 2 +UCAS40116 = 9.0 +UCAS40156 = 9.0 +UCJS10047 = 9.0 +UCKS45034 = 9.0 + +# LEGO Batman: The Videogame +NPUH90019 = 1.0 +ULES01151 = 1.0 +ULUS10380 = 1.0 + +# LEGO Indiana Jones 1: The Original Adventures +ULES01086 = 47.0 +ULUS10365 = 47.0 + +# LEGO Indiana Jones 2: The Adventure Continues +ULES01370 = 47.0 +ULUS10487 = 47.0 + +# LEGO Star Wars II: The Original Trilogy +ULES00479 = 1.0 +ULUS10155 = 1.0 + +# LEGO Star Wars III: The Clone Wars +ULES01446 = 3.0 +ULUS10531 = 3.0 + +# Lemmings +NPJG00058 = 5.0 +UCAS40076 = 5.0 +UCES00109 = 5.0 +UCET00179 = 5.0 +UCJS10028 = 5.0 +UCUS98647 = 5.0 +UCUS98671 = 5.0 + +# LocoRoco +NPJG00057 = 1.0 +UCAS40063 = 1.0 +UCAS40157 = 1.0 +UCED90007 = 1.0 +UCES00304 = 1.0 +UCET00357 = 1.0 +UCJB98011 = 1.0 +UCJS10041 = 1.0 +UCJS18041 = 1.0 +UCKS45020 = 1.0 +UCKS45055 = 1.0 +UCUS98662 = 1.0 + +# Macross Ace Frontier +ULJS00158 = 1.0 +ULJS19029 = 1.0 + +# Me & My Katamari +NPJH50141 = 1.0 +UCAS40049 = 1.0 +UCKS45022 = 1.0 +ULAS40155 = 1.0 +ULES00339 = 1.0 +ULJS00033 = 1.0 +ULJS19009 = 1.0 +ULUS10094 = 1.0 + +# Mega Man Powered Up +NPJH50183 = 10.0 +UCAS40208 = 10.0 +ULAS42050 = 10.0 +ULAS42052 = 10.0 +ULES00307 = 10.0 +ULJM05044 = 10.0 +ULJM05391 = 10.0 +ULUS10091 = 10.0 + +# Metal Gear Acid 1 +ULAS42007 = 1000.0 +ULES00008 = 1000.0 +ULJM05001 = 1000.0 +ULJM08001 = 1000.0 +ULUS10006 = 1000.0 + +# Metal Gear Acid 2 +ULAS42035 = 930.0 +ULES00284 = 930.0 +ULJM05047 = 930.0 +ULJM08011 = 930.0 +ULKS46065 = 930.0 +ULUS10077 = 930.0 + +# Metal Gear Solid: Peace Walker +NPEH90023 = 1000.0 +NPJH50045 = 1000.0 +ULES01372 = 1000.0 +ULJM05630 = 1000.0 +ULJM08038 = 1000.0 +ULKS46239 = 1000.0 +ULUS10509 = 1000.0 + +# Metal Gear Solid: Portable Ops +NPJH50112 = 970.0 +ULAS42087 = 970.0 +ULES00645 = 970.0 +ULJM05193 = 970.0 +ULJM05227 = 970.0 +ULJM05256 = 970.0 +ULJM05284 = 970.0 +ULJM05573 = 970.0 +ULJM08016 = 970.0 +ULKS46119 = 970.0 +ULUS10202 = 970.0 + +# Monopoly +NPEZ00118 = 70.0 +NPUZ00033 = 70.0 + +# Monster Hunter Freedom 2 +ULAS42110 = 100.0 +ULES00851 = 100.0 +ULJM05156 = 100.0 +ULKS46152 = 100.0 +ULUS10266 = 100.0 + +# Monster Hunter Freedom Unite +NPEH90011 = 100.0 +NPJH50244 = 100.0 +ULAS42093 = 100.0 +ULES01213 = 100.0 +ULJM05500 = 100.0 +ULJM08019 = 100.0 +ULJM08053 = 100.0 +ULKS46177 = 100.0 +ULKS46202 = 100.0 +ULUS10391 = 100.0 +ULUS90003 = 100.0 + +# Monster Hunter Portable 3rd +NPJB40001 = 100.0 +NPJH55800 = 100.0 +ULJM05800 = 100.0 +ULJM08058 = 100.0 + +# Nayuta no Kiseki +NPJH50625 = 1.0 +ULJM06113 = 1.0 +ULJM08069 = 1.0 + +# OutRun 2006: Coast 2 Coast +ULES00262 = 10.0 +ULKS46087 = 10.0 +ULUS10064 = 10.0 + +# Patapon 1 +NPJG00054 = 80.0 +UCAS40193 = 80.0 +UCAS40221 = 80.0 +UCES00995 = 80.0 +UCJS10077 = 80.0 +UCJS18027 = 80.0 +UCJS18042 = 80.0 +UCKS45076 = 80.0 +UCUS98711 = 80.0 +UCUS98717 = 80.0 + +# Patapon 2 +NPJG00010 = 80.0 +NPUG98732 = 80.0 +UCAS40232 = 80.0 +UCAS40239 = 80.0 +UCAS40292 = 80.0 +UCES01177 = 80.0 +UCJS10089 = 80.0 +UCJS18036 = 80.0 +UCJS18053 = 80.0 +UCUS98732 = 80.0 + +# Patapon 3 +NPJG00122 = 100.0 +UCAS40318 = 100.0 +UCES01421 = 100.0 +UCJS10113 = 100.0 +UCJS18048 = 100.0 +UCJS18059 = 100.0 +UCKS45169 = 100.0 +UCUS98751 = 100.0 + +# Petz: Dogz Family +ULUS10463 = 3.28 + +# Prince of Persia Revelations +ULES00223 = 1.0 +ULUS10063 = 1.0 + +# Ratchet & Clank: Size Matters +NPJG00015 = 1.0 +UCAS40145 = 1.0 +UCES00420 = 1.0 +UCJS10052 = 1.0 +UCJS18030 = 1.0 +UCJS18047 = 1.0 +UCKS45048 = 1.0 +UCUS98633 = 1.0 + +# Ridge Racer 2 +NPJH50366 = 1000.0 +UCAS40113 = 1000.0 +UCAS40119 = 1000.0 +UCAS40273 = 1000.0 +UCES00422 = 1000.0 +UCKS45032 = 1000.0 +ULJS00080 = 1000.0 + +# Sega Rally Revo +ULAS42119 = 1.0 +ULES00910 = 1.0 +ULET00919 = 1.0 +ULJM05302 = 1.0 +ULJM05417 = 1.0 +ULUS10311 = 1.0 + +# Shin Megami Tensei: Persona 3 Portable +NPJH50040 = 1.0 +UCAS40288 = 1.0 +UCKS45140 = 1.0 +UCKS45175 = 1.0 +ULES01523 = 1.0 +ULJM05489 = 1.0 +ULJM08044 = 1.0 +ULUS10512 = 1.0 + +# Silent Hill: Origins +NPJH50051 = 1.0 +ULAS42117 = 1.0 +ULES00869 = 1.0 +ULJM05281 = 1.0 +ULKS46161 = 1.0 +ULUS10285 = 1.0 + +# Silent Hill: Shattered Memories +NPJH50148 = 1.0 +ULAS42189 = 1.0 +ULES01352 = 1.0 +ULJM05564 = 1.0 +ULJM05828 = 1.0 +ULUS10450 = 1.0 + +# SoulCalibur: Broken Destiny +NPJH50034 = 1.0 +UCKS45126 = 1.0 +ULES01298 = 1.0 +ULJS00202 = 1.0 +ULJS19055 = 1.0 +ULUS10457 = 1.0 + +# Spectral vs Generation +UCAS40102 = 1.0 +ULES00757 = 1.0 +ULJM05162 = 1.0 +ULJM05599 = 1.0 +ULUS10076 = 1.0 + +# Split/Second +NPJH50371 = 10.0 +ULES01402 = 10.0 +ULJM05812 = 10.0 +ULUS10513 = 10.0 + +# Spot the Differences! +NPEZ00107 = 1.0 +NPEZ00108 = 1.0 +NPUZ00034 = 1.0 + +# Star Soldier +NPJH50261 = 1.0 +ULJM05026 = 1.0 +ULJM05235 = 1.0 + +# SSX On Tour +ULES00192 = 50.0 +ULJM05063 = 50.0 +ULJM05389 = 50.0 +ULUS10042 = 50.0 + +# Star Trek: Tactical Assault +ULES00623 = 0.01 +ULUS10150 = 0.01 + +# Star Wars: Battlefront II +ULAS42037 = 1.0 +ULES00183 = 1.0 +ULJM05060 = 1.0 +ULUS10053 = 1.0 + +# Star Wars: The Force Unleashed +ULES00981 = 100.0 +ULES00982 = 100.0 +ULKS46143 = 100.0 +ULUS10345 = 100.0 + +# Street Fighter Alpha 3 MAX +ULES00235 = 1.0 +ULJM05082 = 1.0 +ULJM05225 = 1.0 +ULUS10062 = 1.0 + +# Sword Art Online: Infinity Moment +NPJH50701 = 1.0 +ULJS00557 = 1.0 +ULJS00558 = 1.0 + +# Tekken: Dark Resurrection +NPJH50137 = 1000.0 +UCAS40095 = 1000.0 +UCAS40099 = 1000.0 +UCAS40164 = 1000.0 +UCAS40165 = 1000.0 +UCED00448 = 1000.0 +UCES00356 = 1000.0 +UCET00424 = 1000.0 +UCKS45027 = 1000.0 +ULJS00048 = 1000.0 +ULJS19013 = 1000.0 +ULUS10139 = 1000.0 + +# Tekken 6 +NPJH50184 = 1000.0 +NPUH10047 = 1000.0 +ULAS42214 = 1000.0 +ULES01376 = 1000.0 +ULJS00224 = 1000.0 +ULJS19054 = 1000.0 +ULKS46235 = 1000.0 +ULKS46265 = 1000.0 +ULUS10466 = 1000.0 + +# Tenchu: Shadow Assassins +UCAS40247 = 10.0 +ULES01237 = 10.0 +ULJM05425 = 10.0 +ULJM05471 = 10.0 +ULJM08027 = 10.0 +ULUS10419 = 10.0 + +# Tenchu: Time of the Assassins +NPJH50042 = 100.0 +UCAS40020 = 100.0 +UCAS40092 = 100.0 +ULES00277 = 100.0 +ULJS00018 = 100.0 +ULJS19007 = 100.0 + +# The 3rd Birthday +NPJH50361 = 100.0 +UCAS40325 = 100.0 +UCAS40336 = 100.0 +UCKS45163 = 100.0 +ULES01513 = 100.0 +ULJM05798 = 100.0 +ULJM06008 = 100.0 +ULUS10567 = 100.0 + +# The Simpsons Game +ULAS42115 = 1.0 +ULES00975 = 1.0 +ULES00976 = 1.0 +ULES00977 = 1.0 +ULES00978 = 1.0 +ULES00979 = 1.0 +ULUS10295 = 1.0 + +# The Terminator +NPEZ00140 = 1.0 +NPUZ00056 = 1.0 + +# Tomb Raider: Legend +ULES00283 = 256.0 +ULJM05180 = 256.0 +ULUS10110 = 256.0 + +# Tony Hawk's Underground 2 Remix +ULES00033 = 0.005 +ULES00034 = 0.005 +ULES00035 = 0.005 +ULUS10014 = 0.005 + +# Ultimate Ghosts 'n Goblins +NPJH50235 = 7.8 +ULAS42069 = 7.8 +ULAS42073 = 7.8 +ULES00419 = 7.8 +ULJM05147 = 7.8 +ULUS10105 = 7.8 + +# Valkyria Chronicles II +NPJH50145 = 9.0 +ULES01417 = 9.0 +ULJM05560 = 9.0 +ULJM05807 = 9.0 +ULUS10515 = 9.0 + +# Virtua Tennis: World Tour +ULES00126 = 10.0 +ULJM05079 = 10.0 +ULKS46023 = 10.0 +ULUS10037 = 10.0 + +# Wipeout Pulse +NPEG90003 = 1.0 +NPUG70008 = 1.0 +UCAS40179 = 1.0 +UCES00465 = 1.0 +UCET00713 = 1.0 +UCKS45078 = 1.0 +UCUS98712 = 1.0 + +# Wipeout Pure +NPJG00059 = 1.0 +UCAS40012 = 1.0 +UCES00001 = 1.0 +ULJM05105 = 1.0 +UCJS10007 = 1.0 +UCKS45008 = 1.0 +UCUS98612 = 1.0 + +# WWE SmackDown! vs. Raw 2006 +ULES00227 = 10.0 +ULJM05103 = 10.0 +ULKS46057 = 10.0 +ULUS10050 = 10.0 diff --git a/src/BizHawk.Emulation.Cores/Resources/ppsspp_font_atlas.meta b/src/BizHawk.Emulation.Cores/Resources/ppsspp_font_atlas.meta new file mode 100644 index 00000000000..3f7252095de Binary files /dev/null and b/src/BizHawk.Emulation.Cores/Resources/ppsspp_font_atlas.meta differ diff --git a/src/BizHawk.Emulation.Cores/Resources/ppsspp_font_atlas.zim b/src/BizHawk.Emulation.Cores/Resources/ppsspp_font_atlas.zim new file mode 100644 index 00000000000..5026d748923 Binary files /dev/null and b/src/BizHawk.Emulation.Cores/Resources/ppsspp_font_atlas.zim differ diff --git a/src/BizHawk.Emulation.Cores/Resources/ppsspp_ppge_atlas.meta b/src/BizHawk.Emulation.Cores/Resources/ppsspp_ppge_atlas.meta new file mode 100644 index 00000000000..eb80c3f668d Binary files /dev/null and b/src/BizHawk.Emulation.Cores/Resources/ppsspp_ppge_atlas.meta differ diff --git a/src/BizHawk.Emulation.Cores/Resources/ppsspp_ppge_atlas.zim b/src/BizHawk.Emulation.Cores/Resources/ppsspp_ppge_atlas.zim new file mode 100644 index 00000000000..9ee0af22aba Binary files /dev/null and b/src/BizHawk.Emulation.Cores/Resources/ppsspp_ppge_atlas.zim differ