This commit is contained in:
ekeeke 2018-08-31 02:02:31 +02:00
commit e386c13571
39 changed files with 2861 additions and 2625 deletions

1
.gitignore vendored
View File

@ -12,3 +12,4 @@ sdl/gen_sdl2
sdl/build_sdl
sdl/build_sdl2
/libretro/msvc/msvc-2017/msvc-2017.vcxproj.user

View File

@ -6,6 +6,15 @@ HAVE_SYS_PARAM = 1
CORE_DIR := .
SPACE :=
SPACE := $(SPACE) $(SPACE)
BACKSLASH :=
BACKSLASH := \$(BACKSLASH)
filter_out1 = $(filter-out $(firstword $1),$1)
filter_out2 = $(call filter_out1,$(call filter_out1,$1))
unixpath = $(subst \,/,$1)
unixcygpath = /$(subst :,,$(call unixpath,$1))
# system platform
ifeq ($(platform),)
platform = unix
@ -223,6 +232,14 @@ else ifneq (,$(filter $(platform), ngc wii wiiu))
PLATFORM_DEFINES += -DHW_DOL -mrvl
endif
# Nintendo Switch (libtransistor)
else ifeq ($(platform), switch)
TARGET := $(TARGET_NAME)_libretro_$(platform).a
include $(LIBTRANSISTOR_HOME)/libtransistor.mk
CFLAGS += -fomit-frame-pointer -ffast-math
STATIC_LINKING=1
STATIC_LINKING_LINK=1
# emscripten
else ifeq ($(platform), emscripten)
TARGET := $(TARGET_NAME)_libretro_$(platform).bc
@ -243,13 +260,14 @@ else ifeq ($(platform), gcw0)
# Windows MSVC 2003 Xbox 1
else ifeq ($(platform), xbox1_msvc2003)
TARGET := $(TARGET_NAME)_libretro_xdk1.lib
MSVCBINDIRPREFIX = $(XDK)/xbox/bin/vc71
CC = "$(MSVCBINDIRPREFIX)/CL.exe"
CXX = "$(MSVCBINDIRPREFIX)/CL.exe"
LD = "$(MSVCBINDIRPREFIX)/lib.exe"
CC = CL.exe
CXX = CL.exe
LD = lib.exe
export INCLUDE := $(XDK)/xbox/include
export LIB := $(XDK)/xbox/lib
PATH := $(call unixcygpath,$(XDK)/xbox/bin/vc71):$(PATH)
ENDIANNESS_DEFINES := -DLSB_FIRST -DBYTE_ORDER=LITTLE_ENDIAN
PSS_STYLE :=2
CFLAGS += -D_XBOX -D_XBOX1
@ -282,23 +300,115 @@ HAVE_SYS_PARAM = 0
PATH := $(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../../VC/bin/amd64"):$(PATH)
PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../IDE")
LIB := $(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../../VC/lib/amd64")
INCLUDE := $(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../../VC/include")
LIB := $(shell IFS=$$'\n'; cygpath -w "$(VS100COMNTOOLS)../../VC/lib/amd64")
INCLUDE := $(shell IFS=$$'\n'; cygpath -w "$(VS100COMNTOOLS)../../VC/include")
WindowsSdkDir := $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')lib/x64
WindowsSdkDir ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')lib/x64
WindowsSdkDirInc := $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')Include
WindowsSdkDirInc ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')Include
WindowsSdkDir := $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')
WindowsSdkDir ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')
WindowsSdkDirInc := $(WindowsSdkDir)Include
WindowsSdkDirInc ?= $(WindowsSdkDir)Include
INCFLAGS_PLATFORM = -I"$(WindowsSdkDirInc)"
export INCLUDE := $(INCLUDE)
export LIB := $(LIB);$(WindowsSdkDir)
export LIB := $(LIB);$(WindowsSdkDir)\Lib\x64
TARGET := $(TARGET_NAME)_libretro.dll
PSS_STYLE :=2
LDFLAGS += -DLL
LIBS =
# Windows MSVC 2017 all architectures
else ifneq (,$(findstring windows_msvc2017,$(platform)))
PlatformSuffix = $(subst windows_msvc2017_,,$(platform))
ifneq (,$(findstring desktop,$(PlatformSuffix)))
WinPartition = desktop
MSVC2017CompileFlags = -DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP -FS
LDFLAGS += -MANIFEST -LTCG:incremental -NXCOMPAT -DYNAMICBASE -DEBUG -OPT:REF -INCREMENTAL:NO -SUBSYSTEM:WINDOWS -MANIFESTUAC:"level='asInvoker' uiAccess='false'" -OPT:ICF -ERRORREPORT:PROMPT -NOLOGO -TLBID:1
LIBS := kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib
else ifneq (,$(findstring uwp,$(PlatformSuffix)))
WinPartition = uwp
MSVC2017CompileFlags = -DWINAPI_FAMILY=WINAPI_FAMILY_APP -D_WINDLL -D_UNICODE -DUNICODE -D__WRL_NO_DEFAULT_LIB__ -EHsc -FS
LDFLAGS += -APPCONTAINER -NXCOMPAT -DYNAMICBASE -MANIFEST:NO -LTCG -OPT:REF -SUBSYSTEM:CONSOLE -MANIFESTUAC:NO -OPT:ICF -ERRORREPORT:PROMPT -NOLOGO -TLBID:1 -DEBUG:FULL -WINMD:NO
LIBS := WindowsApp.lib
endif
CFLAGS += $(MSVC2017CompileFlags)
CXXFLAGS += $(MSVC2017CompileFlags)
TargetArchMoniker = $(subst $(WinPartition)_,,$(PlatformSuffix))
CC = cl.exe
CXX = cl.exe
LD = link.exe
HAVE_SYS_PARAM = 0
reg_query = $(call filter_out2,$(subst $2,,$(shell reg query "$2" -v "$1" 2>nul)))
fix_path = $(subst $(SPACE),\ ,$(subst \,/,$1))
ProgramFiles86w := $(shell cmd /c "echo %PROGRAMFILES(x86)%")
ProgramFiles86 := $(shell cygpath "$(ProgramFiles86w)")
WindowsSdkDir ?= $(call reg_query,InstallationFolder,HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0)
WindowsSdkDir ?= $(call reg_query,InstallationFolder,HKEY_CURRENT_USER\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0)
WindowsSdkDir ?= $(call reg_query,InstallationFolder,HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0)
WindowsSdkDir ?= $(call reg_query,InstallationFolder,HKEY_CURRENT_USER\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0)
WindowsSdkDir := $(WindowsSdkDir)
WindowsSDKVersion ?= $(firstword $(foreach folder,$(subst $(subst \,/,$(WindowsSdkDir)Include/),,$(wildcard $(call fix_path,$(WindowsSdkDir)Include\*))),$(if $(wildcard $(call fix_path,$(WindowsSdkDir)Include/$(folder)/um/Windows.h)),$(folder),)))$(BACKSLASH)
WindowsSDKVersion := $(WindowsSDKVersion)
VsInstallBuildTools = $(ProgramFiles86)/Microsoft Visual Studio/2017/BuildTools
VsInstallEnterprise = $(ProgramFiles86)/Microsoft Visual Studio/2017/Enterprise
VsInstallProfessional = $(ProgramFiles86)/Microsoft Visual Studio/2017/Professional
VsInstallCommunity = $(ProgramFiles86)/Microsoft Visual Studio/2017/Community
VsInstallRoot ?= $(shell if [ -d "$(VsInstallBuildTools)" ]; then echo "$(VsInstallBuildTools)"; fi)
ifeq ($(VsInstallRoot), )
VsInstallRoot = $(shell if [ -d "$(VsInstallEnterprise)" ]; then echo "$(VsInstallEnterprise)"; fi)
endif
ifeq ($(VsInstallRoot), )
VsInstallRoot = $(shell if [ -d "$(VsInstallProfessional)" ]; then echo "$(VsInstallProfessional)"; fi)
endif
ifeq ($(VsInstallRoot), )
VsInstallRoot = $(shell if [ -d "$(VsInstallCommunity)" ]; then echo "$(VsInstallCommunity)"; fi)
endif
VsInstallRoot := $(VsInstallRoot)
VcCompilerToolsVer := $(shell cat "$(VsInstallRoot)/VC/Auxiliary/Build/Microsoft.VCToolsVersion.default.txt" | grep -o '[0-9\.]*')
VcCompilerToolsDir := $(VsInstallRoot)/VC/Tools/MSVC/$(VcCompilerToolsVer)
WindowsSDKSharedIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\$(WindowsSDKVersion)\shared")
WindowsSDKUCRTIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\$(WindowsSDKVersion)\ucrt")
WindowsSDKUMIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\$(WindowsSDKVersion)\um")
WindowsSDKUCRTLibDir := $(shell cygpath -w "$(WindowsSdkDir)\Lib\$(WindowsSDKVersion)\ucrt\$(TargetArchMoniker)")
WindowsSDKUMLibDir := $(shell cygpath -w "$(WindowsSdkDir)\Lib\$(WindowsSDKVersion)\um\$(TargetArchMoniker)")
# For some reason the HostX86 compiler doesn't like compiling for x64
# ("no such file" opening a shared library), and vice-versa.
# Work around it for now by using the strictly x86 compiler for x86, and x64 for x64.
# NOTE: What about ARM?
ifneq (,$(findstring x64,$(TargetArchMoniker)))
VCCompilerToolsBinDir := $(VcCompilerToolsDir)\bin\HostX64
else
VCCompilerToolsBinDir := $(VcCompilerToolsDir)\bin\HostX86
endif
PATH := $(shell IFS=$$'\n'; cygpath "$(VCCompilerToolsBinDir)/$(TargetArchMoniker)"):$(PATH)
PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VsInstallRoot)/Common7/IDE")
INCLUDE := $(shell IFS=$$'\n'; cygpath -w "$(VcCompilerToolsDir)/include")
LIB := $(shell IFS=$$'\n'; cygpath -w "$(VcCompilerToolsDir)/lib/$(TargetArchMoniker)")
ifneq (,$(findstring uwp,$(PlatformSuffix)))
LIB := $(shell IFS=$$'\n'; cygpath -w "$(LIB)/store")
endif
export INCLUDE := $(INCLUDE);$(WindowsSDKSharedIncludeDir);$(WindowsSDKUCRTIncludeDir);$(WindowsSDKUMIncludeDir)
export LIB := $(LIB);$(WindowsSDKUCRTLibDir);$(WindowsSDKUMLibDir)
TARGET := $(TARGET_NAME)_libretro.dll
PSS_STYLE :=2
LDFLAGS += -DLL
# Windows MSVC 2010 x86
else ifeq ($(platform), windows_msvc2010_x86)
CC = cl.exe
@ -309,18 +419,17 @@ else ifeq ($(platform), windows_msvc2010_x86)
PATH := $(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../../VC/bin"):$(PATH)
PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../IDE")
LIB := $(shell IFS=$$'\n'; cygpath -w "$(VS100COMNTOOLS)../../VC/lib")
INCLUDE := $(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../../VC/include")
INCLUDE := $(shell IFS=$$'\n'; cygpath -w "$(VS100COMNTOOLS)../../VC/include")
WindowsSdkDir := $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')lib
WindowsSdkDir ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')lib
WindowsSdkDirInc := $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')Include
WindowsSdkDirInc ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')Include
WindowsSdkDir := $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')
WindowsSdkDir ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')
WindowsSdkDirInc := $(WindowsSdkDir)Include
WindowsSdkDirInc ?= $(WindowsSdkDir)Include
INCFLAGS_PLATFORM = -I"$(WindowsSdkDirInc)"
export INCLUDE := $(INCLUDE)
export LIB := $(LIB);$(WindowsSdkDir)
export LIB := $(LIB);$(WindowsSdkDir)\Lib
TARGET := $(TARGET_NAME)_libretro.dll
PSS_STYLE :=2
LDFLAGS += -DLL
@ -347,6 +456,29 @@ PSS_STYLE :=2
LDFLAGS += -DLL
CFLAGS += -D_CRT_SECURE_NO_DEPRECATE
LIBS =
# Windows MSVC 2003 x86
else ifeq ($(platform), windows_msvc2003_x86)
CC = cl.exe
CXX = cl.exe
PATH := $(shell IFS=$$'\n'; cygpath "$(VS71COMNTOOLS)../../Vc7/bin"):$(PATH)
PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VS71COMNTOOLS)../IDE")
INCLUDE := $(shell IFS=$$'\n'; cygpath "$(VS71COMNTOOLS)../../Vc7/include")
LIB := $(shell IFS=$$'\n'; cygpath -w "$(VS71COMNTOOLS)../../Vc7/lib")
BIN := $(shell IFS=$$'\n'; cygpath "$(VS71COMNTOOLS)../../Vc7/bin")
WindowsSdkDir := $(INETSDK)
export INCLUDE := $(INCLUDE);$(INETSDK)/Include;src/drivers/libretro/msvc/msvc-2005
export LIB := $(LIB);$(WindowsSdkDir);$(INETSDK)/Lib
TARGET := $(TARGET_NAME)_libretro.dll
PSS_STYLE :=2
LDFLAGS += -DLL
HAVE_SYS_PARAM = 0
CFLAGS += -D_CRT_SECURE_NO_DEPRECATE
LIBS =
# Windows
else
TARGET := $(TARGET_NAME)_libretro.dll
@ -494,3 +626,6 @@ clean:
.PHONY: clean clean-objs
endif
print-%:
@echo '$*=$($*)'

33
appveyor.yml Normal file
View File

@ -0,0 +1,33 @@
version: 0.1.{build}
shallow_clone: true
image: Visual Studio 2017
environment:
makefile_location: "."
makefile_name: makefile.libretro
target_name: genesis_plus_gx
configuration:
- release
platform:
- windows_msvc2017_uwp_x64
- windows_msvc2017_uwp_x86
- windows_msvc2017_uwp_arm
- windows_msvc2017_desktop_x64
- windows_msvc2017_desktop_x86
init:
- set Path=C:\msys64\usr\bin;%Path%
build_script:
- cd %makefile_location%
- make -f %makefile_name% platform=%platform%
artifacts:
- path: '**\%target_name%*.dll'
- path: '**\%target_name%*.lib'
- path: '**\%target_name%*.pdb'
- path: '**\libretro.h'

View File

@ -56,7 +56,11 @@ SOURCES_C += $(foreach dir,$(GENPLUS_SRC_DIR),$(wildcard $(dir)/*.c))
ifneq ($(STATIC_LINKING), 1)
SOURCES_C += \
$(LIBRETRO_COMM_DIR)/streams/file_stream.c \
$(LIBRETRO_COMM_DIR)/streams/file_stream_transforms.c
$(LIBRETRO_COMM_DIR)/streams/file_stream_transforms.c \
$(LIBRETRO_COMM_DIR)/compat/fopen_utf8.c \
$(LIBRETRO_COMM_DIR)/compat/compat_strl.c \
$(LIBRETRO_COMM_DIR)/encodings/encoding_utf.c \
$(LIBRETRO_COMM_DIR)/vfs/vfs_implementation.c
SOURCES_C += $(CHDLIBDIR)/deps/zlib/adler32.c \
$(CHDLIBDIR)/deps/zlib/inffast.c \

View File

@ -1,40 +1,29 @@
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
GIT_VERSION ?= " $(shell git rev-parse --short HEAD || echo unknown)"
ifneq ($(GIT_VERSION)," unknown")
LOCAL_CFLAGS += -DGIT_VERSION=\"$(GIT_VERSION)\"
endif
CORE_DIR := $(LOCAL_PATH)/../..
TREMOR_SRC_DIR := $(CORE_DIR)/core/tremor
SOURCES_C :=
WANT_CRC32 := 1
HAVE_CHD := 1
CORE_DIR := ../..
include $(CORE_DIR)/libretro/Makefile.common
TREMOR_SRC_DIR := $(CORE_DIR)/core/tremor
LIBRETRO_DIR := ..
LOCAL_MODULE := retro
COREFLAGS := -ffast-math -funroll-loops -DINLINE="static inline" -DUSE_LIBTREMOR -DUSE_16BPP_RENDERING -DLSB_FIRST -DBYTE_ORDER=LITTLE_ENDIAN -D__LIBRETRO__ -DFRONTEND_SUPPORTS_RGB565 -DALIGN_LONG -DALIGN_WORD -DM68K_OVERCLOCK_SHIFT=20 -DZ80_OVERCLOCK_SHIFT=20 -DUSE_LIBCHDR -DPACKAGE_VERSION=\"1.3.2\" -DFLAC_API_EXPORTS -DFLAC__HAS_OGG=0 -DHAVE_LROUND -DHAVE_STDINT_H -D_7ZIP_ST -DHAVE_SYS_PARAM_H $(INCFLAGS)
ifeq ($(TARGET_ARCH),arm)
LOCAL_CFLAGS += -DANDROID_ARM -D_ARM_ASSEM_
LOCAL_ARM_MODE := arm
COREFLAGS += -D_ARM_ASSEM_
endif
include $(LIBRETRO_DIR)/Makefile.common
GIT_VERSION := " $(shell git rev-parse --short HEAD || echo unknown)"
ifneq ($(GIT_VERSION)," unknown")
COREFLAGS += -DGIT_VERSION=\"$(GIT_VERSION)\"
endif
include $(CLEAR_VARS)
LOCAL_MODULE := retro
LOCAL_SRC_FILES := $(SOURCES_C)
LOCAL_C_INCLUDES = $(foreach dir,$(GENPLUS_SRC_DIR),$(LOCAL_PATH)/$(dir)) \
$(CORE_DIR)/libretro/libretro-common/include \
$(LOCAL_PATH)/$(TREMOR_SRC_DIR) \
$(LOCAL_PATH)/$(LIBRETRO_DIR) \
$(CHDLIBDIR)/src \
$(CHDLIBDIR)/deps/libFLAC/include \
$(CHDLIBDIR)/deps/lzma \
$(CHDLIBDIR)/deps/zlib
LOCAL_CFLAGS += -ffast-math -O2 -funroll-loops -DINLINE="static inline" -DUSE_LIBTREMOR -DUSE_16BPP_RENDERING -DLSB_FIRST -DBYTE_ORDER=LITTLE_ENDIAN -D__LIBRETRO__ -DFRONTEND_SUPPORTS_RGB565 -DALIGN_LONG -DALIGN_WORD -DM68K_OVERCLOCK_SHIFT=20 -DZ80_OVERCLOCK_SHIFT=20 -DUSE_LIBCHDR -DPACKAGE_VERSION=\"1.3.2\" -DFLAC_API_EXPORTS -DFLAC__HAS_OGG=0 -DHAVE_LROUND -DHAVE_STDINT_H -D_7ZIP_ST -DHAVE_SYS_PARAM_H
LOCAL_CFLAGS := $(COREFLAGS)
LOCAL_LDFLAGS := -Wl,-version-script=$(LIBRETRO_DIR)/link.T
LOCAL_ARM_MODE := arm
include $(BUILD_SHARED_LIBRARY)

View File

@ -0,0 +1,69 @@
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (compat_strl.c).
* ---------------------------------------------------------------------------------------
*
* Permission is hereby granted, free of charge,
* to any person obtaining a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <stdlib.h>
#include <ctype.h>
#include <compat/strl.h>
/* Implementation of strlcpy()/strlcat() based on OpenBSD. */
#ifndef __MACH__
size_t strlcpy(char *dest, const char *source, size_t size)
{
size_t src_size = 0;
size_t n = size;
if (n)
while (--n && (*dest++ = *source++)) src_size++;
if (!n)
{
if (size) *dest = '\0';
while (*source++) src_size++;
}
return src_size;
}
size_t strlcat(char *dest, const char *source, size_t size)
{
size_t len = strlen(dest);
dest += len;
if (len > size)
size = 0;
else
size -= len;
return len + strlcpy(dest, source, size);
}
#endif
char *strldup(const char *s, size_t n)
{
char *dst = (char*)malloc(sizeof(char) * (n + 1));
strlcpy(dst, s, n);
return dst;
}

View File

@ -0,0 +1,60 @@
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (fopen_utf8.c).
* ---------------------------------------------------------------------------------------
*
* Permission is hereby granted, free of charge,
* to any person obtaining a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <compat/fopen_utf8.h>
#include <encodings/utf.h>
#include <stdio.h>
#include <stdlib.h>
#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 || defined(_XBOX)
#ifndef LEGACY_WIN32
#define LEGACY_WIN32
#endif
#endif
#ifdef _WIN32
#undef fopen
void *fopen_utf8(const char * filename, const char * mode)
{
#if defined(_XBOX)
return fopen(filename, mode);
#elif defined(LEGACY_WIN32)
FILE *ret = NULL;
char * filename_local = utf8_to_local_string_alloc(filename);
if (!filename_local)
return NULL;
ret = fopen(filename_local, mode);
if (filename_local)
free(filename_local);
return ret;
#else
wchar_t * filename_w = utf8_to_utf16_string_alloc(filename);
wchar_t * mode_w = utf8_to_utf16_string_alloc(mode);
FILE* ret = _wfopen(filename_w, mode_w);
free(filename_w);
free(mode_w);
return ret;
#endif
}
#endif

View File

@ -0,0 +1,516 @@
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (encoding_utf.c).
* ---------------------------------------------------------------------------------------
*
* Permission is hereby granted, free of charge,
* to any person obtaining a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <stdint.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <boolean.h>
#include <compat/strl.h>
#include <retro_inline.h>
#include <encodings/utf.h>
#if defined(_WIN32) && !defined(_XBOX)
#include <windows.h>
#elif defined(_XBOX)
#include <xtl.h>
#endif
static unsigned leading_ones(uint8_t c)
{
unsigned ones = 0;
while (c & 0x80)
{
ones++;
c <<= 1;
}
return ones;
}
/* Simple implementation. Assumes the sequence is
* properly synchronized and terminated. */
size_t utf8_conv_utf32(uint32_t *out, size_t out_chars,
const char *in, size_t in_size)
{
unsigned i;
size_t ret = 0;
while (in_size && out_chars)
{
unsigned extra, shift;
uint32_t c;
uint8_t first = *in++;
unsigned ones = leading_ones(first);
if (ones > 6 || ones == 1) /* Invalid or desync. */
break;
extra = ones ? ones - 1 : ones;
if (1 + extra > in_size) /* Overflow. */
break;
shift = (extra - 1) * 6;
c = (first & ((1 << (7 - ones)) - 1)) << (6 * extra);
for (i = 0; i < extra; i++, in++, shift -= 6)
c |= (*in & 0x3f) << shift;
*out++ = c;
in_size -= 1 + extra;
out_chars--;
ret++;
}
return ret;
}
bool utf16_conv_utf8(uint8_t *out, size_t *out_chars,
const uint16_t *in, size_t in_size)
{
static uint8_t kUtf8Limits[5] = { 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
size_t out_pos = 0;
size_t in_pos = 0;
for (;;)
{
unsigned numAdds;
uint32_t value;
if (in_pos == in_size)
{
*out_chars = out_pos;
return true;
}
value = in[in_pos++];
if (value < 0x80)
{
if (out)
out[out_pos] = (char)value;
out_pos++;
continue;
}
if (value >= 0xD800 && value < 0xE000)
{
uint32_t c2;
if (value >= 0xDC00 || in_pos == in_size)
break;
c2 = in[in_pos++];
if (c2 < 0xDC00 || c2 >= 0xE000)
break;
value = (((value - 0xD800) << 10) | (c2 - 0xDC00)) + 0x10000;
}
for (numAdds = 1; numAdds < 5; numAdds++)
if (value < (((uint32_t)1) << (numAdds * 5 + 6)))
break;
if (out)
out[out_pos] = (char)(kUtf8Limits[numAdds - 1]
+ (value >> (6 * numAdds)));
out_pos++;
do
{
numAdds--;
if (out)
out[out_pos] = (char)(0x80
+ ((value >> (6 * numAdds)) & 0x3F));
out_pos++;
}while (numAdds != 0);
}
*out_chars = out_pos;
return false;
}
/* Acts mostly like strlcpy.
*
* Copies the given number of UTF-8 characters,
* but at most d_len bytes.
*
* Always NULL terminates.
* Does not copy half a character.
*
* Returns number of bytes. 's' is assumed valid UTF-8.
* Use only if 'chars' is considerably less than 'd_len'. */
size_t utf8cpy(char *d, size_t d_len, const char *s, size_t chars)
{
const uint8_t *sb = (const uint8_t*)s;
const uint8_t *sb_org = sb;
if (!s)
return 0;
while (*sb && chars-- > 0)
{
sb++;
while ((*sb & 0xC0) == 0x80) sb++;
}
if ((size_t)(sb - sb_org) > d_len-1 /* NUL */)
{
sb = sb_org + d_len-1;
while ((*sb & 0xC0) == 0x80) sb--;
}
memcpy(d, sb_org, sb-sb_org);
d[sb-sb_org] = '\0';
return sb-sb_org;
}
const char *utf8skip(const char *str, size_t chars)
{
const uint8_t *strb = (const uint8_t*)str;
if (!chars)
return str;
do
{
strb++;
while ((*strb & 0xC0)==0x80) strb++;
chars--;
} while(chars);
return (const char*)strb;
}
size_t utf8len(const char *string)
{
size_t ret = 0;
if (!string)
return 0;
while (*string)
{
if ((*string & 0xC0) != 0x80)
ret++;
string++;
}
return ret;
}
static uint8_t utf8_walkbyte(const char **string)
{
return *((*string)++);
}
/* Does not validate the input, returns garbage if it's not UTF-8. */
uint32_t utf8_walk(const char **string)
{
uint8_t first = utf8_walkbyte(string);
uint32_t ret = 0;
if (first < 128)
return first;
ret = (ret << 6) | (utf8_walkbyte(string) & 0x3F);
if (first >= 0xE0)
ret = (ret << 6) | (utf8_walkbyte(string) & 0x3F);
if (first >= 0xF0)
ret = (ret << 6) | (utf8_walkbyte(string) & 0x3F);
if (first >= 0xF0)
return ret | (first & 7) << 18;
if (first >= 0xE0)
return ret | (first & 15) << 12;
return ret | (first & 31) << 6;
}
static bool utf16_to_char(uint8_t **utf_data,
size_t *dest_len, const uint16_t *in)
{
unsigned len = 0;
while (in[len] != '\0')
len++;
utf16_conv_utf8(NULL, dest_len, in, len);
*dest_len += 1;
*utf_data = (uint8_t*)malloc(*dest_len);
if (*utf_data == 0)
return false;
return utf16_conv_utf8(*utf_data, dest_len, in, len);
}
bool utf16_to_char_string(const uint16_t *in, char *s, size_t len)
{
size_t dest_len = 0;
uint8_t *utf16_data = NULL;
bool ret = utf16_to_char(&utf16_data, &dest_len, in);
if (ret)
{
utf16_data[dest_len] = 0;
strlcpy(s, (const char*)utf16_data, len);
}
free(utf16_data);
utf16_data = NULL;
return ret;
}
/* Returned pointer MUST be freed by the caller if non-NULL. */
static char* mb_to_mb_string_alloc(const char *str,
enum CodePage cp_in, enum CodePage cp_out)
{
char *path_buf = NULL;
wchar_t *path_buf_wide = NULL;
int path_buf_len = 0;
int path_buf_wide_len = 0;
if (!str || !*str)
return NULL;
(void)path_buf;
(void)path_buf_wide;
(void)path_buf_len;
(void)path_buf_wide_len;
#if !defined(_WIN32) || defined(_XBOX)
/* assume string needs no modification if not on Windows */
return strdup(str);
#else
#ifdef UNICODE
/* TODO/FIXME: Not implemented. */
return strdup(str);
#else
/* Windows 95 will return 0 from these functions with a UTF8 codepage set without MSLU. From an unknown MSDN version (others omit this info):
* - CP_UTF8 Windows 98/Me, Windows NT 4.0 and later: Translate using UTF-8. When this is set, dwFlags must be zero.
* - Windows 95: Under the Microsoft Layer for Unicode, MultiByteToWideChar also supports CP_UTF7 and CP_UTF8.
*/
path_buf_wide_len = MultiByteToWideChar(cp_in, 0, str, -1, NULL, 0);
if (path_buf_wide_len)
{
path_buf_wide = (wchar_t*)
calloc(path_buf_wide_len + sizeof(wchar_t), sizeof(wchar_t));
if (path_buf_wide)
{
MultiByteToWideChar(cp_in, 0,
str, -1, path_buf_wide, path_buf_wide_len);
if (*path_buf_wide)
{
path_buf_len = WideCharToMultiByte(cp_out, 0,
path_buf_wide, -1, NULL, 0, NULL, NULL);
if (path_buf_len)
{
path_buf = (char*)
calloc(path_buf_len + sizeof(char), sizeof(char));
if (path_buf)
{
WideCharToMultiByte(cp_out, 0,
path_buf_wide, -1, path_buf,
path_buf_len, NULL, NULL);
free(path_buf_wide);
if (*path_buf)
return path_buf;
free(path_buf);
return NULL;
}
}
else
{
free(path_buf_wide);
return strdup(str);
}
}
}
}
else
return strdup(str);
if (path_buf_wide)
free(path_buf_wide);
return NULL;
#endif
#endif
}
/* Returned pointer MUST be freed by the caller if non-NULL. */
char* utf8_to_local_string_alloc(const char *str)
{
return mb_to_mb_string_alloc(str, CODEPAGE_UTF8, CODEPAGE_LOCAL);
}
/* Returned pointer MUST be freed by the caller if non-NULL. */
char* local_to_utf8_string_alloc(const char *str)
{
return mb_to_mb_string_alloc(str, CODEPAGE_LOCAL, CODEPAGE_UTF8);
}
/* Returned pointer MUST be freed by the caller if non-NULL. */
wchar_t* utf8_to_utf16_string_alloc(const char *str)
{
#ifdef _WIN32
int len = 0;
int out_len = 0;
#else
size_t len = 0;
size_t out_len = 0;
#endif
wchar_t *buf = NULL;
if (!str || !*str)
return NULL;
#ifdef _WIN32
len = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
if (len)
{
buf = (wchar_t*)calloc(len, sizeof(wchar_t));
if (!buf)
return NULL;
out_len = MultiByteToWideChar(CP_UTF8, 0, str, -1, buf, len);
}
else
{
/* fallback to ANSI codepage instead */
len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
if (len)
{
buf = (wchar_t*)calloc(len, sizeof(wchar_t));
if (!buf)
return NULL;
out_len = MultiByteToWideChar(CP_ACP, 0, str, -1, buf, len);
}
}
if (out_len < 0)
{
free(buf);
return NULL;
}
#else
/* NOTE: For now, assume non-Windows platforms' locale is already UTF-8. */
len = mbstowcs(NULL, str, 0) + 1;
if (len)
{
buf = (wchar_t*)calloc(len, sizeof(wchar_t));
if (!buf)
return NULL;
out_len = mbstowcs(buf, str, len);
}
if (out_len == (size_t)-1)
{
free(buf);
return NULL;
}
#endif
return buf;
}
/* Returned pointer MUST be freed by the caller if non-NULL. */
char* utf16_to_utf8_string_alloc(const wchar_t *str)
{
#ifdef _WIN32
int len = 0;
int out_len = 0;
#else
size_t len = 0;
size_t out_len = 0;
#endif
char *buf = NULL;
if (!str || !*str)
return NULL;
#ifdef _WIN32
len = WideCharToMultiByte(CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL);
if (len)
{
buf = (char*)calloc(len, sizeof(char));
if (!buf)
return NULL;
out_len = WideCharToMultiByte(CP_UTF8, 0, str, -1, buf, len, NULL, NULL);
}
else
{
/* fallback to ANSI codepage instead */
len = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
if (len)
{
buf = (char*)calloc(len, sizeof(char));
if (!buf)
return NULL;
out_len = WideCharToMultiByte(CP_ACP, 0, str, -1, buf, len, NULL, NULL);
}
}
if (out_len < 0)
{
free(buf);
return NULL;
}
#else
/* NOTE: For now, assume non-Windows platforms' locale is already UTF-8. */
len = wcstombs(NULL, str, 0) + 1;
if (len)
{
buf = (char*)calloc(len, sizeof(char));
if (!buf)
return NULL;
out_len = wcstombs(buf, str, len);
}
if (out_len == (size_t)-1)
{
free(buf);
return NULL;
}
#endif
return buf;
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010-2017 The RetroArch team
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (boolean.h).
@ -25,7 +25,7 @@
#ifndef __cplusplus
#if defined(_MSC_VER) && !defined(SN_TARGET_PS3)
#if defined(_MSC_VER) && _MSC_VER < 1800 && !defined(SN_TARGET_PS3)
/* Hack applied for MSVC when compiling in C89 mode as it isn't C99 compliant. */
#define bool unsigned char
#define true 1

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010-2017 The RetroArch team
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (apple_compat.h).

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010-2017 The RetroArch team
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (fnmatch.h).

View File

@ -0,0 +1,34 @@
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (fopen_utf8.h).
* ---------------------------------------------------------------------------------------
*
* Permission is hereby granted, free of charge,
* to any person obtaining a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef __LIBRETRO_SDK_COMPAT_FOPEN_UTF8_H
#define __LIBRETRO_SDK_COMPAT_FOPEN_UTF8_H
#ifdef _WIN32
/* Defined to error rather than fopen_utf8, to make it clear to everyone reading the code that not worrying about utf16 is fine */
/* TODO: enable */
/* #define fopen (use fopen_utf8 instead) */
void *fopen_utf8(const char * filename, const char * mode);
#else
#define fopen_utf8 fopen
#endif
#endif

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010-2017 The RetroArch team
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (getopt.h).

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010-2017 The RetroArch team
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (intrinsics.h).
@ -61,7 +61,7 @@ static INLINE int compat_ctz(unsigned x)
{
#if defined(__GNUC__) && !defined(RARCH_CONSOLE)
return __builtin_ctz(x);
#elif _MSC_VER >= 1400
#elif _MSC_VER >= 1400 && !defined(_XBOX)
unsigned long r = 0;
_BitScanReverse((unsigned long*)&r, x);
return (int)r;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010-2017 The RetroArch team
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (msvc.h).
@ -86,9 +86,33 @@ typedef int ssize_t;
#pragma warning(disable : 4723)
#pragma warning(disable : 4996)
/* roundf is available since MSVC 2013 */
/* roundf and va_copy is available since MSVC 2013 */
#if _MSC_VER < 1800
#define roundf(in) (in >= 0.0f ? floorf(in + 0.5f) : ceilf(in - 0.5f))
#define va_copy(x, y) ((x) = (y))
#endif
#if _MSC_VER <= 1310
#ifndef __cplusplus
/* VC6 math.h doesn't define some functions when in C mode.
* Trying to define a prototype gives "undefined reference".
* But providing an implementation then gives "function already has body".
* So the equivalent of the implementations from math.h are used as
* defines here instead, and it seems to work.
*/
#define cosf(x) ((float)cos((double)x))
#define powf(x, y) ((float)pow((double)x, (double)y))
#define sinf(x) ((float)sin((double)x))
#define ceilf(x) ((float)ceil((double)x))
#define floorf(x) ((float)floor((double)x))
#define sqrtf(x) ((float)sqrt((double)x))
#define fabsf(x) ((float)fabs((double)(x)))
#endif
#ifndef _strtoui64
#define _strtoui64(x, y, z) (_atoi64(x))
#endif
#endif
#ifndef PATH_MAX

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010-2017 The RetroArch team
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (posix_string.h).

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010-2017 The RetroArch team
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (strcasestr.h).

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010-2017 The RetroArch team
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (strl.h).
@ -26,7 +26,7 @@
#include <string.h>
#include <stddef.h>
#ifdef HAVE_CONFIG_H
#if defined(RARCH_INTERNAL) && defined(HAVE_CONFIG_H)
#include "../../../config.h"
#endif
@ -52,6 +52,8 @@ size_t strlcat(char *dest, const char *source, size_t size);
#endif
char *strldup(const char *s, size_t n);
RETRO_END_DECLS
#endif

View File

@ -0,0 +1,67 @@
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (utf.h).
* ---------------------------------------------------------------------------------------
*
* Permission is hereby granted, free of charge,
* to any person obtaining a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef _LIBRETRO_ENCODINGS_UTF_H
#define _LIBRETRO_ENCODINGS_UTF_H
#include <stdint.h>
#include <stddef.h>
#include <boolean.h>
#include <retro_common_api.h>
RETRO_BEGIN_DECLS
enum CodePage
{
CODEPAGE_LOCAL = 0, /* CP_ACP */
CODEPAGE_UTF8 = 65001 /* CP_UTF8 */
};
size_t utf8_conv_utf32(uint32_t *out, size_t out_chars,
const char *in, size_t in_size);
bool utf16_conv_utf8(uint8_t *out, size_t *out_chars,
const uint16_t *in, size_t in_size);
size_t utf8len(const char *string);
size_t utf8cpy(char *d, size_t d_len, const char *s, size_t chars);
const char *utf8skip(const char *str, size_t chars);
uint32_t utf8_walk(const char **string);
bool utf16_to_char_string(const uint16_t *in, char *s, size_t len);
char* utf8_to_local_string_alloc(const char *str);
char* local_to_utf8_string_alloc(const char *str);
wchar_t* utf8_to_utf16_string_alloc(const char *str);
char* utf16_to_utf8_string_alloc(const wchar_t *str);
RETRO_END_DECLS
#endif

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010-2016 The RetroArch team
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this libretro API header (libretro.h).
@ -32,7 +32,7 @@ extern "C" {
#endif
#ifndef __cplusplus
#if defined(_MSC_VER) && !defined(SN_TARGET_PS3)
#if defined(_MSC_VER) && _MSC_VER < 1800 && !defined(SN_TARGET_PS3)
/* Hack applied for MSVC when compiling in C89 mode
* as it isn't C99-compliant. */
#define bool unsigned char
@ -126,16 +126,23 @@ extern "C" {
*/
#define RETRO_DEVICE_KEYBOARD 3
/* Lightgun X/Y coordinates are reported relatively to last poll,
* similar to mouse. */
/* LIGHTGUN device is similar to Guncon-2 for PlayStation 2.
* It reports X/Y coordinates in screen space (similar to the pointer)
* in the range [-0x8000, 0x7fff] in both axes, with zero being center.
* As well as reporting on/off screen state. It features a trigger,
* start/select buttons, auxiliary action buttons and a
* directional pad. A forced off-screen shot can be requested for
* auto-reloading function in some games.
*/
#define RETRO_DEVICE_LIGHTGUN 4
/* The ANALOG device is an extension to JOYPAD (RetroPad).
* Similar to DualShock it adds two analog sticks.
* This is treated as a separate device type as it returns values in the
* full analog range of [-0x8000, 0x7fff]. Positive X axis is right.
* Positive Y axis is down.
* Only use ANALOG type when polling for analog values of the axes.
* Similar to DualShock2 it adds two analog sticks and all buttons can
* be analog. This is treated as a separate device type as it returns
* axis values in the full analog range of [-0x8000, 0x7fff].
* Positive X axis is right. Positive Y axis is down.
* Buttons are returned in the range [0, 0x7fff].
* Only use ANALOG type when polling for analog values.
*/
#define RETRO_DEVICE_ANALOG 5
@ -174,7 +181,8 @@ extern "C" {
/* Buttons for the RetroPad (JOYPAD).
* The placement of these is equivalent to placements on the
* Super Nintendo controller.
* L2/R2/L3/R3 buttons correspond to the PS1 DualShock. */
* L2/R2/L3/R3 buttons correspond to the PS1 DualShock.
* Also used as id values for RETRO_DEVICE_INDEX_ANALOG_BUTTON */
#define RETRO_DEVICE_ID_JOYPAD_B 0
#define RETRO_DEVICE_ID_JOYPAD_Y 1
#define RETRO_DEVICE_ID_JOYPAD_SELECT 2
@ -195,6 +203,7 @@ extern "C" {
/* Index / Id values for ANALOG device. */
#define RETRO_DEVICE_INDEX_ANALOG_LEFT 0
#define RETRO_DEVICE_INDEX_ANALOG_RIGHT 1
#define RETRO_DEVICE_INDEX_ANALOG_BUTTON 2
#define RETRO_DEVICE_ID_ANALOG_X 0
#define RETRO_DEVICE_ID_ANALOG_Y 1
@ -208,15 +217,30 @@ extern "C" {
#define RETRO_DEVICE_ID_MOUSE_MIDDLE 6
#define RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP 7
#define RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN 8
#define RETRO_DEVICE_ID_MOUSE_BUTTON_4 9
#define RETRO_DEVICE_ID_MOUSE_BUTTON_5 10
/* Id values for LIGHTGUN types. */
#define RETRO_DEVICE_ID_LIGHTGUN_X 0
#define RETRO_DEVICE_ID_LIGHTGUN_Y 1
/* Id values for LIGHTGUN. */
#define RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X 13 /*Absolute Position*/
#define RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y 14 /*Absolute*/
#define RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN 15 /*Status Check*/
#define RETRO_DEVICE_ID_LIGHTGUN_TRIGGER 2
#define RETRO_DEVICE_ID_LIGHTGUN_CURSOR 3
#define RETRO_DEVICE_ID_LIGHTGUN_TURBO 4
#define RETRO_DEVICE_ID_LIGHTGUN_PAUSE 5
#define RETRO_DEVICE_ID_LIGHTGUN_RELOAD 16 /*Forced off-screen shot*/
#define RETRO_DEVICE_ID_LIGHTGUN_AUX_A 3
#define RETRO_DEVICE_ID_LIGHTGUN_AUX_B 4
#define RETRO_DEVICE_ID_LIGHTGUN_START 6
#define RETRO_DEVICE_ID_LIGHTGUN_SELECT 7
#define RETRO_DEVICE_ID_LIGHTGUN_AUX_C 8
#define RETRO_DEVICE_ID_LIGHTGUN_DPAD_UP 9
#define RETRO_DEVICE_ID_LIGHTGUN_DPAD_DOWN 10
#define RETRO_DEVICE_ID_LIGHTGUN_DPAD_LEFT 11
#define RETRO_DEVICE_ID_LIGHTGUN_DPAD_RIGHT 12
/* deprecated */
#define RETRO_DEVICE_ID_LIGHTGUN_X 0 /*Relative Position*/
#define RETRO_DEVICE_ID_LIGHTGUN_Y 1 /*Relative*/
#define RETRO_DEVICE_ID_LIGHTGUN_CURSOR 3 /*Use Aux:A*/
#define RETRO_DEVICE_ID_LIGHTGUN_TURBO 4 /*Use Aux:B*/
#define RETRO_DEVICE_ID_LIGHTGUN_PAUSE 5 /*Use Start*/
/* Id values for POINTER. */
#define RETRO_DEVICE_ID_POINTER_X 0
@ -237,13 +261,16 @@ enum retro_language
RETRO_LANGUAGE_GERMAN = 4,
RETRO_LANGUAGE_ITALIAN = 5,
RETRO_LANGUAGE_DUTCH = 6,
RETRO_LANGUAGE_PORTUGUESE = 7,
RETRO_LANGUAGE_RUSSIAN = 8,
RETRO_LANGUAGE_KOREAN = 9,
RETRO_LANGUAGE_CHINESE_TRADITIONAL = 10,
RETRO_LANGUAGE_CHINESE_SIMPLIFIED = 11,
RETRO_LANGUAGE_ESPERANTO = 12,
RETRO_LANGUAGE_POLISH = 13,
RETRO_LANGUAGE_PORTUGUESE_BRAZIL = 7,
RETRO_LANGUAGE_PORTUGUESE_PORTUGAL = 8,
RETRO_LANGUAGE_RUSSIAN = 9,
RETRO_LANGUAGE_KOREAN = 10,
RETRO_LANGUAGE_CHINESE_TRADITIONAL = 11,
RETRO_LANGUAGE_CHINESE_SIMPLIFIED = 12,
RETRO_LANGUAGE_ESPERANTO = 13,
RETRO_LANGUAGE_POLISH = 14,
RETRO_LANGUAGE_VIETNAMESE = 15,
RETRO_LANGUAGE_ARABIC = 16,
RETRO_LANGUAGE_LAST,
/* Ensure sizeof(enum) == sizeof(int) */
@ -349,6 +376,10 @@ enum retro_key
RETROK_x = 120,
RETROK_y = 121,
RETROK_z = 122,
RETROK_LEFTBRACE = 123,
RETROK_BAR = 124,
RETROK_RIGHTBRACE = 125,
RETROK_TILDE = 126,
RETROK_DELETE = 127,
RETROK_KP0 = 256,
@ -712,7 +743,7 @@ enum retro_mod
/* struct retro_log_callback * --
* Gets an interface for logging. This is useful for
* logging in a cross-platform way
* as certain platforms cannot use use stderr for logging.
* as certain platforms cannot use stderr for logging.
* It also allows the frontend to
* show logging information in a more suitable way.
* If this interface is not used, libretro cores should
@ -921,9 +952,147 @@ enum retro_mod
* writeable (and readable).
*/
#define RETRO_ENVIRONMENT_SET_HW_SHARED_CONTEXT (44 | RETRO_ENVIRONMENT_EXPERIMENTAL)
/* N/A (null) * --
* The frontend will try to use a 'shared' hardware context (mostly applicable
* to OpenGL) when a hardware context is being set up.
*
* Returns true if the frontend supports shared hardware contexts and false
* if the frontend does not support shared hardware contexts.
*
* This will do nothing on its own until SET_HW_RENDER env callbacks are
* being used.
*/
#define RETRO_ENVIRONMENT_GET_VFS_INTERFACE (45 | RETRO_ENVIRONMENT_EXPERIMENTAL)
/* struct retro_vfs_interface_info * --
* Gets access to the VFS interface.
* VFS presence needs to be queried prior to load_game or any
* get_system/save/other_directory being called to let front end know
* core supports VFS before it starts handing out paths.
* It is recomended to do so in retro_set_environment */
/* VFS functionality */
/* File paths:
* File paths passed as parameters when using this api shall be well formed unix-style,
* using "/" (unquoted forward slash) as directory separator regardless of the platform's native separator.
* Paths shall also include at least one forward slash ("game.bin" is an invalid path, use "./game.bin" instead).
* Other than the directory separator, cores shall not make assumptions about path format:
* "C:/path/game.bin", "http://example.com/game.bin", "#game/game.bin", "./game.bin" (without quotes) are all valid paths.
* Cores may replace the basename or remove path components from the end, and/or add new components;
* however, cores shall not append "./", "../" or multiple consecutive forward slashes ("//") to paths they request to front end.
* The frontend is encouraged to make such paths work as well as it can, but is allowed to give up if the core alters paths too much.
* Frontends are encouraged, but not required, to support native file system paths (modulo replacing the directory separator, if applicable).
* Cores are allowed to try using them, but must remain functional if the front rejects such requests.
* Cores are encouraged to use the libretro-common filestream functions for file I/O,
* as they seamlessly integrate with VFS, deal with directory separator replacement as appropriate
* and provide platform-specific fallbacks in cases where front ends do not support VFS. */
/* Opaque file handle
* Introduced in VFS API v1 */
struct retro_vfs_file_handle;
/* File open flags
* Introduced in VFS API v1 */
#define RETRO_VFS_FILE_ACCESS_READ (1 << 0) /* Read only mode */
#define RETRO_VFS_FILE_ACCESS_WRITE (1 << 1) /* Write only mode, discard contents and overwrites existing file unless RETRO_VFS_FILE_ACCESS_UPDATE is also specified */
#define RETRO_VFS_FILE_ACCESS_READ_WRITE (RETRO_VFS_FILE_ACCESS_READ | RETRO_VFS_FILE_ACCESS_WRITE) /* Read-write mode, discard contents and overwrites existing file unless RETRO_VFS_FILE_ACCESS_UPDATE is also specified*/
#define RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING (1 << 2) /* Prevents discarding content of existing files opened for writing */
/* These are only hints. The frontend may choose to ignore them. Other than RAM/CPU/etc use,
and how they react to unlikely external interference (for example someone else writing to that file,
or the file's server going down), behavior will not change. */
#define RETRO_VFS_FILE_ACCESS_HINT_NONE (0)
/* Indicate that the file will be accessed many times. The frontend should aggressively cache everything. */
#define RETRO_VFS_FILE_ACCESS_HINT_FREQUENT_ACCESS (1 << 0)
/* Seek positions */
#define RETRO_VFS_SEEK_POSITION_START 0
#define RETRO_VFS_SEEK_POSITION_CURRENT 1
#define RETRO_VFS_SEEK_POSITION_END 2
/* Get path from opaque handle. Returns the exact same path passed to file_open when getting the handle
* Introduced in VFS API v1 */
typedef const char *(RETRO_CALLCONV *retro_vfs_get_path_t)(struct retro_vfs_file_handle *stream);
/* Open a file for reading or writing. If path points to a directory, this will
* fail. Returns the opaque file handle, or NULL for error.
* Introduced in VFS API v1 */
typedef struct retro_vfs_file_handle *(RETRO_CALLCONV *retro_vfs_open_t)(const char *path, unsigned mode, unsigned hints);
/* Close the file and release its resources. Must be called if open_file returns non-NULL. Returns 0 on succes, -1 on failure.
* Whether the call succeeds ot not, the handle passed as parameter becomes invalid and should no longer be used.
* Introduced in VFS API v1 */
typedef int (RETRO_CALLCONV *retro_vfs_close_t)(struct retro_vfs_file_handle *stream);
/* Return the size of the file in bytes, or -1 for error.
* Introduced in VFS API v1 */
typedef int64_t (RETRO_CALLCONV *retro_vfs_size_t)(struct retro_vfs_file_handle *stream);
/* Get the current read / write position for the file. Returns - 1 for error.
* Introduced in VFS API v1 */
typedef int64_t (RETRO_CALLCONV *retro_vfs_tell_t)(struct retro_vfs_file_handle *stream);
/* Set the current read/write position for the file. Returns the new position, -1 for error.
* Introduced in VFS API v1 */
typedef int64_t (RETRO_CALLCONV *retro_vfs_seek_t)(struct retro_vfs_file_handle *stream, int64_t offset, int seek_position);
/* Read data from a file. Returns the number of bytes read, or -1 for error.
* Introduced in VFS API v1 */
typedef int64_t (RETRO_CALLCONV *retro_vfs_read_t)(struct retro_vfs_file_handle *stream, void *s, uint64_t len);
/* Write data to a file. Returns the number of bytes written, or -1 for error.
* Introduced in VFS API v1 */
typedef int64_t (RETRO_CALLCONV *retro_vfs_write_t)(struct retro_vfs_file_handle *stream, const void *s, uint64_t len);
/* Flush pending writes to file, if using buffered IO. Returns 0 on sucess, or -1 on failure.
* Introduced in VFS API v1 */
typedef int (RETRO_CALLCONV *retro_vfs_flush_t)(struct retro_vfs_file_handle *stream);
/* Delete the specified file. Returns 0 on success, -1 on failure
* Introduced in VFS API v1 */
typedef int (RETRO_CALLCONV *retro_vfs_remove_t)(const char *path);
/* Rename the specified file. Returns 0 on success, -1 on failure
* Introduced in VFS API v1 */
typedef int (RETRO_CALLCONV *retro_vfs_rename_t)(const char *old_path, const char *new_path);
struct retro_vfs_interface
{
retro_vfs_get_path_t get_path;
retro_vfs_open_t open;
retro_vfs_close_t close;
retro_vfs_size_t size;
retro_vfs_tell_t tell;
retro_vfs_seek_t seek;
retro_vfs_read_t read;
retro_vfs_write_t write;
retro_vfs_flush_t flush;
retro_vfs_remove_t remove;
retro_vfs_rename_t rename;
};
struct retro_vfs_interface_info
{
/* Set by core: should this be higher than the version the front end supports,
* front end will return false in the RETRO_ENVIRONMENT_GET_VFS_INTERFACE call
* Introduced in VFS API v1 */
uint32_t required_interface_version;
/* Frontend writes interface pointer here. The frontend also sets the actual
* version, must be at least required_interface_version.
* Introduced in VFS API v1 */
struct retro_vfs_interface *iface;
};
enum retro_hw_render_interface_type
{
RETRO_HW_RENDER_INTERFACE_VULKAN = 0,
RETRO_HW_RENDER_INTERFACE_D3D9 = 1,
RETRO_HW_RENDER_INTERFACE_D3D10 = 2,
RETRO_HW_RENDER_INTERFACE_D3D11 = 3,
RETRO_HW_RENDER_INTERFACE_D3D12 = 4,
RETRO_HW_RENDER_INTERFACE_DUMMY = INT_MAX
};
@ -934,6 +1103,62 @@ struct retro_hw_render_interface
enum retro_hw_render_interface_type interface_type;
unsigned interface_version;
};
#define RETRO_ENVIRONMENT_GET_LED_INTERFACE (46 | RETRO_ENVIRONMENT_EXPERIMENTAL)
/* struct retro_led_interface * --
* Gets an interface which is used by a libretro core to set
* state of LEDs.
*/
typedef void (RETRO_CALLCONV *retro_set_led_state_t)(int led, int state);
struct retro_led_interface
{
retro_set_led_state_t set_led_state;
};
#define RETRO_ENVIRONMENT_GET_AUDIO_VIDEO_ENABLE (47 | RETRO_ENVIRONMENT_EXPERIMENTAL)
/* int * --
* Tells the core if the frontend wants audio or video.
* If disabled, the frontend will discard the audio or video,
* so the core may decide to skip generating a frame or generating audio.
* This is mainly used for increasing performance.
* Bit 0 (value 1): Enable Video
* Bit 1 (value 2): Enable Audio
* Bit 2 (value 4): Use Fast Savestates.
* Bit 3 (value 8): Hard Disable Audio
* Other bits are reserved for future use and will default to zero.
* If video is disabled:
* * The frontend wants the core to not generate any video,
* including presenting frames via hardware acceleration.
* * The frontend's video frame callback will do nothing.
* * After running the frame, the video output of the next frame should be
* no different than if video was enabled, and saving and loading state
* should have no issues.
* If audio is disabled:
* * The frontend wants the core to not generate any audio.
* * The frontend's audio callbacks will do nothing.
* * After running the frame, the audio output of the next frame should be
* no different than if audio was enabled, and saving and loading state
* should have no issues.
* Fast Savestates:
* * Guaranteed to be created by the same binary that will load them.
* * Will not be written to or read from the disk.
* * Suggest that the core assumes loading state will succeed.
* * Suggest that the core updates its memory buffers in-place if possible.
* * Suggest that the core skips clearing memory.
* * Suggest that the core skips resetting the system.
* * Suggest that the core may skip validation steps.
* Hard Disable Audio:
* * Used for a secondary core when running ahead.
* * Indicates that the frontend will never need audio from the core.
* * Suggests that the core may stop synthesizing audio, but this should not
* compromise emulation accuracy.
* * Audio output for the next frame does not matter, and the frontend will
* never need an accurate audio state in the future.
* * State will never be saved when using Hard Disable Audio.
*/
#define RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE (41 | RETRO_ENVIRONMENT_EXPERIMENTAL)
/* const struct retro_hw_render_interface ** --
* Returns an API specific rendering interface for accessing API specific data.
@ -1006,7 +1231,6 @@ struct retro_hw_render_context_negotiation_interface
* recognize or support. Should be set in either retro_init or retro_load_game, but not both.
*/
#define RETRO_MEMDESC_CONST (1 << 0) /* The frontend will never change this memory area once retro_load_game has returned. */
#define RETRO_MEMDESC_BIGENDIAN (1 << 1) /* The memory area contains big endian data. Default is little endian. */
#define RETRO_MEMDESC_ALIGN_2 (1 << 16) /* All memory access in this area is aligned to their own size, or 2, whichever is smaller. */
@ -1316,6 +1540,7 @@ struct retro_log_callback
#define RETRO_SIMD_POPCNT (1 << 18)
#define RETRO_SIMD_MOVBE (1 << 19)
#define RETRO_SIMD_CMOV (1 << 20)
#define RETRO_SIMD_ASIMD (1 << 21)
typedef uint64_t retro_perf_tick_t;
typedef int64_t retro_time_t;
@ -1662,6 +1887,10 @@ enum retro_hw_context_type
/* Vulkan, see RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE. */
RETRO_HW_CONTEXT_VULKAN = 6,
/* Direct3D, set version_major to select the type of interface
* returned by RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE */
RETRO_HW_CONTEXT_DIRECT3D = 7,
RETRO_HW_CONTEXT_DUMMY = INT_MAX
};
@ -1689,7 +1918,8 @@ struct retro_hw_render_callback
* be providing preallocated framebuffers. */
retro_hw_get_current_framebuffer_t get_current_framebuffer;
/* Set by frontend. */
/* Set by frontend.
* Can return all relevant functions, including glClear on Windows. */
retro_hw_get_proc_address_t get_proc_address;
/* Set if render buffers should have depth component attached.
@ -1972,10 +2202,12 @@ struct retro_variable
struct retro_game_info
{
const char *path; /* Path to game, UTF-8 encoded.
* Usually used as a reference.
* May be NULL if rom was loaded from stdin
* or similar.
* retro_system_info::need_fullpath guaranteed
* Sometimes used as a reference for building other paths.
* May be NULL if game was loaded from stdin or similar,
* but in this case some cores will be unable to load `data`.
* So, it is preferable to fabricate something here instead
* of passing NULL, which will help more cores to succeed.
* retro_system_info::need_fullpath requires
* that this path is valid. */
const void *data; /* Memory buffer of loaded game. Will be NULL
* if need_fullpath was set. */

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010-2017 The RetroArch team
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (memmap.h).
@ -23,7 +23,10 @@
#ifndef _LIBRETRO_MEMMAP_H
#define _LIBRETRO_MEMMAP_H
#if defined(__CELLOS_LV2__) || defined(PSP) || defined(GEKKO) || defined(VITA) || defined(_XBOX) || defined(_3DS) || defined(WIIU)
#include <stdio.h>
#include <stdint.h>
#if defined(__CELLOS_LV2__) || defined(PSP) || defined(GEKKO) || defined(VITA) || defined(_XBOX) || defined(_3DS) || defined(WIIU) || defined(SWITCH)
/* No mman available */
#elif defined(_WIN32) && !defined(_XBOX)
#include <windows.h>

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010-2017 The RetroArch team
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (retro_common.h).

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010-2017 The RetroArch team
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (retro_common_api.h).
@ -75,19 +75,29 @@ typedef int ssize_t;
#include <sys/types.h>
#endif
#ifdef _WIN32
#define STRING_REP_INT64 "%I64u"
#define STRING_REP_UINT64 "%I64u"
#define STRING_REP_ULONG "%Iu"
#elif defined(__STDC_VERSION__) && __STDC_VERSION__>=199901L && !defined(VITA) && !defined(WIIU)
#define STRING_REP_INT64 "%llu"
#define STRING_REP_UINT64 "%llu"
#define STRING_REP_ULONG "%zu"
#ifdef _MSC_VER
#if _MSC_VER >= 1800
#include <inttypes.h>
#else
#define STRING_REP_INT64 "%llu"
#define STRING_REP_UINT64 "%llu"
#define STRING_REP_ULONG "%lu"
#ifndef PRId64
#define PRId64 "I64d"
#define PRIu64 "I64u"
#define PRIuPTR "Iu"
#endif
#endif
#else
/* C++11 says this one isn't needed, but apparently (some versions of) mingw require it anyways */
/* https://stackoverflow.com/questions/8132399/how-to-printf-uint64-t-fails-with-spurious-trailing-in-format */
/* https://github.com/libretro/RetroArch/issues/6009 */
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#endif
#ifndef PRId64
#error "inttypes.h is being screwy"
#endif
#define STRING_REP_INT64 "%" PRId64
#define STRING_REP_UINT64 "%" PRIu64
#define STRING_REP_USIZE "%" PRIuPTR
/*
I would like to see retro_inline.h moved in here; possibly boolean too.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010-2017 The RetroArch team
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (retro_inline.h).

View File

@ -1,116 +0,0 @@
/* Copyright (C) 2010-2017 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (retro_miscellaneous.h).
* ---------------------------------------------------------------------------------------
*
* Permission is hereby granted, free of charge,
* to any person obtaining a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef __RARCH_MISCELLANEOUS_H
#define __RARCH_MISCELLANEOUS_H
#include <stdint.h>
#if defined(__CELLOS_LV2__) && !defined(__PSL1GHT__)
#include <sys/timer.h>
#elif defined(XENON)
#include <time/time.h>
#elif defined(GEKKO) || defined(__PSL1GHT__) || defined(__QNX__)
#include <unistd.h>
#elif defined(WIIU)
#include <wiiu/os/thread.h>
#elif defined(PSP)
#include <pspthreadman.h>
#elif defined(VITA)
#include <psp2/kernel/threadmgr.h>
#elif defined(_3DS)
#include <3ds.h>
#else
#include <time.h>
#endif
#if defined(_WIN32) && !defined(_XBOX)
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#elif defined(_WIN32) && defined(_XBOX)
#include <Xtl.h>
#endif
#include <limits.h>
#ifdef _MSC_VER
#include <compat/msvc.h>
#endif
#include <retro_inline.h>
#ifndef PATH_MAX_LENGTH
#if defined(_XBOX1) || defined(_3DS) || defined(PSP) || defined(GEKKO)|| defined(WIIU)
#define PATH_MAX_LENGTH 512
#else
#define PATH_MAX_LENGTH 4096
#endif
#endif
#ifndef M_PI
#if !defined(_MSC_VER) && !defined(USE_MATH_DEFINES)
#define M_PI 3.14159265358979323846264338327
#endif
#endif
#ifndef MAX
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#endif
#ifndef MIN
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
/* Helper macros and struct to keep track of many booleans.
* To check for multiple bits, use &&, not &.
* For OR, | can be used. */
typedef struct
{
uint32_t data[8];
} retro_bits_t;
#define BIT_SET(a, bit) ((a)[(bit) >> 3] |= (1 << ((bit) & 7)))
#define BIT_CLEAR(a, bit) ((a)[(bit) >> 3] &= ~(1 << ((bit) & 7)))
#define BIT_GET(a, bit) ((a)[(bit) >> 3] & (1 << ((bit) & 7)))
#define BIT16_SET(a, bit) ((a) |= (1 << ((bit) & 15)))
#define BIT16_CLEAR(a, bit) ((a) &= ~(1 << ((bit) & 15)))
#define BIT16_GET(a, bit) (!!((a) & (1 << ((bit) & 15))))
#define BIT16_CLEAR_ALL(a) ((a) = 0)
#define BIT32_SET(a, bit) ((a) |= (1 << ((bit) & 31)))
#define BIT32_CLEAR(a, bit) ((a) &= ~(1 << ((bit) & 31)))
#define BIT32_GET(a, bit) (!!((a) & (1 << ((bit) & 31))))
#define BIT32_CLEAR_ALL(a) ((a) = 0)
#define BIT64_SET(a, bit) ((a) |= (UINT64_C(1) << ((bit) & 63)))
#define BIT64_CLEAR(a, bit) ((a) &= ~(UINT64_C(1) << ((bit) & 63)))
#define BIT64_GET(a, bit) (!!((a) & (UINT64_C(1) << ((bit) & 63))))
#define BIT64_CLEAR_ALL(a) ((a) = 0)
#define BIT128_SET(a, bit) ((a).data[(bit) >> 5] |= (1 << ((bit) & 31)))
#define BIT128_CLEAR(a, bit) ((a).data[(bit) >> 5] &= ~(1 << ((bit) & 31)))
#define BIT128_GET(a, bit) ((a).data[(bit) >> 5] & (1 << ((bit) & 31)))
#define BIT128_CLEAR_ALL(a) memset(&(a), 0, sizeof(a));
#endif

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010-2017 The RetroArch team
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (file_stream.h).
@ -23,68 +23,85 @@
#ifndef __LIBRETRO_SDK_FILE_STREAM_H
#define __LIBRETRO_SDK_FILE_STREAM_H
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <stddef.h>
#include <sys/types.h>
#include <libretro.h>
#include <retro_common_api.h>
#include <retro_inline.h>
#include <boolean.h>
#include <stdarg.h>
#define FILESTREAM_REQUIRED_VFS_VERSION 1
RETRO_BEGIN_DECLS
typedef struct RFILE RFILE;
enum
{
RFILE_MODE_READ = 0,
RFILE_MODE_READ_TEXT,
RFILE_MODE_WRITE,
RFILE_MODE_READ_WRITE,
#define FILESTREAM_REQUIRED_VFS_VERSION 1
/* There is no garantee these requests will be attended. */
RFILE_HINT_UNBUFFERED = 1<<8,
RFILE_HINT_MMAP = 1<<9 /* requires RFILE_MODE_READ */
};
void filestream_vfs_init(const struct retro_vfs_interface_info* vfs_info);
long long int filestream_get_size(RFILE *stream);
int64_t filestream_get_size(RFILE *stream);
void filestream_set_size(RFILE *stream);
/**
* filestream_open:
* @path : path to file
* @mode : file mode to use when opening (read/write)
* @bufsize : optional buffer size (-1 or 0 to use default)
*
* Opens a file for reading or writing, depending on the requested mode.
* Returns a pointer to an RFILE if opened successfully, otherwise NULL.
**/
RFILE *filestream_open(const char *path, unsigned mode, unsigned hints);
const char *filestream_get_ext(RFILE *stream);
int64_t filestream_seek(RFILE *stream, int64_t offset, int seek_position);
RFILE *filestream_open(const char *path, unsigned mode, ssize_t len);
int64_t filestream_read(RFILE *stream, void *data, int64_t len);
ssize_t filestream_seek(RFILE *stream, ssize_t offset, int whence);
int64_t filestream_write(RFILE *stream, const void *data, int64_t len);
ssize_t filestream_read(RFILE *stream, void *data, size_t len);
ssize_t filestream_write(RFILE *stream, const void *data, size_t len);
ssize_t filestream_tell(RFILE *stream);
int64_t filestream_tell(RFILE *stream);
void filestream_rewind(RFILE *stream);
int filestream_close(RFILE *stream);
int filestream_read_file(const char *path, void **buf, ssize_t *len);
int64_t filestream_read_file(const char *path, void **buf, int64_t *len);
char *filestream_gets(RFILE *stream, char *s, size_t len);
char *filestream_getline(RFILE *stream);
int filestream_getc(RFILE *stream);
int filestream_eof(RFILE *stream);
bool filestream_write_file(const char *path, const void *data, ssize_t size);
bool filestream_write_file(const char *path, const void *data, int64_t size);
int filestream_putc(RFILE *stream, int c);
int filestream_get_fd(RFILE *stream);
int filestream_vprintf(RFILE *stream, const char* format, va_list args);
int filestream_printf(RFILE *stream, const char* format, ...);
int filestream_error(RFILE *stream);
int filestream_flush(RFILE *stream);
int filestream_delete(const char *path);
int filestream_rename(const char *old_path, const char *new_path);
const char *filestream_get_path(RFILE *stream);
bool filestream_exists(const char *path);
char *filestream_getline(RFILE *stream);
RETRO_END_DECLS
#endif

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010-2017 The RetroArch team
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (file_stream_transforms.h).
@ -23,38 +23,66 @@
#ifndef __LIBRETRO_SDK_FILE_STREAM_TRANSFORMS_H
#define __LIBRETRO_SDK_FILE_STREAM_TRANSFORMS_H
#include <retro_common_api.h>
#include <streams/file_stream.h>
#include <stdint.h>
#include <string.h>
#include <retro_common_api.h>
#include <streams/file_stream.h>
RETRO_BEGIN_DECLS
#define FILE RFILE
#undef fopen
#undef fclose
#undef ftell
#undef fseek
#undef fread
#undef fgets
#undef fgetc
#undef fwrite
#undef fputc
#undef fprintf
#undef ferror
#undef feof
#define fopen rfopen
#define fclose rfclose
#define ftell rftell
#define fseek rfseek
#define fread rfread
#define fgets rfgets
#define fgetc rfgetc
#define fwrite rfwrite
#define fputc rfputc
#define fprintf rfprintf
#define ferror rferror
#define feof rfeof
RFILE* rfopen(const char *path, char *mode);
RFILE* rfopen(const char *path, const char *mode);
int rfclose(RFILE* stream);
long rftell(RFILE* stream);
int64_t rftell(RFILE* stream);
int rfseek(RFILE* stream, long offset, int origin);
int64_t rfseek(RFILE* stream, int64_t offset, int origin);
size_t rfread(void* buffer,
size_t elementSize, size_t elementCount, RFILE* stream);
int64_t rfread(void* buffer,
size_t elem_size, size_t elem_count, RFILE* stream);
char *rfgets(char *buffer, int maxCount, RFILE* stream);
size_t rfwrite(void const* buffer,
size_t elementSize, size_t elementCount, RFILE* stream);
int rfgetc(RFILE* stream);
int64_t rfwrite(void const* buffer,
size_t elem_size, size_t elem_count, RFILE* stream);
int rfputc(int character, RFILE * stream);
int rfprintf(RFILE * stream, const char * format, ...);
int rferror(RFILE* stream);
int rfeof(RFILE* stream);
RETRO_END_DECLS

View File

@ -0,0 +1,65 @@
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (vfs_implementation.h).
* ---------------------------------------------------------------------------------------
*
* Permission is hereby granted, free of charge,
* to any person obtaining a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef __LIBRETRO_SDK_VFS_IMPLEMENTATION_H
#define __LIBRETRO_SDK_VFS_IMPLEMENTATION_H
#include <stdint.h>
#include <libretro.h>
/* Replace the following symbol with something appropriate
* to signify the file is being compiled for a front end instead of a core.
* This allows the same code to act as reference implementation
* for VFS and as fallbacks for when the front end does not provide VFS functionality.
*/
#ifdef VFS_FRONTEND
typedef struct retro_vfs_file_handle libretro_vfs_implementation_file;
#else
typedef struct libretro_vfs_implementation_file libretro_vfs_implementation_file;
#endif
libretro_vfs_implementation_file *retro_vfs_file_open_impl(const char *path, unsigned mode, unsigned hints);
int retro_vfs_file_close_impl(libretro_vfs_implementation_file *stream);
int retro_vfs_file_error_impl(libretro_vfs_implementation_file *stream);
int64_t retro_vfs_file_size_impl(libretro_vfs_implementation_file *stream);
int64_t retro_vfs_file_tell_impl(libretro_vfs_implementation_file *stream);
int64_t retro_vfs_file_seek_impl(libretro_vfs_implementation_file *stream, int64_t offset, int seek_position);
int64_t retro_vfs_file_read_impl(libretro_vfs_implementation_file *stream, void *s, uint64_t len);
int64_t retro_vfs_file_write_impl(libretro_vfs_implementation_file *stream, const void *s, uint64_t len);
int retro_vfs_file_flush_impl(libretro_vfs_implementation_file *stream);
int retro_vfs_file_remove_impl(const char *path);
int retro_vfs_file_rename_impl(const char *old_path, const char *new_path);
const char *retro_vfs_file_get_path_impl(libretro_vfs_implementation_file *stream);
#endif

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010-2017 The RetroArch team
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (memmap.c).
@ -48,7 +48,8 @@
#endif
#ifdef _WIN32
void* mmap(void *addr, size_t len, int prot, int flags, int fildes, size_t offset)
void* mmap(void *addr, size_t len, int prot, int flags,
int fildes, size_t offset)
{
void *map = (void*)NULL;
HANDLE handle = INVALID_HANDLE_VALUE;
@ -57,28 +58,26 @@ void* mmap(void *addr, size_t len, int prot, int flags, int fildes, size_t offse
{
case PROT_READ:
default:
{
handle = CreateFileMapping((HANDLE) _get_osfhandle(fildes), 0, PAGE_READONLY, 0,
handle = CreateFileMapping((HANDLE)
_get_osfhandle(fildes), 0, PAGE_READONLY, 0,
len, 0);
if (!handle)
break;
map = (void*)MapViewOfFile(handle, FILE_MAP_READ, 0, 0, len);
CloseHandle(handle);
break;
}
case PROT_WRITE:
{
handle = CreateFileMapping((HANDLE) _get_osfhandle(fildes),0,PAGE_READWRITE,0,
handle = CreateFileMapping((HANDLE)
_get_osfhandle(fildes),0,PAGE_READWRITE,0,
len, 0);
if (!handle)
break;
map = (void*)MapViewOfFile(handle, FILE_MAP_WRITE, 0, 0, len);
CloseHandle(handle);
break;
}
case PROT_READWRITE:
{
handle = CreateFileMapping((HANDLE) _get_osfhandle(fildes),0,PAGE_READWRITE,0,
handle = CreateFileMapping((HANDLE)
_get_osfhandle(fildes),0,PAGE_READWRITE,0,
len, 0);
if (!handle)
break;
@ -86,7 +85,7 @@ void* mmap(void *addr, size_t len, int prot, int flags, int fildes, size_t offse
CloseHandle(handle);
break;
}
}
if (map == (void*)NULL)
return((void*)MAP_FAILED);
return((void*) ((int8_t*)map + offset));
@ -110,7 +109,8 @@ int mprotect(void *addr, size_t len, int prot)
}
#elif !defined(HAVE_MMAN)
void* mmap(void *addr, size_t len, int prot, int flags, int fildes, size_t offset)
void* mmap(void *addr, size_t len, int prot, int flags,
int fildes, size_t offset)
{
return malloc(len);
}
@ -123,7 +123,8 @@ int munmap(void *addr, size_t len)
int mprotect(void *addr, size_t len, int prot)
{
/* stub - not really needed at this point since this codepath has no dynarecs */
/* stub - not really needed at this point
* since this codepath has no dynarecs. */
return 0;
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010-2017 The RetroArch team
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (file_stream.c).
@ -23,546 +23,344 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <errno.h>
#if defined(_WIN32)
# ifdef _MSC_VER
# define setmode _setmode
# endif
# ifdef _XBOX
# include <xtl.h>
# define INVALID_FILE_ATTRIBUTES -1
# else
# include <io.h>
# include <fcntl.h>
# include <direct.h>
# include <windows.h>
# endif
#else
# if defined(PSP)
# include <pspiofilemgr.h>
# endif
# include <sys/types.h>
# include <sys/stat.h>
# if !defined(VITA)
# include <dirent.h>
# endif
# include <unistd.h>
#endif
#ifdef __CELLOS_LV2__
#include <cell/cell_fs.h>
#define O_RDONLY CELL_FS_O_RDONLY
#define O_WRONLY CELL_FS_O_WRONLY
#define O_CREAT CELL_FS_O_CREAT
#define O_TRUNC CELL_FS_O_TRUNC
#define O_RDWR CELL_FS_O_RDWR
#else
#include <fcntl.h>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <streams/file_stream.h>
#include <memmap.h>
#include <retro_miscellaneous.h>
#define VFS_FRONTEND
#include <vfs/vfs_implementation.h>
static const int64_t vfs_error_return_value = -1;
static retro_vfs_get_path_t filestream_get_path_cb = NULL;
static retro_vfs_open_t filestream_open_cb = NULL;
static retro_vfs_close_t filestream_close_cb = NULL;
static retro_vfs_size_t filestream_size_cb = NULL;
static retro_vfs_tell_t filestream_tell_cb = NULL;
static retro_vfs_seek_t filestream_seek_cb = NULL;
static retro_vfs_read_t filestream_read_cb = NULL;
static retro_vfs_write_t filestream_write_cb = NULL;
static retro_vfs_flush_t filestream_flush_cb = NULL;
static retro_vfs_remove_t filestream_remove_cb = NULL;
static retro_vfs_rename_t filestream_rename_cb = NULL;
struct RFILE
{
unsigned hints;
char *ext;
long long int size;
#if defined(PSP)
SceUID fd;
#else
#define HAVE_BUFFERED_IO 1
#define MODE_STR_READ "r"
#define MODE_STR_READ_UNBUF "rb"
#define MODE_STR_WRITE_UNBUF "wb"
#define MODE_STR_WRITE_PLUS "w+"
#if defined(HAVE_BUFFERED_IO)
FILE *fp;
#endif
#if defined(HAVE_MMAP)
uint8_t *mapped;
uint64_t mappos;
uint64_t mapsize;
#endif
int fd;
#endif
struct retro_vfs_file_handle *hfile;
bool error_flag;
bool eof_flag;
};
int filestream_get_fd(RFILE *stream)
{
if (!stream)
return -1;
#if defined(HAVE_BUFFERED_IO)
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
return fileno(stream->fp);
#endif
return stream->fd;
}
/* VFS Initialization */
const char *filestream_get_ext(RFILE *stream)
void filestream_vfs_init(const struct retro_vfs_interface_info* vfs_info)
{
if (!stream)
return NULL;
return stream->ext;
}
const struct retro_vfs_interface* vfs_iface;
long long int filestream_get_size(RFILE *stream)
{
if (!stream)
return 0;
return stream->size;
}
filestream_get_path_cb = NULL;
filestream_open_cb = NULL;
filestream_close_cb = NULL;
filestream_tell_cb = NULL;
filestream_size_cb = NULL;
filestream_seek_cb = NULL;
filestream_read_cb = NULL;
filestream_write_cb = NULL;
filestream_flush_cb = NULL;
filestream_remove_cb = NULL;
filestream_rename_cb = NULL;
void filestream_set_size(RFILE *stream)
{
if (!stream)
vfs_iface = vfs_info->iface;
if (vfs_info->required_interface_version < FILESTREAM_REQUIRED_VFS_VERSION
|| !vfs_iface)
return;
filestream_seek(stream, 0, SEEK_SET);
filestream_seek(stream, 0, SEEK_END);
stream->size = filestream_tell(stream);
filestream_seek(stream, 0, SEEK_SET);
filestream_get_path_cb = vfs_iface->get_path;
filestream_open_cb = vfs_iface->open;
filestream_close_cb = vfs_iface->close;
filestream_size_cb = vfs_iface->size;
filestream_tell_cb = vfs_iface->tell;
filestream_seek_cb = vfs_iface->seek;
filestream_read_cb = vfs_iface->read;
filestream_write_cb = vfs_iface->write;
filestream_flush_cb = vfs_iface->flush;
filestream_remove_cb = vfs_iface->remove;
filestream_rename_cb = vfs_iface->rename;
}
RFILE *filestream_open(const char *path, unsigned mode, ssize_t len)
/* Callback wrappers */
bool filestream_exists(const char *path)
{
int flags = 0;
int mode_int = 0;
#if defined(HAVE_BUFFERED_IO)
const char *mode_str = NULL;
#endif
RFILE *stream = (RFILE*)calloc(1, sizeof(*stream));
RFILE *dummy = NULL;
if (!stream)
return NULL;
if (!path || !*path)
return false;
(void)mode_int;
(void)flags;
dummy = filestream_open(path,
RETRO_VFS_FILE_ACCESS_READ,
RETRO_VFS_FILE_ACCESS_HINT_NONE);
stream->hints = mode;
if (!dummy)
return false;
#ifdef HAVE_MMAP
if (stream->hints & RFILE_HINT_MMAP && (stream->hints & 0xff) == RFILE_MODE_READ)
stream->hints |= RFILE_HINT_UNBUFFERED;
else
#endif
stream->hints &= ~RFILE_HINT_MMAP;
switch (mode & 0xff)
{
case RFILE_MODE_READ_TEXT:
#if defined(PSP)
mode_int = 0666;
flags = PSP_O_RDONLY;
#else
#if defined(HAVE_BUFFERED_IO)
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
mode_str = MODE_STR_READ;
#endif
/* No "else" here */
flags = O_RDONLY;
#endif
break;
case RFILE_MODE_READ:
#if defined(PSP)
mode_int = 0666;
flags = PSP_O_RDONLY;
#else
#if defined(HAVE_BUFFERED_IO)
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
mode_str = MODE_STR_READ_UNBUF;
#endif
/* No "else" here */
flags = O_RDONLY;
#endif
break;
case RFILE_MODE_WRITE:
#if defined(PSP)
mode_int = 0666;
flags = PSP_O_CREAT | PSP_O_WRONLY | PSP_O_TRUNC;
#else
#if defined(HAVE_BUFFERED_IO)
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
mode_str = MODE_STR_WRITE_UNBUF;
#endif
else
{
flags = O_WRONLY | O_CREAT | O_TRUNC;
#ifndef _WIN32
flags |= S_IRUSR | S_IWUSR;
#endif
}
#endif
break;
case RFILE_MODE_READ_WRITE:
#if defined(PSP)
mode_int = 0666;
flags = PSP_O_RDWR;
#else
#if defined(HAVE_BUFFERED_IO)
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
mode_str = MODE_STR_WRITE_PLUS;
#endif
else
{
flags = O_RDWR;
#ifdef _WIN32
flags |= O_BINARY;
#endif
}
#endif
break;
}
#if defined(PSP)
stream->fd = sceIoOpen(path, flags, mode_int);
#else
#if defined(HAVE_BUFFERED_IO)
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0 && mode_str)
{
stream->fp = fopen(path, mode_str);
if (!stream->fp)
goto error;
}
else
#endif
{
/* FIXME: HAVE_BUFFERED_IO is always 1, but if it is ever changed, open() needs to be changed to _wopen() for WIndows. */
stream->fd = open(path, flags, mode_int);
if (stream->fd == -1)
goto error;
#ifdef HAVE_MMAP
if (stream->hints & RFILE_HINT_MMAP)
{
stream->mappos = 0;
stream->mapped = NULL;
stream->mapsize = filestream_seek(stream, 0, SEEK_END);
if (stream->mapsize == (uint64_t)-1)
goto error;
filestream_rewind(stream);
stream->mapped = (uint8_t*)mmap((void*)0,
stream->mapsize, PROT_READ, MAP_SHARED, stream->fd, 0);
if (stream->mapped == MAP_FAILED)
stream->hints &= ~RFILE_HINT_MMAP;
}
#endif
}
#endif
#if defined(PSP)
if (stream->fd == -1)
goto error;
#endif
{
const char *ld = (const char*)strrchr(path, '.');
stream->ext = strdup(ld ? ld + 1 : "");
}
filestream_set_size(stream);
return stream;
error:
filestream_close(stream);
return NULL;
filestream_close(dummy);
return true;
}
char *filestream_getline(RFILE *stream)
int64_t filestream_get_size(RFILE *stream)
{
char* newline = (char*)malloc(9);
char* newline_tmp = NULL;
size_t cur_size = 8;
size_t idx = 0;
int in = filestream_getc(stream);
int64_t output;
if (!newline)
if (filestream_size_cb != NULL)
output = filestream_size_cb(stream->hfile);
else
output = retro_vfs_file_size_impl((libretro_vfs_implementation_file*)stream->hfile);
if (output == vfs_error_return_value)
stream->error_flag = true;
return output;
}
/**
* filestream_open:
* @path : path to file
* @mode : file mode to use when opening (read/write)
* @hints :
*
* Opens a file for reading or writing, depending on the requested mode.
* Returns a pointer to an RFILE if opened successfully, otherwise NULL.
**/
RFILE *filestream_open(const char *path, unsigned mode, unsigned hints)
{
struct retro_vfs_file_handle *fp = NULL;
RFILE* output = NULL;
if (filestream_open_cb != NULL)
fp = (struct retro_vfs_file_handle*)
filestream_open_cb(path, mode, hints);
else
fp = (struct retro_vfs_file_handle*)
retro_vfs_file_open_impl(path, mode, hints);
if (!fp)
return NULL;
while (in != EOF && in != '\n')
{
if (idx == cur_size)
{
cur_size *= 2;
newline_tmp = (char*)realloc(newline, cur_size + 1);
if (!newline_tmp)
{
free(newline);
return NULL;
}
newline = newline_tmp;
}
newline[idx++] = in;
in = filestream_getc(stream);
}
newline[idx] = '\0';
return newline;
output = (RFILE*)malloc(sizeof(RFILE));
output->error_flag = false;
output->eof_flag = false;
output->hfile = fp;
return output;
}
char *filestream_gets(RFILE *stream, char *s, size_t len)
{
int c = 0;
char *p = s;
if (!stream)
return NULL;
#if defined(HAVE_BUFFERED_IO)
return fgets(s, (int)len, stream->fp);
#elif defined(PSP)
if(filestream_read(stream,s,len)==len)
return s;
/* get max bytes or up to a newline */
for (len--; len > 0; len--)
{
if ((c = filestream_getc(stream)) == EOF)
break;
*p++ = c;
if (c == '\n')
break;
}
*p = 0;
if (p == s && c == EOF)
return NULL;
#else
return gets(s);
#endif
return (s);
}
int filestream_getc(RFILE *stream)
{
char c = 0;
(void)c;
if (!stream)
return 0;
#if defined(HAVE_BUFFERED_IO)
return fgetc(stream->fp);
#elif defined(PSP)
if(filestream_read(stream, &c, 1) == 1)
return (int)c;
return EOF;
#else
return getc(stream->fd);
#endif
}
ssize_t filestream_seek(RFILE *stream, ssize_t offset, int whence)
int64_t filestream_seek(RFILE *stream, int64_t offset, int seek_position)
{
if (!stream)
goto error;
int64_t output;
#if defined(PSP)
if (sceIoLseek(stream->fd, (SceOff)offset, whence) == -1)
goto error;
#else
if (filestream_seek_cb != NULL)
output = filestream_seek_cb(stream->hfile, offset, seek_position);
else
output = retro_vfs_file_seek_impl((libretro_vfs_implementation_file*)stream->hfile, offset, seek_position);
#if defined(HAVE_BUFFERED_IO)
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
return fseek(stream->fp, (long)offset, whence);
#endif
if (output == vfs_error_return_value)
stream->error_flag = true;
stream->eof_flag = false;
#ifdef HAVE_MMAP
/* Need to check stream->mapped because this function is
* called in filestream_open() */
if (stream->mapped && stream->hints & RFILE_HINT_MMAP)
{
/* fseek() returns error on under/overflow but allows cursor > EOF for
read-only file descriptors. */
switch (whence)
{
case SEEK_SET:
if (offset < 0)
goto error;
stream->mappos = offset;
break;
case SEEK_CUR:
if ((offset < 0 && stream->mappos + offset > stream->mappos) ||
(offset > 0 && stream->mappos + offset < stream->mappos))
goto error;
stream->mappos += offset;
break;
case SEEK_END:
if (stream->mapsize + offset < stream->mapsize)
goto error;
stream->mappos = stream->mapsize + offset;
break;
}
return stream->mappos;
}
#endif
if (lseek(stream->fd, offset, whence) < 0)
goto error;
#endif
return 0;
error:
return -1;
return output;
}
int filestream_eof(RFILE *stream)
{
size_t current_position = filestream_tell(stream);
size_t end_position = filestream_seek(stream, 0, SEEK_END);
filestream_seek(stream, current_position, SEEK_SET);
if (current_position >= end_position)
return 1;
return 0;
return stream->eof_flag;
}
ssize_t filestream_tell(RFILE *stream)
int64_t filestream_tell(RFILE *stream)
{
if (!stream)
goto error;
#if defined(PSP)
if (sceIoLseek(stream->fd, 0, SEEK_CUR) < 0)
goto error;
#else
#if defined(HAVE_BUFFERED_IO)
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
return ftell(stream->fp);
#endif
#ifdef HAVE_MMAP
/* Need to check stream->mapped because this function
* is called in filestream_open() */
if (stream->mapped && stream->hints & RFILE_HINT_MMAP)
return stream->mappos;
#endif
if (lseek(stream->fd, 0, SEEK_CUR) < 0)
goto error;
#endif
int64_t output;
return 0;
if (filestream_size_cb != NULL)
output = filestream_tell_cb(stream->hfile);
else
output = retro_vfs_file_tell_impl((libretro_vfs_implementation_file*)stream->hfile);
error:
return -1;
if (output == vfs_error_return_value)
stream->error_flag = true;
return output;
}
void filestream_rewind(RFILE *stream)
{
filestream_seek(stream, 0L, SEEK_SET);
if (!stream)
return;
filestream_seek(stream, 0L, RETRO_VFS_SEEK_POSITION_START);
stream->error_flag = false;
stream->eof_flag = false;
}
ssize_t filestream_read(RFILE *stream, void *s, size_t len)
int64_t filestream_read(RFILE *stream, void *s, int64_t len)
{
if (!stream || !s)
goto error;
#if defined(PSP)
return sceIoRead(stream->fd, s, len);
#else
#if defined(HAVE_BUFFERED_IO)
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
return fread(s, 1, len, stream->fp);
#endif
#ifdef HAVE_MMAP
if (stream->hints & RFILE_HINT_MMAP)
{
if (stream->mappos > stream->mapsize)
goto error;
int64_t output;
if (stream->mappos + len > stream->mapsize)
len = stream->mapsize - stream->mappos;
if (filestream_read_cb != NULL)
output = filestream_read_cb(stream->hfile, s, len);
else
output = retro_vfs_file_read_impl(
(libretro_vfs_implementation_file*)stream->hfile, s, len);
memcpy(s, &stream->mapped[stream->mappos], len);
stream->mappos += len;
if (output == vfs_error_return_value)
stream->error_flag = true;
if (output < len)
stream->eof_flag = true;
return len;
}
#endif
return read(stream->fd, s, len);
#endif
error:
return -1;
return output;
}
int filestream_flush(RFILE *stream)
{
#if defined(HAVE_BUFFERED_IO)
return fflush(stream->fp);
#else
return 0;
#endif
int output;
if (filestream_flush_cb != NULL)
output = filestream_flush_cb(stream->hfile);
else
output = retro_vfs_file_flush_impl((libretro_vfs_implementation_file*)stream->hfile);
if (output == vfs_error_return_value)
stream->error_flag = true;
return output;
}
ssize_t filestream_write(RFILE *stream, const void *s, size_t len)
int filestream_delete(const char *path)
{
if (!stream)
goto error;
#if defined(PSP)
return sceIoWrite(stream->fd, s, len);
#else
#if defined(HAVE_BUFFERED_IO)
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
return fwrite(s, 1, len, stream->fp);
#endif
#ifdef HAVE_MMAP
if (stream->hints & RFILE_HINT_MMAP)
goto error;
#endif
return write(stream->fd, s, len);
#endif
if (filestream_remove_cb != NULL)
return filestream_remove_cb(path);
error:
return -1;
return retro_vfs_file_remove_impl(path);
}
int filestream_rename(const char *old_path, const char *new_path)
{
if (filestream_rename_cb != NULL)
return filestream_rename_cb(old_path, new_path);
return retro_vfs_file_rename_impl(old_path, new_path);
}
const char *filestream_get_path(RFILE *stream)
{
if (filestream_get_path_cb != NULL)
return filestream_get_path_cb(stream->hfile);
return retro_vfs_file_get_path_impl((libretro_vfs_implementation_file*)stream->hfile);
}
int64_t filestream_write(RFILE *stream, const void *s, int64_t len)
{
int64_t output;
if (filestream_write_cb != NULL)
output = filestream_write_cb(stream->hfile, s, len);
else
output = retro_vfs_file_write_impl((libretro_vfs_implementation_file*)stream->hfile, s, len);
if (output == vfs_error_return_value)
stream->error_flag = true;
return output;
}
int filestream_putc(RFILE *stream, int c)
{
char c_char = (char)c;
if (!stream)
return EOF;
return filestream_write(stream, &c_char, 1)==1 ? c : EOF;
}
#if defined(HAVE_BUFFERED_IO)
return fputc(c, stream->fp);
#else
/* unimplemented */
return EOF;
#endif
int filestream_vprintf(RFILE *stream, const char* format, va_list args)
{
static char buffer[8 * 1024];
int64_t num_chars = vsprintf(buffer, format, args);
if (num_chars < 0)
return -1;
else if (num_chars == 0)
return 0;
return (int)filestream_write(stream, buffer, num_chars);
}
int filestream_printf(RFILE *stream, const char* format, ...)
{
va_list vl;
int result;
va_start(vl, format);
result = filestream_vprintf(stream, format, vl);
va_end(vl);
return result;
}
int filestream_error(RFILE *stream)
{
if (stream && stream->error_flag)
return 1;
return 0;
}
int filestream_close(RFILE *stream)
{
if (!stream)
goto error;
int output;
struct retro_vfs_file_handle* fp = stream->hfile;
if (stream->ext)
free(stream->ext);
#if defined(PSP)
if (stream->fd > 0)
sceIoClose(stream->fd);
#else
#if defined(HAVE_BUFFERED_IO)
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
{
if (stream->fp)
fclose(stream->fp);
}
if (filestream_close_cb != NULL)
output = filestream_close_cb(fp);
else
#endif
#ifdef HAVE_MMAP
if (stream->hints & RFILE_HINT_MMAP)
munmap(stream->mapped, stream->mapsize);
#endif
output = retro_vfs_file_close_impl((libretro_vfs_implementation_file*)fp);
if (stream->fd > 0)
close(stream->fd);
#endif
if (output == 0)
free(stream);
return 0;
error:
return -1;
return output;
}
/**
@ -575,12 +373,14 @@ error:
*
* Returns: number of items read, -1 on error.
*/
int filestream_read_file(const char *path, void **buf, ssize_t *len)
int64_t filestream_read_file(const char *path, void **buf, int64_t *len)
{
ssize_t ret = 0;
ssize_t content_buf_size = 0;
int64_t ret = 0;
int64_t content_buf_size = 0;
void *content_buf = NULL;
RFILE *file = filestream_open(path, RFILE_MODE_READ, -1);
RFILE *file = filestream_open(path,
RETRO_VFS_FILE_ACCESS_READ,
RETRO_VFS_FILE_ACCESS_HINT_NONE);
if (!file)
{
@ -588,21 +388,19 @@ int filestream_read_file(const char *path, void **buf, ssize_t *len)
goto error;
}
if (filestream_seek(file, 0, SEEK_END) != 0)
goto error;
content_buf_size = filestream_get_size(file);
content_buf_size = filestream_tell(file);
if (content_buf_size < 0)
goto error;
filestream_rewind(file);
content_buf = malloc(content_buf_size + 1);
content_buf = malloc((size_t)(content_buf_size + 1));
if (!content_buf)
goto error;
if ((int64_t)(uint64_t)(content_buf_size + 1) != (content_buf_size + 1))
goto error;
ret = filestream_read(file, content_buf, content_buf_size);
ret = filestream_read(file, content_buf, (int64_t)content_buf_size);
if (ret < 0)
{
fprintf(stderr, "Failed to read %s: %s\n", path, strerror(errno));
@ -643,10 +441,12 @@ error:
*
* Returns: true (1) on success, false (0) otherwise.
*/
bool filestream_write_file(const char *path, const void *data, ssize_t size)
bool filestream_write_file(const char *path, const void *data, int64_t size)
{
ssize_t ret = 0;
RFILE *file = filestream_open(path, RFILE_MODE_WRITE, -1);
int64_t ret = 0;
RFILE *file = filestream_open(path,
RETRO_VFS_FILE_ACCESS_WRITE,
RETRO_VFS_FILE_ACCESS_HINT_NONE);
if (!file)
return false;
@ -658,3 +458,44 @@ bool filestream_write_file(const char *path, const void *data, ssize_t size)
return true;
}
char *filestream_getline(RFILE *stream)
{
char* newline_tmp = NULL;
size_t cur_size = 8;
size_t idx = 0;
int in = 0;
char* newline = (char*)malloc(9);
if (!stream || !newline)
{
if (newline)
free(newline);
return NULL;
}
in = filestream_getc(stream);
while (in != EOF && in != '\n')
{
if (idx == cur_size)
{
cur_size *= 2;
newline_tmp = (char*)realloc(newline, cur_size + 1);
if (!newline_tmp)
{
free(newline);
return NULL;
}
newline = newline_tmp;
}
newline[idx++] = in;
in = filestream_getc(stream);
}
newline[idx] = '\0';
return newline;
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010-2017 The RetroArch team
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (file_stream_transforms.c).
@ -20,22 +20,51 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <streams/file_stream.h>
#include <string.h>
#include <stdarg.h>
RFILE* rfopen(const char *path, char *mode)
#include <libretro.h>
#include <streams/file_stream.h>
RFILE* rfopen(const char *path, const char *mode)
{
unsigned int retro_mode = RFILE_MODE_READ_TEXT;
RFILE *output = NULL;
unsigned int retro_mode = RETRO_VFS_FILE_ACCESS_READ;
bool position_to_end = false;
if (strstr(mode, "r"))
if (strstr(mode, "b"))
retro_mode = RFILE_MODE_READ;
if (strstr(mode, "w"))
retro_mode = RFILE_MODE_WRITE;
{
retro_mode = RETRO_VFS_FILE_ACCESS_READ;
if (strstr(mode, "+"))
retro_mode = RFILE_MODE_READ_WRITE;
{
retro_mode = RETRO_VFS_FILE_ACCESS_READ_WRITE |
RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING;
}
}
else if (strstr(mode, "w"))
{
retro_mode = RETRO_VFS_FILE_ACCESS_WRITE;
if (strstr(mode, "+"))
retro_mode = RETRO_VFS_FILE_ACCESS_READ_WRITE;
}
else if (strstr(mode, "a"))
{
retro_mode = RETRO_VFS_FILE_ACCESS_WRITE |
RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING;
position_to_end = true;
if (strstr(mode, "+"))
{
retro_mode = RETRO_VFS_FILE_ACCESS_READ_WRITE |
RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING;
}
}
return filestream_open(path, retro_mode, -1);
output = filestream_open(path, retro_mode,
RETRO_VFS_FILE_ACCESS_HINT_NONE);
if (output && position_to_end)
filestream_seek(output, 0, RETRO_VFS_SEEK_POSITION_END);
return output;
}
int rfclose(RFILE* stream)
@ -43,20 +72,34 @@ int rfclose(RFILE* stream)
return filestream_close(stream);
}
long rftell(RFILE* stream)
int64_t rftell(RFILE* stream)
{
return filestream_tell(stream);
}
int rfseek(RFILE* stream, long offset, int origin)
int64_t rfseek(RFILE* stream, int64_t offset, int origin)
{
return filestream_seek(stream, offset, origin);
int seek_position = -1;
switch (origin)
{
case SEEK_SET:
seek_position = RETRO_VFS_SEEK_POSITION_START;
break;
case SEEK_CUR:
seek_position = RETRO_VFS_SEEK_POSITION_CURRENT;
break;
case SEEK_END:
seek_position = RETRO_VFS_SEEK_POSITION_END;
break;
}
return filestream_seek(stream, offset, seek_position);
}
size_t rfread(void* buffer,
size_t elementSize, size_t elementCount, RFILE* stream)
int64_t rfread(void* buffer,
size_t elem_size, size_t elem_count, RFILE* stream)
{
return filestream_read(stream, buffer, elementSize*elementCount);
return filestream_read(stream, buffer, elem_size * elem_count);
}
char *rfgets(char *buffer, int maxCount, RFILE* stream)
@ -64,8 +107,38 @@ char *rfgets(char *buffer, int maxCount, RFILE* stream)
return filestream_gets(stream, buffer, maxCount);
}
size_t rfwrite(void const* buffer,
size_t elementSize, size_t elementCount, RFILE* stream)
int rfgetc(RFILE* stream)
{
return filestream_write(stream, buffer, elementSize*elementCount);
return filestream_getc(stream);
}
int64_t rfwrite(void const* buffer,
size_t elem_size, size_t elem_count, RFILE* stream)
{
return filestream_write(stream, buffer, elem_size * elem_count);
}
int rfputc(int character, RFILE * stream)
{
return filestream_putc(stream, character);
}
int rfprintf(RFILE * stream, const char * format, ...)
{
int result;
va_list vl;
va_start(vl, format);
result = filestream_vprintf(stream, format, vl);
va_end(vl);
return result;
}
int rferror(RFILE* stream)
{
return filestream_error(stream);
}
int rfeof(RFILE* stream)
{
return filestream_eof(stream);
}

View File

@ -0,0 +1,591 @@
/* Copyright (C) 2010-2018 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (vfs_implementation.c).
* ---------------------------------------------------------------------------------------
*
* Permission is hereby granted, free of charge,
* to any person obtaining a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#if defined(_WIN32)
# ifdef _MSC_VER
# define setmode _setmode
# endif
# ifdef _XBOX
# include <xtl.h>
# define INVALID_FILE_ATTRIBUTES -1
# else
# include <io.h>
# include <fcntl.h>
# include <direct.h>
# include <windows.h>
# endif
#else
# if defined(PSP)
# include <pspiofilemgr.h>
# endif
# include <sys/types.h>
# include <sys/stat.h>
# if !defined(VITA)
# include <dirent.h>
# endif
# include <unistd.h>
#endif
#ifdef __CELLOS_LV2__
#include <cell/cell_fs.h>
#define O_RDONLY CELL_FS_O_RDONLY
#define O_WRONLY CELL_FS_O_WRONLY
#define O_CREAT CELL_FS_O_CREAT
#define O_TRUNC CELL_FS_O_TRUNC
#define O_RDWR CELL_FS_O_RDWR
#else
#include <fcntl.h>
#endif
/* Assume W-functions do not work below Win2K and Xbox platforms */
#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 || defined(_XBOX)
#ifndef LEGACY_WIN32
#define LEGACY_WIN32
#endif
#endif
#if defined(_WIN32) && !defined(_XBOX)
#if !defined(_MSC_VER) || (defined(_MSC_VER) && _MSC_VER >= 1400)
#define ATLEAST_VC2005
#endif
#endif
#ifdef RARCH_INTERNAL
#ifndef VFS_FRONTEND
#define VFS_FRONTEND
#endif
#endif
#include <vfs/vfs_implementation.h>
#include <libretro.h>
#include <memmap.h>
#include <encodings/utf.h>
#include <compat/fopen_utf8.h>
#define RFILE_HINT_UNBUFFERED (1 << 8)
#ifdef VFS_FRONTEND
struct retro_vfs_file_handle
#else
struct libretro_vfs_implementation_file
#endif
{
int fd;
unsigned hints;
int64_t size;
char *buf;
FILE *fp;
char* orig_path;
#if defined(HAVE_MMAP)
uint64_t mappos;
uint64_t mapsize;
uint8_t *mapped;
#endif
};
int64_t retro_vfs_file_seek_internal(libretro_vfs_implementation_file *stream, int64_t offset, int whence)
{
if (!stream)
goto error;
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
/* VC2005 and up have a special 64-bit fseek */
#ifdef ATLEAST_VC2005
return _fseeki64(stream->fp, offset, whence);
#elif defined(__CELLOS_LV2__) || defined(_MSC_VER) && _MSC_VER <= 1310
return fseek(stream->fp, (long)offset, whence);
#else
return fseeko(stream->fp, (off_t)offset, whence);
#endif
#ifdef HAVE_MMAP
/* Need to check stream->mapped because this function is
* called in filestream_open() */
if (stream->mapped && stream->hints &
RETRO_VFS_FILE_ACCESS_HINT_FREQUENT_ACCESS)
{
/* fseek() returns error on under/overflow but
* allows cursor > EOF for
read-only file descriptors. */
switch (whence)
{
case SEEK_SET:
if (offset < 0)
goto error;
stream->mappos = offset;
break;
case SEEK_CUR:
if ((offset < 0 && stream->mappos + offset > stream->mappos) ||
(offset > 0 && stream->mappos + offset < stream->mappos))
goto error;
stream->mappos += offset;
break;
case SEEK_END:
if (stream->mapsize + offset < stream->mapsize)
goto error;
stream->mappos = stream->mapsize + offset;
break;
}
return stream->mappos;
}
#endif
if (lseek(stream->fd, offset, whence) < 0)
goto error;
return 0;
error:
return -1;
}
/**
* retro_vfs_file_open_impl:
* @path : path to file
* @mode : file mode to use when opening (read/write)
* @hints :
*
* Opens a file for reading or writing, depending on the requested mode.
* Returns a pointer to an RFILE if opened successfully, otherwise NULL.
**/
libretro_vfs_implementation_file *retro_vfs_file_open_impl(const char *path, unsigned mode, unsigned hints)
{
int flags = 0;
const char *mode_str = NULL;
libretro_vfs_implementation_file *stream = (libretro_vfs_implementation_file*)calloc(1, sizeof(*stream));
#ifdef VFS_FRONTEND
const char *dumb_prefix = "vfsonly://";
if (!memcmp(path, dumb_prefix, strlen(dumb_prefix)))
path += strlen(dumb_prefix);
#endif
if (!stream)
return NULL;
(void)flags;
stream->hints = hints;
stream->orig_path = strdup(path);
#ifdef HAVE_MMAP
if (stream->hints & RETRO_VFS_FILE_ACCESS_HINT_FREQUENT_ACCESS && mode == RETRO_VFS_FILE_ACCESS_READ)
stream->hints |= RFILE_HINT_UNBUFFERED;
else
#endif
stream->hints &= ~RETRO_VFS_FILE_ACCESS_HINT_FREQUENT_ACCESS;
switch (mode)
{
case RETRO_VFS_FILE_ACCESS_READ:
mode_str = "rb";
flags = O_RDONLY;
#ifdef _WIN32
flags |= O_BINARY;
#endif
break;
case RETRO_VFS_FILE_ACCESS_WRITE:
mode_str = "wb";
flags = O_WRONLY | O_CREAT | O_TRUNC;
#ifndef _WIN32
flags |= S_IRUSR | S_IWUSR;
#else
flags |= O_BINARY;
#endif
break;
case RETRO_VFS_FILE_ACCESS_READ_WRITE:
mode_str = "w+b";
flags = O_RDWR | O_CREAT | O_TRUNC;
#ifndef _WIN32
flags |= S_IRUSR | S_IWUSR;
#else
flags |= O_BINARY;
#endif
break;
case RETRO_VFS_FILE_ACCESS_WRITE | RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING:
case RETRO_VFS_FILE_ACCESS_READ_WRITE | RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING:
mode_str = "r+b";
flags = O_RDWR;
#ifndef _WIN32
flags |= S_IRUSR | S_IWUSR;
#else
flags |= O_BINARY;
#endif
break;
default:
goto error;
}
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
{
FILE *fp = (FILE*)fopen_utf8(path, mode_str);
if (!fp)
goto error;
/* Regarding setvbuf:
*
* https://www.freebsd.org/cgi/man.cgi?query=setvbuf&apropos=0&sektion=0&manpath=FreeBSD+11.1-RELEASE&arch=default&format=html
*
* If the size argument is not zero but buf is NULL, a buffer of the given size will be allocated immediately, and
* released on close. This is an extension to ANSI C.
*
* Since C89 does not support specifying a null buffer with a non-zero size, we create and track our own buffer for it.
*/
/* TODO: this is only useful for a few platforms, find which and add ifdef */
stream->fp = fp;
stream->buf = (char*)calloc(1, 0x4000);
setvbuf(stream->fp, stream->buf, _IOFBF, 0x4000);
}
else
{
#if defined(_WIN32) && !defined(_XBOX)
#if defined(LEGACY_WIN32)
char *path_local = utf8_to_local_string_alloc(path);
stream->fd = open(path_local, flags, 0);
if (path_local)
free(path_local);
#else
wchar_t * path_wide = utf8_to_utf16_string_alloc(path);
stream->fd = _wopen(path_wide, flags, 0);
if (path_wide)
free(path_wide);
#endif
#else
stream->fd = open(path, flags, 0);
#endif
if (stream->fd == -1)
goto error;
#ifdef HAVE_MMAP
if (stream->hints & RETRO_VFS_FILE_ACCESS_HINT_FREQUENT_ACCESS)
{
stream->mappos = 0;
stream->mapped = NULL;
stream->mapsize = retro_vfs_file_seek_internal(stream, 0, SEEK_END);
if (stream->mapsize == (uint64_t)-1)
goto error;
retro_vfs_file_seek_internal(stream, 0, SEEK_SET);
stream->mapped = (uint8_t*)mmap((void*)0,
stream->mapsize, PROT_READ, MAP_SHARED, stream->fd, 0);
if (stream->mapped == MAP_FAILED)
stream->hints &= ~RETRO_VFS_FILE_ACCESS_HINT_FREQUENT_ACCESS;
}
#endif
}
retro_vfs_file_seek_internal(stream, 0, SEEK_SET);
retro_vfs_file_seek_internal(stream, 0, SEEK_END);
stream->size = retro_vfs_file_tell_impl(stream);
retro_vfs_file_seek_internal(stream, 0, SEEK_SET);
return stream;
error:
retro_vfs_file_close_impl(stream);
return NULL;
}
int retro_vfs_file_close_impl(libretro_vfs_implementation_file *stream)
{
if (!stream)
return -1;
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
{
if (stream->fp)
fclose(stream->fp);
}
else
{
#ifdef HAVE_MMAP
if (stream->hints & RETRO_VFS_FILE_ACCESS_HINT_FREQUENT_ACCESS)
munmap(stream->mapped, stream->mapsize);
#endif
}
if (stream->fd > 0)
close(stream->fd);
if (stream->buf)
free(stream->buf);
if (stream->orig_path)
free(stream->orig_path);
free(stream);
return 0;
}
int retro_vfs_file_error_impl(libretro_vfs_implementation_file *stream)
{
return ferror(stream->fp);
}
int64_t retro_vfs_file_size_impl(libretro_vfs_implementation_file *stream)
{
if (!stream)
return 0;
return stream->size;
}
int64_t retro_vfs_file_tell_impl(libretro_vfs_implementation_file *stream)
{
if (!stream)
return -1;
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
/* VC2005 and up have a special 64-bit ftell */
#ifdef ATLEAST_VC2005
return _ftelli64(stream->fp);
#else
return ftell(stream->fp);
#endif
#ifdef HAVE_MMAP
/* Need to check stream->mapped because this function
* is called in filestream_open() */
if (stream->mapped && stream->hints & RETRO_VFS_FILE_ACCESS_HINT_FREQUENT_ACCESS)
return stream->mappos;
#endif
if (lseek(stream->fd, 0, SEEK_CUR) < 0)
return -1;
return 0;
}
int64_t retro_vfs_file_seek_impl(libretro_vfs_implementation_file *stream, int64_t offset, int seek_position)
{
int whence = -1;
switch (seek_position)
{
case RETRO_VFS_SEEK_POSITION_START:
whence = SEEK_SET;
break;
case RETRO_VFS_SEEK_POSITION_CURRENT:
whence = SEEK_CUR;
break;
case RETRO_VFS_SEEK_POSITION_END:
whence = SEEK_END;
break;
}
return retro_vfs_file_seek_internal(stream, offset, whence);
}
int64_t retro_vfs_file_read_impl(libretro_vfs_implementation_file *stream, void *s, uint64_t len)
{
if (!stream || !s)
goto error;
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
return fread(s, 1, (size_t)len, stream->fp);
#ifdef HAVE_MMAP
if (stream->hints & RETRO_VFS_FILE_ACCESS_HINT_FREQUENT_ACCESS)
{
if (stream->mappos > stream->mapsize)
goto error;
if (stream->mappos + len > stream->mapsize)
len = stream->mapsize - stream->mappos;
memcpy(s, &stream->mapped[stream->mappos], len);
stream->mappos += len;
return len;
}
#endif
return read(stream->fd, s, (size_t)len);
error:
return -1;
}
int64_t retro_vfs_file_write_impl(libretro_vfs_implementation_file *stream, const void *s, uint64_t len)
{
if (!stream)
goto error;
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
return fwrite(s, 1, (size_t)len, stream->fp);
#ifdef HAVE_MMAP
if (stream->hints & RETRO_VFS_FILE_ACCESS_HINT_FREQUENT_ACCESS)
goto error;
#endif
return write(stream->fd, s, (size_t)len);
error:
return -1;
}
int retro_vfs_file_flush_impl(libretro_vfs_implementation_file *stream)
{
if (!stream)
return -1;
return fflush(stream->fp)==0 ? 0 : -1;
}
int retro_vfs_file_remove_impl(const char *path)
{
char *path_local = NULL;
wchar_t *path_wide = NULL;
if (!path || !*path)
return -1;
(void)path_local;
(void)path_wide;
#if defined(_WIN32) && !defined(_XBOX)
#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500
path_local = utf8_to_local_string_alloc(path);
if (path_local)
{
int ret = remove(path_local);
free(path_local);
if (ret == 0)
return 0;
}
#else
path_wide = utf8_to_utf16_string_alloc(path);
if (path_wide)
{
int ret = _wremove(path_wide);
free(path_wide);
if (ret == 0)
return 0;
}
#endif
#else
if (remove(path) == 0)
return 0;
#endif
return -1;
}
int retro_vfs_file_rename_impl(const char *old_path, const char *new_path)
{
char *old_path_local = NULL;
char *new_path_local = NULL;
wchar_t *old_path_wide = NULL;
wchar_t *new_path_wide = NULL;
if (!old_path || !*old_path || !new_path || !*new_path)
return -1;
(void)old_path_local;
(void)new_path_local;
(void)old_path_wide;
(void)new_path_wide;
#if defined(_WIN32) && !defined(_XBOX)
#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500
old_path_local = utf8_to_local_string_alloc(old_path);
new_path_local = utf8_to_local_string_alloc(new_path);
if (old_path_local)
{
if (new_path_local)
{
int ret = rename(old_path_local, new_path_local);
free(old_path_local);
free(new_path_local);
return ret==0 ? 0 : -1;
}
free(old_path_local);
}
if (new_path_local)
free(new_path_local);
#else
old_path_wide = utf8_to_utf16_string_alloc(old_path);
new_path_wide = utf8_to_utf16_string_alloc(new_path);
if (old_path_wide)
{
if (new_path_wide)
{
int ret = _wrename(old_path_wide, new_path_wide);
free(old_path_wide);
free(new_path_wide);
return ret==0 ? 0 : -1;
}
free(old_path_wide);
}
if (new_path_wide)
free(new_path_wide);
#endif
return -1;
#else
return rename(old_path, new_path)==0 ? 0 : -1;
#endif
}
const char *retro_vfs_file_get_path_impl(libretro_vfs_implementation_file *stream)
{
/* should never happen, do something noisy so caller can be fixed */
if (!stream)
abort();
return stream->orig_path;
}

View File

@ -70,11 +70,12 @@
#define RETRO_DEVICE_JUSTIFIERS RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_LIGHTGUN, 2)
#define RETRO_DEVICE_GRAPHIC_BOARD RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_POINTER, 0)
#include <libretro.h>
#include <streams/file_stream.h>
#include "shared.h"
#include "libretro.h"
#include "md_ntsc.h"
#include "sms_ntsc.h"
#include <streams/file_stream.h>
#define STATIC_ASSERT(name, test) typedef struct { int assert_[(test)?1:-1]; } assert_ ## name ## _
#define M68K_MAX_CYCLES 1107
@ -201,10 +202,11 @@ void error(char * fmt, ...)
int load_archive(char *filename, unsigned char *buffer, int maxsize, char *extension)
{
int size, left;
int64_t left = 0;
int64_t size = 0;
/* Open file */
RFILE *fd = filestream_open(filename, RFILE_MODE_READ, -1);
RFILE *fd = filestream_open(filename, RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE);
if (!fd)
{
@ -240,9 +242,7 @@ int load_archive(char *filename, unsigned char *buffer, int maxsize, char *exten
return 0;
}
else if (size > maxsize)
{
size = maxsize;
}
if (log_cb)
log_cb(RETRO_LOG_INFO, "INFORMATION - Loading %d bytes ...\n", size);
@ -509,9 +509,28 @@ void osd_input_update(void)
static void draw_cursor(int16_t x, int16_t y, uint16_t color)
{
int i;
/* crosshair center position */
uint16_t *ptr = (uint16_t *)bitmap.data + ((bitmap.viewport.y + y) * bitmap.width) + x + bitmap.viewport.x;
ptr[-3*bitmap.width] = ptr[-bitmap.width] = ptr[bitmap.width] = ptr[3*bitmap.width] = ptr[-3] = ptr[-1] = ptr[1] = ptr[3] = color;
ptr[-2*bitmap.width] = ptr[2*bitmap.width] = ptr[-2] = ptr[2] = ptr[0] = 0xffff;
/* default crosshair dimension */
int x_start = x - 3;
int x_end = x + 3;
int y_start = y - 3;
int y_end = y + 3;
/* framebuffer limits */
if (x_start < -bitmap.viewport.x) x_start = -bitmap.viewport.x;
if (x_end >= (bitmap.viewport.w + bitmap.viewport.x)) x_end = bitmap.viewport.w + bitmap.viewport.x - 1;
if (y_start < -bitmap.viewport.y) y_start = -bitmap.viewport.y;
if (y_end >= (bitmap.viewport.h + bitmap.viewport.y)) y_end = bitmap.viewport.h + bitmap.viewport.y - 1;
/* draw crosshair */
for (i = (x_start - x); i <= (x_end - x); i++)
ptr[i] = (i & 1) ? color : 0xffff;
for (i = (y_start - y); i <= (y_end - y); i++)
ptr[i * bitmap.width] = (i & 1) ? color : 0xffff;
}
static void init_bitmap(void)
@ -586,13 +605,13 @@ static void bram_load(void)
switch (region_code)
{
case REGION_JAPAN_NTSC:
fp = filestream_open(CD_BRAM_JP, RFILE_MODE_READ, -1);
fp = filestream_open(CD_BRAM_JP, RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE);
break;
case REGION_EUROPE:
fp = filestream_open(CD_BRAM_EU, RFILE_MODE_READ, -1);
fp = filestream_open(CD_BRAM_EU, RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE);
break;
case REGION_USA:
fp = filestream_open(CD_BRAM_US, RFILE_MODE_READ, -1);
fp = filestream_open(CD_BRAM_US, RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE);
break;
default:
return;
@ -632,7 +651,7 @@ static void bram_load(void)
/* automatically load cartridge backup RAM (if enabled) */
if (scd.cartridge.id)
{
fp = filestream_open(CART_BRAM, RFILE_MODE_READ, -1);
fp = filestream_open(CART_BRAM, RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE);
if (fp != NULL)
{
int filesize = scd.cartridge.mask + 1;
@ -688,13 +707,13 @@ static void bram_save(void)
switch (region_code)
{
case REGION_JAPAN_NTSC:
fp = filestream_open(CD_BRAM_JP, RFILE_MODE_WRITE, -1);
fp = filestream_open(CD_BRAM_JP, RETRO_VFS_FILE_ACCESS_WRITE, RETRO_VFS_FILE_ACCESS_HINT_NONE);
break;
case REGION_EUROPE:
fp = filestream_open(CD_BRAM_EU, RFILE_MODE_WRITE, -1);
fp = filestream_open(CD_BRAM_EU, RETRO_VFS_FILE_ACCESS_WRITE, RETRO_VFS_FILE_ACCESS_HINT_NONE);
break;
case REGION_USA:
fp = filestream_open(CD_BRAM_US, RFILE_MODE_WRITE, -1);
fp = filestream_open(CD_BRAM_US, RETRO_VFS_FILE_ACCESS_WRITE, RETRO_VFS_FILE_ACCESS_HINT_NONE);
break;
default:
return;
@ -717,7 +736,7 @@ static void bram_save(void)
/* check if it is correctly formatted before saving */
if (!memcmp(scd.cartridge.area + scd.cartridge.mask + 1 - 0x20, brm_format + 0x20, 0x20))
{
fp = filestream_open(CART_BRAM, RFILE_MODE_WRITE, -1);
fp = filestream_open(CART_BRAM, RETRO_VFS_FILE_ACCESS_WRITE, RETRO_VFS_FILE_ACCESS_HINT_NONE);
if (fp != NULL)
{
int filesize = scd.cartridge.mask + 1;
@ -1751,6 +1770,7 @@ unsigned retro_api_version(void) { return RETRO_API_VERSION; }
void retro_set_environment(retro_environment_t cb)
{
struct retro_vfs_interface_info vfs_iface_info;
static const struct retro_variable vars[] = {
{ "genesis_plus_gx_system_hw", "System hardware; auto|sg-1000|sg-1000 II|mark-III|master system|master system II|game gear|mega drive / genesis" },
{ "genesis_plus_gx_region_detect", "System region; auto|ntsc-u|pal|ntsc-j" },
@ -1949,6 +1969,12 @@ void retro_set_environment(retro_environment_t cb)
cb(RETRO_ENVIRONMENT_SET_VARIABLES, (void*)vars);
cb(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports);
cb(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, (void*)desc);
vfs_iface_info.required_interface_version = 1;
vfs_iface_info.iface = NULL;
if (environ_cb(RETRO_ENVIRONMENT_GET_VFS_INTERFACE, &vfs_iface_info))
filestream_vfs_init(&vfs_iface_info);
}
void retro_set_video_refresh(retro_video_refresh_t cb) { video_cb = cb; }
@ -2198,7 +2224,7 @@ void retro_cheat_set(unsigned index, bool enabled, const char *code)
bool retro_load_game(const struct retro_game_info *info)
{
int i;
const char *dir = NULL;
char *dir = NULL;
#if defined(_WIN32)
char slash = '\\';
#else
@ -2384,6 +2410,9 @@ size_t retro_get_memory_size(unsigned id)
}
}
case RETRO_MEMORY_SYSTEM_RAM:
if (system_hw == SYSTEM_SMS || system_hw == SYSTEM_SMS2 || system_hw == SYSTEM_GG || system_hw == SYSTEM_GGMS)
return 0x02000;
else
return 0x10000;
default:
return 0;

View File

@ -1,31 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27703.2035
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gx_vstudio", "gx_vstudio.vcxproj", "{02639D27-5E68-4F28-8A80-8BA00D9D9547}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{02639D27-5E68-4F28-8A80-8BA00D9D9547}.Debug|x64.ActiveCfg = Debug|x64
{02639D27-5E68-4F28-8A80-8BA00D9D9547}.Debug|x64.Build.0 = Debug|x64
{02639D27-5E68-4F28-8A80-8BA00D9D9547}.Debug|x86.ActiveCfg = Debug|Win32
{02639D27-5E68-4F28-8A80-8BA00D9D9547}.Debug|x86.Build.0 = Debug|Win32
{02639D27-5E68-4F28-8A80-8BA00D9D9547}.Release|x64.ActiveCfg = Release|x64
{02639D27-5E68-4F28-8A80-8BA00D9D9547}.Release|x64.Build.0 = Release|x64
{02639D27-5E68-4F28-8A80-8BA00D9D9547}.Release|x86.ActiveCfg = Release|Win32
{02639D27-5E68-4F28-8A80-8BA00D9D9547}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {3F183379-6CD9-42BB-BEF2-D0C3030ABB87}
EndGlobalSection
EndGlobal

View File

@ -1,430 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>15.0</VCProjectVersion>
<ProjectGuid>{02639D27-5E68-4F28-8A80-8BA00D9D9547}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>gxvstudio</RootNamespace>
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
<ProjectName>genesis_plus_gx_libretro</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_USRDLL;_CRT_SECURE_NO_WARNINGS;INLINE=static inline;_7ZIP_ST;FLAC__NO_DLL;FLAC__HAS_OGG=0;PACKAGE_VERSION="1.3.2";LSB_FIRST;USE_16BPP_RENDERING;FRONTEND_SUPPORTS_RGB565;USE_LIBTREMOR;USE_LIBCHDR;MAXROMSIZE=33554432;HAVE_YM3438_CORE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>..\;..\..\core\;..\..\core\m68k\;..\..\core\z80\;..\..\core\input_hw\;..\..\core\sound\;..\..\core\cart_hw\;..\..\core\cart_hw\svp\;..\..\core\cd_hw\;..\..\core\cd_hw\libchdr\deps\libFLAC\include\;..\..\core\cd_hw\libchdr\deps\lzma\;..\..\core\cd_hw\libchdr\deps\zlib\;..\..\core\ntsc\;..\libretro-common\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>NotSet</SubSystem>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<StackReserveSize>4194304</StackReserveSize>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_DEBUG;_USRDLL;_CRT_SECURE_NO_WARNINGS;INLINE=static inline;_7ZIP_ST;FLAC__NO_DLL;FLAC__HAS_OGG=0;PACKAGE_VERSION="1.3.2";LSB_FIRST;USE_16BPP_RENDERING;FRONTEND_SUPPORTS_RGB565;USE_LIBTREMOR;USE_LIBCHDR;MAXROMSIZE=33554432;HAVE_YM3438_CORE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>..\;..\..\core\;..\..\core\m68k\;..\..\core\z80\;..\..\core\input_hw\;..\..\core\sound\;..\..\core\cart_hw\;..\..\core\cart_hw\svp\;..\..\core\cd_hw\;..\..\core\cd_hw\libchdr\deps\libFLAC\include\;..\..\core\cd_hw\libchdr\deps\lzma\;..\..\core\cd_hw\libchdr\deps\zlib\;..\..\core\ntsc\;..\libretro-common\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>NotSet</SubSystem>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_USRDLL;_CRT_SECURE_NO_WARNINGS;INLINE=static inline;_7ZIP_ST;FLAC__NO_DLL;FLAC__HAS_OGG=0;PACKAGE_VERSION="1.3.2";LSB_FIRST;USE_16BPP_RENDERING;FRONTEND_SUPPORTS_RGB565;USE_LIBTREMOR;USE_LIBCHDR;MAXROMSIZE=33554432;HAVE_YM3438_CORE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>..\;..\..\core\;..\..\core\m68k\;..\..\core\z80\;..\..\core\input_hw\;..\..\core\sound\;..\..\core\cart_hw\;..\..\core\cart_hw\svp\;..\..\core\cd_hw\;..\..\core\cd_hw\libchdr\deps\libFLAC\include\;..\..\core\cd_hw\libchdr\deps\lzma\;..\..\core\cd_hw\libchdr\deps\zlib\;..\..\core\ntsc\;..\libretro-common\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>NotSet</SubSystem>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NDEBUG;_USRDLL;_CRT_SECURE_NO_WARNINGS;INLINE=static inline;_7ZIP_ST;FLAC__NO_DLL;FLAC__HAS_OGG=0;PACKAGE_VERSION="1.3.2";LSB_FIRST;USE_16BPP_RENDERING;FRONTEND_SUPPORTS_RGB565;USE_LIBTREMOR;USE_LIBCHDR;MAXROMSIZE=33554432;HAVE_YM3438_CORE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>..\;..\..\core\;..\..\core\m68k\;..\..\core\z80\;..\..\core\input_hw\;..\..\core\sound\;..\..\core\cart_hw\;..\..\core\cart_hw\svp\;..\..\core\cd_hw\;..\..\core\cd_hw\libchdr\deps\libFLAC\include\;..\..\core\cd_hw\libchdr\deps\lzma\;..\..\core\cd_hw\libchdr\deps\zlib\;..\..\core\ntsc\;..\libretro-common\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>NotSet</SubSystem>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="..\..\core\cart_hw\areplay.h" />
<ClInclude Include="..\..\core\cart_hw\eeprom_93c.h" />
<ClInclude Include="..\..\core\cart_hw\eeprom_i2c.h" />
<ClInclude Include="..\..\core\cart_hw\eeprom_spi.h" />
<ClInclude Include="..\..\core\cart_hw\ggenie.h" />
<ClInclude Include="..\..\core\cart_hw\md_cart.h" />
<ClInclude Include="..\..\core\cart_hw\sms_cart.h" />
<ClInclude Include="..\..\core\cart_hw\sram.h" />
<ClInclude Include="..\..\core\cart_hw\svp\ssp16.h" />
<ClInclude Include="..\..\core\cart_hw\svp\svp.h" />
<ClInclude Include="..\..\core\cd_hw\cdc.h" />
<ClInclude Include="..\..\core\cd_hw\cdd.h" />
<ClInclude Include="..\..\core\cd_hw\cd_cart.h" />
<ClInclude Include="..\..\core\cd_hw\gfx.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\FLAC\assert.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\FLAC\callback.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\FLAC\export.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\FLAC\format.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\FLAC\metadata.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\FLAC\ordinals.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\FLAC\stream_decoder.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\bitmath.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\bitreader.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\cpu.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\crc.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\fixed.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\float.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\format.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\lpc.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\macros.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\md5.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\memory.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\protected\stream_decoder.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\share\alloc.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\share\compat.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\share\endswap.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\lzma\7zTypes.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\lzma\Compiler.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\lzma\LzFind.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\lzma\LzHash.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\lzma\LzmaDec.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\lzma\LzmaEnc.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\lzma\Precomp.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\zlib\gzguts.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\zlib\inffast.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\zlib\inffixed.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\zlib\inflate.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\zlib\inftrees.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\zlib\zconf.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\zlib\zlib.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\zlib\zutil.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\src\bitstream.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\src\cdrom.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\src\chd.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\src\coretypes.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\src\flac.h" />
<ClInclude Include="..\..\core\cd_hw\libchdr\src\huffman.h" />
<ClInclude Include="..\..\core\cd_hw\pcm.h" />
<ClInclude Include="..\..\core\cd_hw\scd.h" />
<ClInclude Include="..\..\core\genesis.h" />
<ClInclude Include="..\..\core\hvc.h" />
<ClInclude Include="..\..\core\input_hw\activator.h" />
<ClInclude Include="..\..\core\input_hw\gamepad.h" />
<ClInclude Include="..\..\core\input_hw\graphic_board.h" />
<ClInclude Include="..\..\core\input_hw\input.h" />
<ClInclude Include="..\..\core\input_hw\lightgun.h" />
<ClInclude Include="..\..\core\input_hw\mouse.h" />
<ClInclude Include="..\..\core\input_hw\paddle.h" />
<ClInclude Include="..\..\core\input_hw\sportspad.h" />
<ClInclude Include="..\..\core\input_hw\teamplayer.h" />
<ClInclude Include="..\..\core\input_hw\terebi_oekaki.h" />
<ClInclude Include="..\..\core\input_hw\xe_1ap.h" />
<ClInclude Include="..\..\core\io_ctrl.h" />
<ClInclude Include="..\..\core\loadrom.h" />
<ClInclude Include="..\..\core\m68k\m68k.h" />
<ClInclude Include="..\..\core\m68k\m68kconf.h" />
<ClInclude Include="..\..\core\m68k\m68kcpu.h" />
<ClInclude Include="..\..\core\m68k\m68ki_cycles.h" />
<ClInclude Include="..\..\core\m68k\m68ki_instruction_jump_table.h" />
<ClInclude Include="..\..\core\m68k\m68kops.h" />
<ClInclude Include="..\..\core\m68k\s68kconf.h" />
<ClInclude Include="..\..\core\m68k\s68ki_cycles.h" />
<ClInclude Include="..\..\core\macros.h" />
<ClInclude Include="..\..\core\mem68k.h" />
<ClInclude Include="..\..\core\membnk.h" />
<ClInclude Include="..\..\core\memz80.h" />
<ClInclude Include="..\..\core\ntsc\md_ntsc.h" />
<ClInclude Include="..\..\core\ntsc\md_ntsc_config.h" />
<ClInclude Include="..\..\core\ntsc\md_ntsc_impl.h" />
<ClInclude Include="..\..\core\ntsc\sms_ntsc.h" />
<ClInclude Include="..\..\core\ntsc\sms_ntsc_config.h" />
<ClInclude Include="..\..\core\ntsc\sms_ntsc_impl.h" />
<ClInclude Include="..\..\core\shared.h" />
<ClInclude Include="..\..\core\sound\blip_buf.h" />
<ClInclude Include="..\..\core\sound\eq.h" />
<ClInclude Include="..\..\core\sound\psg.h" />
<ClInclude Include="..\..\core\sound\sound.h" />
<ClInclude Include="..\..\core\sound\ym2413.h" />
<ClInclude Include="..\..\core\sound\ym2612.h" />
<ClInclude Include="..\..\core\sound\ym3438.h" />
<ClInclude Include="..\..\core\state.h" />
<ClInclude Include="..\..\core\system.h" />
<ClInclude Include="..\..\core\tremor\asm_arm.h" />
<ClInclude Include="..\..\core\tremor\backends.h" />
<ClInclude Include="..\..\core\tremor\block.h" />
<ClInclude Include="..\..\core\tremor\codebook.h" />
<ClInclude Include="..\..\core\tremor\codec_internal.h" />
<ClInclude Include="..\..\core\tremor\config_types.h" />
<ClInclude Include="..\..\core\tremor\ivorbiscodec.h" />
<ClInclude Include="..\..\core\tremor\ivorbisfile.h" />
<ClInclude Include="..\..\core\tremor\lsp_lookup.h" />
<ClInclude Include="..\..\core\tremor\mdct.h" />
<ClInclude Include="..\..\core\tremor\mdct_lookup.h" />
<ClInclude Include="..\..\core\tremor\misc.h" />
<ClInclude Include="..\..\core\tremor\ogg.h" />
<ClInclude Include="..\..\core\tremor\os.h" />
<ClInclude Include="..\..\core\tremor\os_types.h" />
<ClInclude Include="..\..\core\tremor\registry.h" />
<ClInclude Include="..\..\core\tremor\window.h" />
<ClInclude Include="..\..\core\tremor\window_lookup.h" />
<ClInclude Include="..\..\core\types.h" />
<ClInclude Include="..\..\core\vdp_ctrl.h" />
<ClInclude Include="..\..\core\vdp_render.h" />
<ClInclude Include="..\..\core\z80\osd_cpu.h" />
<ClInclude Include="..\..\core\z80\z80.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\boolean.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\compat\apple_compat.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\compat\fnmatch.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\compat\getopt.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\compat\ifaddrs.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\compat\intrinsics.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\compat\msvc.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\compat\msvc\stdint.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\compat\posix_string.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\compat\strcasestr.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\compat\strl.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\compat\zconf.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\compat\zlib.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\compat\zutil.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\memmap.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\retro_common.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\retro_common_api.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\retro_inline.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\retro_miscellaneous.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\streams\file_stream.h" />
<ClInclude Include="..\..\libretro\libretro-common\include\streams\file_stream_transforms.h" />
<ClInclude Include="..\..\libretro\libretro.h" />
<ClInclude Include="..\..\libretro\osd.h" />
<ClInclude Include="..\..\libretro\scrc32.h" />
</ItemGroup>
<ItemGroup>
<Text Include="..\..\core\cart_hw\svp\imageformat.txt" />
<Text Include="..\..\core\cart_hw\svp\svpdoc.txt" />
<Text Include="..\..\core\cd_hw\libchdr\deps\lzma\DOC\lzma-history.txt" />
<Text Include="..\..\core\cd_hw\libchdr\deps\lzma\DOC\lzma-sdk.txt" />
<Text Include="..\..\core\cd_hw\libchdr\deps\lzma\DOC\lzma-specification.txt" />
<Text Include="..\..\core\cd_hw\libchdr\deps\lzma\DOC\lzma.txt" />
<Text Include="..\..\core\cd_hw\libchdr\LICENSE.txt" />
<Text Include="..\..\core\m68k\readme.txt" />
<Text Include="..\..\core\ntsc\changes.txt" />
<Text Include="..\..\core\ntsc\license.txt" />
<Text Include="..\..\core\ntsc\readme.txt" />
<Text Include="..\..\core\ntsc\sms_ntsc.txt" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\core\cart_hw\areplay.c" />
<ClCompile Include="..\..\core\cart_hw\eeprom_93c.c" />
<ClCompile Include="..\..\core\cart_hw\eeprom_i2c.c" />
<ClCompile Include="..\..\core\cart_hw\eeprom_spi.c" />
<ClCompile Include="..\..\core\cart_hw\ggenie.c" />
<ClCompile Include="..\..\core\cart_hw\md_cart.c" />
<ClCompile Include="..\..\core\cart_hw\sms_cart.c" />
<ClCompile Include="..\..\core\cart_hw\sram.c" />
<ClCompile Include="..\..\core\cart_hw\svp\ssp16.c" />
<ClCompile Include="..\..\core\cart_hw\svp\svp.c" />
<ClCompile Include="..\..\core\cd_hw\cdc.c" />
<ClCompile Include="..\..\core\cd_hw\cdd.c" />
<ClCompile Include="..\..\core\cd_hw\cd_cart.c" />
<ClCompile Include="..\..\core\cd_hw\gfx.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\bitmath.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\bitreader.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\cpu.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\crc.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\fixed.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\float.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\format.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\lpc.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\lpc_intrin_avx2.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\lpc_intrin_sse.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\lpc_intrin_sse2.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\lpc_intrin_sse41.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\md5.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\memory.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\stream_decoder.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\lzma\LzFind.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\lzma\LzmaDec.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\lzma\LzmaEnc.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\zlib\adler32.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\zlib\inffast.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\zlib\inflate.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\zlib\inftrees.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\zlib\zutil.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\src\bitstream.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\src\cdrom.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\src\chd.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\src\flac.c" />
<ClCompile Include="..\..\core\cd_hw\libchdr\src\huffman.c" />
<ClCompile Include="..\..\core\cd_hw\pcm.c" />
<ClCompile Include="..\..\core\cd_hw\scd.c" />
<ClCompile Include="..\..\core\genesis.c" />
<ClCompile Include="..\..\core\input_hw\activator.c" />
<ClCompile Include="..\..\core\input_hw\gamepad.c" />
<ClCompile Include="..\..\core\input_hw\graphic_board.c" />
<ClCompile Include="..\..\core\input_hw\input.c" />
<ClCompile Include="..\..\core\input_hw\lightgun.c" />
<ClCompile Include="..\..\core\input_hw\mouse.c" />
<ClCompile Include="..\..\core\input_hw\paddle.c" />
<ClCompile Include="..\..\core\input_hw\sportspad.c" />
<ClCompile Include="..\..\core\input_hw\teamplayer.c" />
<ClCompile Include="..\..\core\input_hw\terebi_oekaki.c" />
<ClCompile Include="..\..\core\input_hw\xe_1ap.c" />
<ClCompile Include="..\..\core\io_ctrl.c" />
<ClCompile Include="..\..\core\loadrom.c" />
<ClCompile Include="..\..\core\m68k\m68kcpu.c" />
<ClCompile Include="..\..\core\m68k\s68kcpu.c" />
<ClCompile Include="..\..\core\mem68k.c" />
<ClCompile Include="..\..\core\membnk.c" />
<ClCompile Include="..\..\core\memz80.c" />
<ClCompile Include="..\..\core\ntsc\md_ntsc.c" />
<ClCompile Include="..\..\core\ntsc\sms_ntsc.c" />
<ClCompile Include="..\..\core\sound\blip_buf.c" />
<ClCompile Include="..\..\core\sound\eq.c" />
<ClCompile Include="..\..\core\sound\psg.c" />
<ClCompile Include="..\..\core\sound\sound.c" />
<ClCompile Include="..\..\core\sound\ym2413.c" />
<ClCompile Include="..\..\core\sound\ym2612.c" />
<ClCompile Include="..\..\core\sound\ym3438.c" />
<ClCompile Include="..\..\core\state.c" />
<ClCompile Include="..\..\core\system.c" />
<ClCompile Include="..\..\core\tremor\bitwise.c" />
<ClCompile Include="..\..\core\tremor\block.c" />
<ClCompile Include="..\..\core\tremor\codebook.c" />
<ClCompile Include="..\..\core\tremor\floor0.c" />
<ClCompile Include="..\..\core\tremor\floor1.c" />
<ClCompile Include="..\..\core\tremor\framing.c" />
<ClCompile Include="..\..\core\tremor\info.c" />
<ClCompile Include="..\..\core\tremor\mapping0.c" />
<ClCompile Include="..\..\core\tremor\mdct.c" />
<ClCompile Include="..\..\core\tremor\registry.c" />
<ClCompile Include="..\..\core\tremor\res012.c" />
<ClCompile Include="..\..\core\tremor\sharedbook.c" />
<ClCompile Include="..\..\core\tremor\synthesis.c" />
<ClCompile Include="..\..\core\tremor\vorbisfile.c" />
<ClCompile Include="..\..\core\tremor\window.c" />
<ClCompile Include="..\..\core\vdp_ctrl.c" />
<ClCompile Include="..\..\core\vdp_render.c" />
<ClCompile Include="..\..\core\z80\z80.c" />
<ClCompile Include="..\..\libretro\libretro-common\memmap\memmap.c" />
<ClCompile Include="..\..\libretro\libretro-common\streams\file_stream.c" />
<ClCompile Include="..\..\libretro\libretro-common\streams\file_stream_transforms.c" />
<ClCompile Include="..\..\libretro\libretro.c" />
<ClCompile Include="..\..\libretro\scrc32.c" />
</ItemGroup>
<ItemGroup>
<None Include="..\..\core\cd_hw\libchdr\deps\libFLAC\AUTHORS" />
<None Include="..\..\core\cd_hw\libchdr\deps\libFLAC\COPYING.Xiph" />
<None Include="..\..\core\cd_hw\libchdr\deps\libFLAC\README" />
<None Include="..\..\core\cd_hw\libchdr\deps\zlib\ChangeLog" />
<None Include="..\..\core\cd_hw\libchdr\deps\zlib\README" />
<None Include="..\..\core\cd_hw\libchdr\README.md" />
<None Include="..\..\core\tremor\CHANGELOG" />
<None Include="..\..\core\tremor\COPYING" />
<None Include="..\..\core\tremor\README" />
<None Include="libretro.def" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -1,970 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="src">
<UniqueIdentifier>{5706ae08-ac21-49ce-ade8-175dc9e7ae71}</UniqueIdentifier>
</Filter>
<Filter Include="src\core">
<UniqueIdentifier>{6156e4ef-f1c0-4751-a570-6aa58a42f18b}</UniqueIdentifier>
</Filter>
<Filter Include="includes">
<UniqueIdentifier>{e3c87277-1a94-4196-a336-ddf7af8ac7a5}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\cart_hw">
<UniqueIdentifier>{d8d8dfd7-8662-4605-a40e-033e60c85127}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\cart_hw\svp">
<UniqueIdentifier>{1cd56205-edc5-4412-abc0-1c66f1cb4d67}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core">
<UniqueIdentifier>{256c4366-ee69-4a9b-9089-15123b657f70}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\cart_hw">
<UniqueIdentifier>{e378bc88-805f-46e4-bdb7-f2e4e34cb031}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\cart_hw\svp">
<UniqueIdentifier>{77300262-55b2-42b4-8677-8a0f6590395c}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\cd_hw">
<UniqueIdentifier>{dd7e5767-713e-42d5-abfb-ab59ccd25413}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\cd_hw">
<UniqueIdentifier>{627b2577-e918-4933-b6ca-ee88e71d16b3}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\cd_hw\libchdr">
<UniqueIdentifier>{8c04dfe4-a59d-4a17-8c77-10733624e78a}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\cd_hw\libchdr">
<UniqueIdentifier>{c2d1f7bf-2c88-4d7b-a68f-12575b0618a3}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\cd_hw\libchdr\deps">
<UniqueIdentifier>{e16ee5c6-ce65-405b-9a5c-a44521d25976}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\cd_hw\libchdr\deps">
<UniqueIdentifier>{9293a242-e4b2-4cfa-922f-a6c35a16b3ee}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\cd_hw\libchdr\deps\libFLAC">
<UniqueIdentifier>{72865b37-60c2-485e-85d0-f7b3dd46b334}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\cd_hw\libchdr\deps\lzma">
<UniqueIdentifier>{ab60dae6-ecae-41cf-9005-0172ee1e6f2f}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\cd_hw\libchdr\deps\zlib">
<UniqueIdentifier>{3ef433a9-e016-49b9-9e00-0b70f490a5a8}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\cd_hw\libchdr\deps\libFLAC">
<UniqueIdentifier>{62d6de43-8512-4833-a80c-7e322a5569fa}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\cd_hw\libchdr\deps\lzma">
<UniqueIdentifier>{bd64d77e-eee1-4cc7-a9bf-66a3d6b18c76}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\cd_hw\libchdr\deps\zlib">
<UniqueIdentifier>{e114059e-bad4-47c8-b22e-ffc8b0f72181}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\cd_hw\libchdr\deps\libFLAC\include">
<UniqueIdentifier>{74e3783a-ec29-44d6-abad-540649e4fa6e}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\cd_hw\libchdr\deps\libFLAC\include\FLAC">
<UniqueIdentifier>{e6eaaca5-09be-45cc-9244-2eb057b87fc7}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\cd_hw\libchdr\deps\libFLAC\include\private">
<UniqueIdentifier>{58ed16f2-130a-4c50-88af-428c35f7144b}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\cd_hw\libchdr\deps\libFLAC\include\protected">
<UniqueIdentifier>{a5cd3c86-24f8-4b08-bd9d-c4847fcf1214}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\cd_hw\libchdr\deps\libFLAC\include\share">
<UniqueIdentifier>{d9c30de1-e8c4-4cc3-ba9c-c587da3a2674}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\cd_hw\libchdr\deps\lzma\DOC">
<UniqueIdentifier>{f4e88cd9-c91b-4147-844a-347e615a178d}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\cd_hw\libchdr\src">
<UniqueIdentifier>{a22d6d84-d426-48cc-aff3-94bb3db76ae0}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\cd_hw\libchdr\src">
<UniqueIdentifier>{5b1d8d92-510a-4ed6-9d44-50d52115b95f}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\input_hw">
<UniqueIdentifier>{1d7682a0-22f3-427b-82c6-29102edcf0af}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\input_hw">
<UniqueIdentifier>{0d9f9e83-8234-4a91-8e9d-0c9ee6a3d8aa}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\m68k">
<UniqueIdentifier>{9df6c375-24ca-4fcf-9d53-10beb82b14a9}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\m68k">
<UniqueIdentifier>{cf2d2c2b-497f-4d42-ac3d-f1521a4a0f8e}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\ntsc">
<UniqueIdentifier>{f4736f36-cb65-4717-ad2d-872c3f3a3196}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\ntsc">
<UniqueIdentifier>{f5886a02-e1fc-47a6-b163-a1ebfe29db7c}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\sound">
<UniqueIdentifier>{57d6feb9-5818-4e06-8531-ce72a582e376}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\sound">
<UniqueIdentifier>{59716199-da27-4702-9207-f6fcf5c26308}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\tremor">
<UniqueIdentifier>{838fdc46-93b9-4730-9c57-ea60de21960c}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\tremor">
<UniqueIdentifier>{bbb5caae-bd60-4364-8b8b-fa8a83061f44}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\z80">
<UniqueIdentifier>{1bc2b910-8dab-4c12-a343-d739600b45d0}</UniqueIdentifier>
</Filter>
<Filter Include="includes\core\z80">
<UniqueIdentifier>{db3d1204-0726-4182-a282-78bc51a38b8b}</UniqueIdentifier>
</Filter>
<Filter Include="resources">
<UniqueIdentifier>{4e4752cb-3871-4697-befd-2b05b3c8fa11}</UniqueIdentifier>
</Filter>
<Filter Include="src\libretro">
<UniqueIdentifier>{c8915827-575e-41dc-8615-5c6cdf1eacee}</UniqueIdentifier>
</Filter>
<Filter Include="includes\libretro">
<UniqueIdentifier>{f17ac24d-c50b-40a5-a1df-0f75c62554b2}</UniqueIdentifier>
</Filter>
<Filter Include="includes\libretro\libretro-common">
<UniqueIdentifier>{bc4e3eee-e957-4cbc-9f29-2fad74ba13f7}</UniqueIdentifier>
</Filter>
<Filter Include="src\libretro\libretro-common">
<UniqueIdentifier>{f6de1d16-d3de-4e83-9c7a-c37d215953e8}</UniqueIdentifier>
</Filter>
<Filter Include="includes\libretro\libretro-common\include">
<UniqueIdentifier>{94c0ca93-74a4-42f5-8fbe-91cd6efb1b22}</UniqueIdentifier>
</Filter>
<Filter Include="includes\libretro\libretro-common\include\compat">
<UniqueIdentifier>{bf368293-d035-4348-8ecf-7a3494c69fec}</UniqueIdentifier>
</Filter>
<Filter Include="includes\libretro\libretro-common\include\compat\msvc">
<UniqueIdentifier>{1b228852-48fd-4923-bada-c7a44ffd0c46}</UniqueIdentifier>
</Filter>
<Filter Include="includes\libretro\libretro-common\include\streams">
<UniqueIdentifier>{862bfbd5-837e-4c00-80f3-2bdf6c761afc}</UniqueIdentifier>
</Filter>
<Filter Include="src\libretro\libretro-common\memmap">
<UniqueIdentifier>{17c385d7-1fec-4a2e-a9b6-e090654ec0ea}</UniqueIdentifier>
</Filter>
<Filter Include="src\libretro\libretro-common\streams">
<UniqueIdentifier>{00db02d2-2769-489f-8054-1bea737089c4}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\core\cart_hw\svp\ssp16.h">
<Filter>includes\core\cart_hw\svp</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cart_hw\svp\svp.h">
<Filter>includes\core\cart_hw\svp</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cart_hw\areplay.h">
<Filter>includes\core\cart_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cart_hw\eeprom_93c.h">
<Filter>includes\core\cart_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cart_hw\eeprom_i2c.h">
<Filter>includes\core\cart_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cart_hw\eeprom_spi.h">
<Filter>includes\core\cart_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cart_hw\ggenie.h">
<Filter>includes\core\cart_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cart_hw\md_cart.h">
<Filter>includes\core\cart_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cart_hw\sms_cart.h">
<Filter>includes\core\cart_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cart_hw\sram.h">
<Filter>includes\core\cart_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\FLAC\assert.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\FLAC</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\FLAC\callback.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\FLAC</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\FLAC\export.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\FLAC</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\FLAC\format.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\FLAC</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\FLAC\metadata.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\FLAC</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\FLAC\ordinals.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\FLAC</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\FLAC\stream_decoder.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\FLAC</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\bitmath.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\private</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\bitreader.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\private</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\cpu.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\private</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\crc.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\private</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\fixed.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\private</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\float.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\private</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\format.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\private</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\lpc.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\private</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\macros.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\private</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\md5.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\private</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\private\memory.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\private</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\protected\stream_decoder.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\protected</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\share\alloc.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\share</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\share\compat.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\share</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\libFLAC\include\share\endswap.h">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC\include\share</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\lzma\7zTypes.h">
<Filter>includes\core\cd_hw\libchdr\deps\lzma</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\lzma\Compiler.h">
<Filter>includes\core\cd_hw\libchdr\deps\lzma</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\lzma\LzFind.h">
<Filter>includes\core\cd_hw\libchdr\deps\lzma</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\lzma\LzHash.h">
<Filter>includes\core\cd_hw\libchdr\deps\lzma</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\lzma\LzmaDec.h">
<Filter>includes\core\cd_hw\libchdr\deps\lzma</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\lzma\LzmaEnc.h">
<Filter>includes\core\cd_hw\libchdr\deps\lzma</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\lzma\Precomp.h">
<Filter>includes\core\cd_hw\libchdr\deps\lzma</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\zlib\gzguts.h">
<Filter>includes\core\cd_hw\libchdr\deps\zlib</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\zlib\inffast.h">
<Filter>includes\core\cd_hw\libchdr\deps\zlib</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\zlib\inffixed.h">
<Filter>includes\core\cd_hw\libchdr\deps\zlib</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\zlib\inflate.h">
<Filter>includes\core\cd_hw\libchdr\deps\zlib</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\zlib\inftrees.h">
<Filter>includes\core\cd_hw\libchdr\deps\zlib</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\zlib\zconf.h">
<Filter>includes\core\cd_hw\libchdr\deps\zlib</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\zlib\zlib.h">
<Filter>includes\core\cd_hw\libchdr\deps\zlib</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\deps\zlib\zutil.h">
<Filter>includes\core\cd_hw\libchdr\deps\zlib</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\src\bitstream.h">
<Filter>includes\core\cd_hw\libchdr\src</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\src\cdrom.h">
<Filter>includes\core\cd_hw\libchdr\src</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\src\chd.h">
<Filter>includes\core\cd_hw\libchdr\src</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\src\coretypes.h">
<Filter>includes\core\cd_hw\libchdr\src</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\src\flac.h">
<Filter>includes\core\cd_hw\libchdr\src</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\libchdr\src\huffman.h">
<Filter>includes\core\cd_hw\libchdr\src</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\cd_cart.h">
<Filter>includes\core\cd_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\cdc.h">
<Filter>includes\core\cd_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\cdd.h">
<Filter>includes\core\cd_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\gfx.h">
<Filter>includes\core\cd_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\pcm.h">
<Filter>includes\core\cd_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\cd_hw\scd.h">
<Filter>includes\core\cd_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\input_hw\activator.h">
<Filter>includes\core\input_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\input_hw\gamepad.h">
<Filter>includes\core\input_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\input_hw\graphic_board.h">
<Filter>includes\core\input_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\input_hw\input.h">
<Filter>includes\core\input_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\input_hw\lightgun.h">
<Filter>includes\core\input_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\input_hw\mouse.h">
<Filter>includes\core\input_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\input_hw\paddle.h">
<Filter>includes\core\input_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\input_hw\sportspad.h">
<Filter>includes\core\input_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\input_hw\teamplayer.h">
<Filter>includes\core\input_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\input_hw\terebi_oekaki.h">
<Filter>includes\core\input_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\input_hw\xe_1ap.h">
<Filter>includes\core\input_hw</Filter>
</ClInclude>
<ClInclude Include="..\..\core\m68k\m68k.h">
<Filter>includes\core\m68k</Filter>
</ClInclude>
<ClInclude Include="..\..\core\m68k\m68kconf.h">
<Filter>includes\core\m68k</Filter>
</ClInclude>
<ClInclude Include="..\..\core\m68k\m68kcpu.h">
<Filter>includes\core\m68k</Filter>
</ClInclude>
<ClInclude Include="..\..\core\m68k\m68ki_cycles.h">
<Filter>includes\core\m68k</Filter>
</ClInclude>
<ClInclude Include="..\..\core\m68k\m68ki_instruction_jump_table.h">
<Filter>includes\core\m68k</Filter>
</ClInclude>
<ClInclude Include="..\..\core\m68k\m68kops.h">
<Filter>includes\core\m68k</Filter>
</ClInclude>
<ClInclude Include="..\..\core\m68k\s68kconf.h">
<Filter>includes\core\m68k</Filter>
</ClInclude>
<ClInclude Include="..\..\core\m68k\s68ki_cycles.h">
<Filter>includes\core\m68k</Filter>
</ClInclude>
<ClInclude Include="..\..\core\ntsc\md_ntsc.h">
<Filter>includes\core\ntsc</Filter>
</ClInclude>
<ClInclude Include="..\..\core\ntsc\md_ntsc_config.h">
<Filter>includes\core\ntsc</Filter>
</ClInclude>
<ClInclude Include="..\..\core\ntsc\md_ntsc_impl.h">
<Filter>includes\core\ntsc</Filter>
</ClInclude>
<ClInclude Include="..\..\core\ntsc\sms_ntsc.h">
<Filter>includes\core\ntsc</Filter>
</ClInclude>
<ClInclude Include="..\..\core\ntsc\sms_ntsc_config.h">
<Filter>includes\core\ntsc</Filter>
</ClInclude>
<ClInclude Include="..\..\core\ntsc\sms_ntsc_impl.h">
<Filter>includes\core\ntsc</Filter>
</ClInclude>
<ClInclude Include="..\..\core\sound\blip_buf.h">
<Filter>includes\core\sound</Filter>
</ClInclude>
<ClInclude Include="..\..\core\sound\eq.h">
<Filter>includes\core\sound</Filter>
</ClInclude>
<ClInclude Include="..\..\core\sound\psg.h">
<Filter>includes\core\sound</Filter>
</ClInclude>
<ClInclude Include="..\..\core\sound\sound.h">
<Filter>includes\core\sound</Filter>
</ClInclude>
<ClInclude Include="..\..\core\sound\ym2413.h">
<Filter>includes\core\sound</Filter>
</ClInclude>
<ClInclude Include="..\..\core\sound\ym2612.h">
<Filter>includes\core\sound</Filter>
</ClInclude>
<ClInclude Include="..\..\core\sound\ym3438.h">
<Filter>includes\core\sound</Filter>
</ClInclude>
<ClInclude Include="..\..\core\tremor\asm_arm.h">
<Filter>includes\core\tremor</Filter>
</ClInclude>
<ClInclude Include="..\..\core\tremor\backends.h">
<Filter>includes\core\tremor</Filter>
</ClInclude>
<ClInclude Include="..\..\core\tremor\block.h">
<Filter>includes\core\tremor</Filter>
</ClInclude>
<ClInclude Include="..\..\core\tremor\codebook.h">
<Filter>includes\core\tremor</Filter>
</ClInclude>
<ClInclude Include="..\..\core\tremor\codec_internal.h">
<Filter>includes\core\tremor</Filter>
</ClInclude>
<ClInclude Include="..\..\core\tremor\config_types.h">
<Filter>includes\core\tremor</Filter>
</ClInclude>
<ClInclude Include="..\..\core\tremor\ivorbiscodec.h">
<Filter>includes\core\tremor</Filter>
</ClInclude>
<ClInclude Include="..\..\core\tremor\ivorbisfile.h">
<Filter>includes\core\tremor</Filter>
</ClInclude>
<ClInclude Include="..\..\core\tremor\lsp_lookup.h">
<Filter>includes\core\tremor</Filter>
</ClInclude>
<ClInclude Include="..\..\core\tremor\mdct.h">
<Filter>includes\core\tremor</Filter>
</ClInclude>
<ClInclude Include="..\..\core\tremor\mdct_lookup.h">
<Filter>includes\core\tremor</Filter>
</ClInclude>
<ClInclude Include="..\..\core\tremor\misc.h">
<Filter>includes\core\tremor</Filter>
</ClInclude>
<ClInclude Include="..\..\core\tremor\ogg.h">
<Filter>includes\core\tremor</Filter>
</ClInclude>
<ClInclude Include="..\..\core\tremor\os.h">
<Filter>includes\core\tremor</Filter>
</ClInclude>
<ClInclude Include="..\..\core\tremor\os_types.h">
<Filter>includes\core\tremor</Filter>
</ClInclude>
<ClInclude Include="..\..\core\tremor\registry.h">
<Filter>includes\core\tremor</Filter>
</ClInclude>
<ClInclude Include="..\..\core\tremor\window.h">
<Filter>includes\core\tremor</Filter>
</ClInclude>
<ClInclude Include="..\..\core\tremor\window_lookup.h">
<Filter>includes\core\tremor</Filter>
</ClInclude>
<ClInclude Include="..\..\core\z80\osd_cpu.h">
<Filter>includes\core\z80</Filter>
</ClInclude>
<ClInclude Include="..\..\core\z80\z80.h">
<Filter>includes\core\z80</Filter>
</ClInclude>
<ClInclude Include="..\..\core\genesis.h">
<Filter>includes\core</Filter>
</ClInclude>
<ClInclude Include="..\..\core\hvc.h">
<Filter>includes\core</Filter>
</ClInclude>
<ClInclude Include="..\..\core\io_ctrl.h">
<Filter>includes\core</Filter>
</ClInclude>
<ClInclude Include="..\..\core\loadrom.h">
<Filter>includes\core</Filter>
</ClInclude>
<ClInclude Include="..\..\core\macros.h">
<Filter>includes\core</Filter>
</ClInclude>
<ClInclude Include="..\..\core\mem68k.h">
<Filter>includes\core</Filter>
</ClInclude>
<ClInclude Include="..\..\core\membnk.h">
<Filter>includes\core</Filter>
</ClInclude>
<ClInclude Include="..\..\core\memz80.h">
<Filter>includes\core</Filter>
</ClInclude>
<ClInclude Include="..\..\core\shared.h">
<Filter>includes\core</Filter>
</ClInclude>
<ClInclude Include="..\..\core\state.h">
<Filter>includes\core</Filter>
</ClInclude>
<ClInclude Include="..\..\core\system.h">
<Filter>includes\core</Filter>
</ClInclude>
<ClInclude Include="..\..\core\types.h">
<Filter>includes\core</Filter>
</ClInclude>
<ClInclude Include="..\..\core\vdp_ctrl.h">
<Filter>includes\core</Filter>
</ClInclude>
<ClInclude Include="..\..\core\vdp_render.h">
<Filter>includes\core</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro.h">
<Filter>includes\libretro</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\osd.h">
<Filter>includes\libretro</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\scrc32.h">
<Filter>includes\libretro</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\compat\msvc\stdint.h">
<Filter>includes\libretro\libretro-common\include\compat\msvc</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\compat\apple_compat.h">
<Filter>includes\libretro\libretro-common\include\compat</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\compat\fnmatch.h">
<Filter>includes\libretro\libretro-common\include\compat</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\compat\getopt.h">
<Filter>includes\libretro\libretro-common\include\compat</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\compat\ifaddrs.h">
<Filter>includes\libretro\libretro-common\include\compat</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\compat\intrinsics.h">
<Filter>includes\libretro\libretro-common\include\compat</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\compat\msvc.h">
<Filter>includes\libretro\libretro-common\include\compat</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\compat\posix_string.h">
<Filter>includes\libretro\libretro-common\include\compat</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\compat\strcasestr.h">
<Filter>includes\libretro\libretro-common\include\compat</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\compat\strl.h">
<Filter>includes\libretro\libretro-common\include\compat</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\compat\zconf.h">
<Filter>includes\libretro\libretro-common\include\compat</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\compat\zlib.h">
<Filter>includes\libretro\libretro-common\include\compat</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\compat\zutil.h">
<Filter>includes\libretro\libretro-common\include\compat</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\streams\file_stream.h">
<Filter>includes\libretro\libretro-common\include\streams</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\streams\file_stream_transforms.h">
<Filter>includes\libretro\libretro-common\include\streams</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\boolean.h">
<Filter>includes\libretro\libretro-common\include</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\memmap.h">
<Filter>includes\libretro\libretro-common\include</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\retro_common.h">
<Filter>includes\libretro\libretro-common\include</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\retro_common_api.h">
<Filter>includes\libretro\libretro-common\include</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\retro_inline.h">
<Filter>includes\libretro\libretro-common\include</Filter>
</ClInclude>
<ClInclude Include="..\..\libretro\libretro-common\include\retro_miscellaneous.h">
<Filter>includes\libretro\libretro-common\include</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Text Include="..\..\core\cart_hw\svp\imageformat.txt">
<Filter>includes\core\cart_hw\svp</Filter>
</Text>
<Text Include="..\..\core\cart_hw\svp\svpdoc.txt">
<Filter>includes\core\cart_hw\svp</Filter>
</Text>
<Text Include="..\..\core\cd_hw\libchdr\deps\lzma\DOC\lzma.txt">
<Filter>includes\core\cd_hw\libchdr\deps\lzma\DOC</Filter>
</Text>
<Text Include="..\..\core\cd_hw\libchdr\deps\lzma\DOC\lzma-history.txt">
<Filter>includes\core\cd_hw\libchdr\deps\lzma\DOC</Filter>
</Text>
<Text Include="..\..\core\cd_hw\libchdr\deps\lzma\DOC\lzma-sdk.txt">
<Filter>includes\core\cd_hw\libchdr\deps\lzma\DOC</Filter>
</Text>
<Text Include="..\..\core\cd_hw\libchdr\deps\lzma\DOC\lzma-specification.txt">
<Filter>includes\core\cd_hw\libchdr\deps\lzma\DOC</Filter>
</Text>
<Text Include="..\..\core\cd_hw\libchdr\LICENSE.txt">
<Filter>includes\core\cd_hw\libchdr</Filter>
</Text>
<Text Include="..\..\core\m68k\readme.txt">
<Filter>includes\core\m68k</Filter>
</Text>
<Text Include="..\..\core\ntsc\changes.txt">
<Filter>includes\core\ntsc</Filter>
</Text>
<Text Include="..\..\core\ntsc\license.txt">
<Filter>includes\core\ntsc</Filter>
</Text>
<Text Include="..\..\core\ntsc\readme.txt">
<Filter>includes\core\ntsc</Filter>
</Text>
<Text Include="..\..\core\ntsc\sms_ntsc.txt">
<Filter>includes\core\ntsc</Filter>
</Text>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\core\cart_hw\svp\ssp16.c">
<Filter>src\core\cart_hw\svp</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cart_hw\svp\svp.c">
<Filter>src\core\cart_hw\svp</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cart_hw\areplay.c">
<Filter>src\core\cart_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cart_hw\eeprom_93c.c">
<Filter>src\core\cart_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cart_hw\eeprom_i2c.c">
<Filter>src\core\cart_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cart_hw\eeprom_spi.c">
<Filter>src\core\cart_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cart_hw\ggenie.c">
<Filter>src\core\cart_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cart_hw\md_cart.c">
<Filter>src\core\cart_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cart_hw\sms_cart.c">
<Filter>src\core\cart_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cart_hw\sram.c">
<Filter>src\core\cart_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\bitmath.c">
<Filter>src\core\cd_hw\libchdr\deps\libFLAC</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\bitreader.c">
<Filter>src\core\cd_hw\libchdr\deps\libFLAC</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\cpu.c">
<Filter>src\core\cd_hw\libchdr\deps\libFLAC</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\crc.c">
<Filter>src\core\cd_hw\libchdr\deps\libFLAC</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\fixed.c">
<Filter>src\core\cd_hw\libchdr\deps\libFLAC</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\float.c">
<Filter>src\core\cd_hw\libchdr\deps\libFLAC</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\format.c">
<Filter>src\core\cd_hw\libchdr\deps\libFLAC</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\lpc.c">
<Filter>src\core\cd_hw\libchdr\deps\libFLAC</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\lpc_intrin_avx2.c">
<Filter>src\core\cd_hw\libchdr\deps\libFLAC</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\lpc_intrin_sse.c">
<Filter>src\core\cd_hw\libchdr\deps\libFLAC</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\lpc_intrin_sse2.c">
<Filter>src\core\cd_hw\libchdr\deps\libFLAC</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\lpc_intrin_sse41.c">
<Filter>src\core\cd_hw\libchdr\deps\libFLAC</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\md5.c">
<Filter>src\core\cd_hw\libchdr\deps\libFLAC</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\memory.c">
<Filter>src\core\cd_hw\libchdr\deps\libFLAC</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\libFLAC\stream_decoder.c">
<Filter>src\core\cd_hw\libchdr\deps\libFLAC</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\lzma\LzFind.c">
<Filter>src\core\cd_hw\libchdr\deps\lzma</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\lzma\LzmaDec.c">
<Filter>src\core\cd_hw\libchdr\deps\lzma</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\lzma\LzmaEnc.c">
<Filter>src\core\cd_hw\libchdr\deps\lzma</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\zlib\adler32.c">
<Filter>src\core\cd_hw\libchdr\deps\zlib</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\zlib\inffast.c">
<Filter>src\core\cd_hw\libchdr\deps\zlib</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\zlib\inflate.c">
<Filter>src\core\cd_hw\libchdr\deps\zlib</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\zlib\inftrees.c">
<Filter>src\core\cd_hw\libchdr\deps\zlib</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\deps\zlib\zutil.c">
<Filter>src\core\cd_hw\libchdr\deps\zlib</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\src\bitstream.c">
<Filter>src\core\cd_hw\libchdr\src</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\src\cdrom.c">
<Filter>src\core\cd_hw\libchdr\src</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\src\chd.c">
<Filter>src\core\cd_hw\libchdr\src</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\src\flac.c">
<Filter>src\core\cd_hw\libchdr\src</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\libchdr\src\huffman.c">
<Filter>src\core\cd_hw\libchdr\src</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\cd_cart.c">
<Filter>src\core\cd_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\cdc.c">
<Filter>src\core\cd_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\cdd.c">
<Filter>src\core\cd_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\gfx.c">
<Filter>src\core\cd_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\pcm.c">
<Filter>src\core\cd_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\cd_hw\scd.c">
<Filter>src\core\cd_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\input_hw\activator.c">
<Filter>src\core\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\input_hw\gamepad.c">
<Filter>src\core\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\input_hw\graphic_board.c">
<Filter>src\core\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\input_hw\input.c">
<Filter>src\core\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\input_hw\lightgun.c">
<Filter>src\core\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\input_hw\mouse.c">
<Filter>src\core\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\input_hw\paddle.c">
<Filter>src\core\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\input_hw\sportspad.c">
<Filter>src\core\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\input_hw\teamplayer.c">
<Filter>src\core\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\input_hw\terebi_oekaki.c">
<Filter>src\core\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\input_hw\xe_1ap.c">
<Filter>src\core\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\core\m68k\m68kcpu.c">
<Filter>src\core\m68k</Filter>
</ClCompile>
<ClCompile Include="..\..\core\m68k\s68kcpu.c">
<Filter>src\core\m68k</Filter>
</ClCompile>
<ClCompile Include="..\..\core\ntsc\md_ntsc.c">
<Filter>src\core\ntsc</Filter>
</ClCompile>
<ClCompile Include="..\..\core\ntsc\sms_ntsc.c">
<Filter>src\core\ntsc</Filter>
</ClCompile>
<ClCompile Include="..\..\core\sound\blip_buf.c">
<Filter>src\core\sound</Filter>
</ClCompile>
<ClCompile Include="..\..\core\sound\eq.c">
<Filter>src\core\sound</Filter>
</ClCompile>
<ClCompile Include="..\..\core\sound\psg.c">
<Filter>src\core\sound</Filter>
</ClCompile>
<ClCompile Include="..\..\core\sound\sound.c">
<Filter>src\core\sound</Filter>
</ClCompile>
<ClCompile Include="..\..\core\sound\ym2413.c">
<Filter>src\core\sound</Filter>
</ClCompile>
<ClCompile Include="..\..\core\sound\ym2612.c">
<Filter>src\core\sound</Filter>
</ClCompile>
<ClCompile Include="..\..\core\sound\ym3438.c">
<Filter>src\core\sound</Filter>
</ClCompile>
<ClCompile Include="..\..\core\tremor\bitwise.c">
<Filter>src\core\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\core\tremor\block.c">
<Filter>src\core\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\core\tremor\codebook.c">
<Filter>src\core\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\core\tremor\floor0.c">
<Filter>src\core\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\core\tremor\floor1.c">
<Filter>src\core\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\core\tremor\framing.c">
<Filter>src\core\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\core\tremor\info.c">
<Filter>src\core\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\core\tremor\mapping0.c">
<Filter>src\core\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\core\tremor\mdct.c">
<Filter>src\core\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\core\tremor\registry.c">
<Filter>src\core\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\core\tremor\res012.c">
<Filter>src\core\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\core\tremor\sharedbook.c">
<Filter>src\core\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\core\tremor\synthesis.c">
<Filter>src\core\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\core\tremor\vorbisfile.c">
<Filter>src\core\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\core\tremor\window.c">
<Filter>src\core\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\core\z80\z80.c">
<Filter>src\core\z80</Filter>
</ClCompile>
<ClCompile Include="..\..\core\genesis.c">
<Filter>src\core</Filter>
</ClCompile>
<ClCompile Include="..\..\core\io_ctrl.c">
<Filter>src\core</Filter>
</ClCompile>
<ClCompile Include="..\..\core\loadrom.c">
<Filter>src\core</Filter>
</ClCompile>
<ClCompile Include="..\..\core\mem68k.c">
<Filter>src\core</Filter>
</ClCompile>
<ClCompile Include="..\..\core\membnk.c">
<Filter>src\core</Filter>
</ClCompile>
<ClCompile Include="..\..\core\memz80.c">
<Filter>src\core</Filter>
</ClCompile>
<ClCompile Include="..\..\core\state.c">
<Filter>src\core</Filter>
</ClCompile>
<ClCompile Include="..\..\core\system.c">
<Filter>src\core</Filter>
</ClCompile>
<ClCompile Include="..\..\core\vdp_ctrl.c">
<Filter>src\core</Filter>
</ClCompile>
<ClCompile Include="..\..\core\vdp_render.c">
<Filter>src\core</Filter>
</ClCompile>
<ClCompile Include="..\..\libretro\libretro.c">
<Filter>src\libretro</Filter>
</ClCompile>
<ClCompile Include="..\..\libretro\scrc32.c">
<Filter>src\libretro</Filter>
</ClCompile>
<ClCompile Include="..\..\libretro\libretro-common\memmap\memmap.c">
<Filter>src\libretro\libretro-common\memmap</Filter>
</ClCompile>
<ClCompile Include="..\..\libretro\libretro-common\streams\file_stream.c">
<Filter>src\libretro\libretro-common\streams</Filter>
</ClCompile>
<ClCompile Include="..\..\libretro\libretro-common\streams\file_stream_transforms.c">
<Filter>src\libretro\libretro-common\streams</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="..\..\core\cd_hw\libchdr\deps\libFLAC\AUTHORS">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC</Filter>
</None>
<None Include="..\..\core\cd_hw\libchdr\deps\libFLAC\COPYING.Xiph">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC</Filter>
</None>
<None Include="..\..\core\cd_hw\libchdr\deps\libFLAC\README">
<Filter>includes\core\cd_hw\libchdr\deps\libFLAC</Filter>
</None>
<None Include="..\..\core\cd_hw\libchdr\deps\zlib\ChangeLog">
<Filter>includes\core\cd_hw\libchdr\deps\zlib</Filter>
</None>
<None Include="..\..\core\cd_hw\libchdr\deps\zlib\README">
<Filter>includes\core\cd_hw\libchdr\deps\zlib</Filter>
</None>
<None Include="..\..\core\cd_hw\libchdr\README.md">
<Filter>includes\core\cd_hw\libchdr</Filter>
</None>
<None Include="..\..\core\tremor\CHANGELOG">
<Filter>includes\core\tremor</Filter>
</None>
<None Include="..\..\core\tremor\COPYING">
<Filter>includes\core\tremor</Filter>
</None>
<None Include="..\..\core\tremor\README">
<Filter>includes\core\tremor</Filter>
</None>
<None Include="libretro.def">
<Filter>resources</Filter>
</None>
</ItemGroup>
</Project>

View File

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LocalDebuggerWorkingDirectory>$(OutDir)</LocalDebuggerWorkingDirectory>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
<LocalDebuggerCommandArguments>"Thunder Force III (JU) [!].bin"</LocalDebuggerCommandArguments>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LocalDebuggerWorkingDirectory>$(OutDir)</LocalDebuggerWorkingDirectory>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
<LocalDebuggerCommandArguments>"Thunder Force III (JU) [!].bin"</LocalDebuggerCommandArguments>
</PropertyGroup>
</Project>

View File

@ -1,27 +0,0 @@
LIBRARY "genesis_plus_gx_libretro"
EXPORTS
retro_set_environment
retro_set_video_refresh
retro_set_audio_sample
retro_set_audio_sample_batch
retro_set_input_poll
retro_set_input_state
retro_init
retro_deinit
retro_api_version
retro_get_system_info
retro_get_system_av_info
retro_set_controller_port_device
retro_reset
retro_run
retro_serialize_size
retro_serialize
retro_unserialize
retro_cheat_reset
retro_cheat_set
retro_load_game
retro_load_game_special
retro_unload_game
retro_get_region
retro_get_memory_data
retro_get_memory_size

View File

@ -44,7 +44,6 @@
#ifdef _MSC_VER
#include <stdio.h>
typedef unsigned char bool;
#define strncasecmp _strnicmp
#endif