diff --git a/360/main.c b/360/main.c index acc10b5f82..057acca69e 100644 --- a/360/main.c +++ b/360/main.c @@ -25,6 +25,7 @@ #include "xdk360_input.h" #include "xdk360_video.h" +#include "../console/rom_ext.h" #include "../console/main_wrap.h" #include "../conf/config_file.h" #include "../conf/config_file_macros.h" @@ -188,8 +189,80 @@ static void set_default_settings (void) g_extern.verbose = true; } -static void init_settings (void) +static char **dir_list_new_360(const char *dir, const char *ext) { + size_t cur_ptr = 0; + size_t cur_size = 32; + char **dir_list = NULL; + + WIN32_FIND_DATA ffd; + HANDLE hFind = INVALID_HANDLE_VALUE; + + char path_buf[PATH_MAX]; + + if (strlcpy(path_buf, dir, sizeof(path_buf)) >= sizeof(path_buf)) + goto error; + if (strlcat(path_buf, "*", sizeof(path_buf)) >= sizeof(path_buf)) + goto error; + + if (ext) + { + if (strlcat(path_buf, ext, sizeof(path_buf)) >= sizeof(path_buf)) + goto error; + } + + hFind = FindFirstFile(path_buf, &ffd); + if (hFind == INVALID_HANDLE_VALUE) + goto error; + + dir_list = (char**)calloc(cur_size, sizeof(char*)); + if (!dir_list) + goto error; + + do + { + // Not a perfect search of course, but hopefully good enough in practice. + if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + continue; + if (ext && !strstr(ffd.cFileName, ext)) + continue; + + dir_list[cur_ptr] = (char*)malloc(PATH_MAX); + if (!dir_list[cur_ptr]) + goto error; + + strlcpy(dir_list[cur_ptr], dir, PATH_MAX); + strlcat(dir_list[cur_ptr], ffd.cFileName, PATH_MAX); + + cur_ptr++; + if (cur_ptr + 1 == cur_size) // Need to reserve for NULL. + { + cur_size *= 2; + dir_list = (char**)realloc(dir_list, cur_size * sizeof(char*)); + if (!dir_list) + goto error; + + // Make sure it's all NULL'd out since we cannot rely on realloc to do this. + memset(dir_list + cur_ptr, 0, (cur_size - cur_ptr) * sizeof(char*)); + } + }while (FindNextFile(hFind, &ffd) != 0); + + FindClose(hFind); + return dir_list; + + error: + SSNES_ERR("Failed to open directory: \"%s\"\n", dir); + if (hFind != INVALID_HANDLE_VALUE) + FindClose(hFind); + dir_list_free(dir_list); + return NULL; +} + + +static void init_settings (bool load_libsnes_path) +{ + char fname_tmp[MAX_PATH_LENGTH]; + if(!path_file_exists(SYS_CONFIG_FILE)) { SSNES_ERR("Config file \"%s\" desn't exist. Creating...\n", "game:\\ssnes.cfg"); @@ -200,6 +273,53 @@ static void init_settings (void) config_file_t * conf = config_file_new(SYS_CONFIG_FILE); + if(load_libsnes_path) + { + CONFIG_GET_STRING(libsnes, "libsnes_path"); + + if(!strcmp(g_settings.libsnes, "")) + { + //We need to set libsnes to the first entry in the cores + //directory so that it will be saved to the config file + char ** dir_list = dir_list_new_360("game:\\", ".xex"); + if (!dir_list) + { + SSNES_ERR("Couldn't read directory.\n"); + return; + } + + const char * first_xex = dir_list[0]; + + if(first_xex) + { + fill_pathname_base(fname_tmp, first_xex, sizeof(fname_tmp)); + + if(strcmp(fname_tmp, "SSNES-Salamander.xex") == 0) + { + SSNES_WARN("First entry is SSNES Salamander itself, increment entry by one and check if it exists.\n"); + first_xex = dir_list[1]; + fill_pathname_base(fname_tmp, first_xex, sizeof(fname_tmp)); + + if(!first_xex) + { + //This is very unlikely to happen + SSNES_WARN("There is no second entry - no choice but to set it to SSNES Salamander\n"); + first_xex = dir_list[0]; + fill_pathname_base(fname_tmp, first_xex, sizeof(fname_tmp)); + } + } + SSNES_LOG("Set first .xex entry in dir: [%s] to libsnes path.\n", fname_tmp); + snprintf(g_settings.libsnes, sizeof(g_settings.libsnes), "game:\\%s", fname_tmp); + } + else + { + SSNES_ERR("Failed to set first .xex entry to libsnes path.\n"); + } + + dir_list_free(dir_list); + } + } + // g_settings CONFIG_GET_BOOL(rewind_enable, "rewind_enable"); CONFIG_GET_BOOL(video.smooth, "video_smooth"); @@ -229,6 +349,7 @@ static void save_settings (void) conf = config_file_new(NULL); // g_settings + config_set_string(conf, "libsnes_path", g_settings.libsnes); config_set_bool(conf, "rewind_enable", g_settings.rewind_enable); config_set_bool(conf, "video_smooth", g_settings.video.smooth); config_set_bool(conf, "video_vsync", g_settings.video.vsync); @@ -310,15 +431,91 @@ static void get_environment_settings (void) strlcpy(SYS_CONFIG_FILE, "game:\\ssnes.cfg", sizeof(SYS_CONFIG_FILE)); } +static bool manage_libsnes_core(void) +{ + g_extern.verbose = true; + bool return_code; + + bool set_libsnes_path = false; + char tmp_path[1024], tmp_path2[1024], tmp_pathnewfile[1024]; + snprintf(tmp_path, sizeof(tmp_path), "game:\\CORE.xex"); + SSNES_LOG("Assumed path of CORE.xex: [%s]\n", tmp_path); + if(path_file_exists(tmp_path)) + { + //if CORE.xex exists, this indicates we have just installed + //a new libsnes port and that we need to change it to a more + //sane name. + + int ret; + + ssnes_console_name_from_id(tmp_path2, sizeof(tmp_path2)); + strlcat(tmp_path2, ".xex", sizeof(tmp_path2)); + snprintf(tmp_pathnewfile, sizeof(tmp_pathnewfile), "game:\\%s", tmp_path2); + + if(path_file_exists(tmp_pathnewfile)) + { + SSNES_LOG("Upgrading emulator core...\n"); + //if libsnes core already exists, then that means we are + //upgrading the libsnes core - so delete pre-existing + //file first + ret = DeleteFile(tmp_pathnewfile); + if(ret != 0) + { + SSNES_LOG("Succeeded in removing pre-existing libsnes core: [%s].\n", tmp_pathnewfile); + } + else + { + SSNES_LOG("Failed to remove pre-existing libsnes core: [%s].\n", tmp_pathnewfile); + } + } + + //now attempt the renaming + ret = MoveFileExA(tmp_path, tmp_pathnewfile, NULL); + if(ret == 0) + { + SSNES_ERR("Failed to rename CORE.xex.\n"); + } + else + { + SSNES_LOG("Libsnes core [%s] renamed to: [%s].\n", tmp_path, tmp_pathnewfile); + set_libsnes_path = true; + } + } + else + { + SSNES_LOG("CORE.xex was not found, libsnes core path will be loaded from config file.\n"); + } + + if(set_libsnes_path) + { + //CORE.xex has been renamed, libsnes path will now be set to the recently + //renamed new libsnes core + strlcpy(g_settings.libsnes, tmp_pathnewfile, sizeof(g_settings.libsnes)); + return_code = 0; + } + else + { + //There was no CORE.xex present, or the CORE.xex file was not renamed. + //The libsnes core path will still be loaded from the config file + return_code = 1; + } + + g_extern.verbose = false; + + return return_code; +} + int main(int argc, char *argv[]) { get_environment_settings(); ssnes_main_clear_state(); config_set_defaults(); + + bool load_libsnes_path = manage_libsnes_core(); set_default_settings(); - init_settings(); + init_settings(load_libsnes_path); xdk360_video_init(); menu_init(); diff --git a/360/salamander/main.c b/360/salamander/main.c new file mode 100644 index 0000000000..47cf186e52 --- /dev/null +++ b/360/salamander/main.c @@ -0,0 +1,323 @@ +/* SSNES - A Super Nintendo Entertainment System (SNES) Emulator frontend for libsnes. + * SSNES Salamander - A frontend for managing some pre-launch tasks. + * Copyright (C) 2010-2012 - Hans-Kristian Arntzen + * Copyright (C) 2011-2012 - Daniel De Matteis + * + * Some code herein may be based on code found in BSNES. + * + * SSNES is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * SSNES is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with SSNES. + * If not, see . + */ + +#include + +#include "../../strl.h" +#include "../../conf/config_file.h" +#include "../../msvc/msvc_compat.h" + +#define MAX_PATH_LENGTH 1024 + +#define SSNES_LOG(...) do { \ + fprintf(stderr, "SSNES Salamander: " __VA_ARGS__); \ + fflush(stderr); \ + } while (0) + +#define SSNES_ERR(...) do { \ + fprintf(stderr, "SSNES Salamander [ERROR] :: " __VA_ARGS__); \ + fflush(stderr); \ + } while (0) + +#define SSNES_WARN(...) do { \ + fprintf(stderr, "SSNES Salamander [WARN] :: " __VA_ARGS__); \ + fflush(stderr); \ + } while (0) + +char LIBSNES_DIR_PATH[MAX_PATH_LENGTH]; +char SYS_CONFIG_FILE[MAX_PATH_LENGTH]; +char libsnes_path[MAX_PATH_LENGTH]; +DWORD volume_device_type; + +static bool path_file_exists(const char *path) +{ + FILE *dummy = fopen(path, "rb"); + if (dummy) + { + fclose(dummy); + return true; + } + return false; +} + +static void dir_list_free(char **dir_list) +{ + if (!dir_list) + return; + + char **orig = dir_list; + while (*dir_list) + free(*dir_list++); + free(orig); +} + +static void fill_pathname_base(char *out_dir, const char *in_path, size_t size) +{ + const char *ptr = strrchr(in_path, '/'); + if (!ptr) + ptr = strrchr(in_path, '\\'); + + if (ptr) + ptr++; + else + ptr = in_path; + + strlcpy(out_dir, ptr, size); +} + +static char **dir_list_new(const char *dir, const char *ext) +{ + size_t cur_ptr = 0; + size_t cur_size = 32; + char **dir_list = NULL; + + WIN32_FIND_DATA ffd; + HANDLE hFind = INVALID_HANDLE_VALUE; + + char path_buf[PATH_MAX]; + + if (strlcpy(path_buf, dir, sizeof(path_buf)) >= sizeof(path_buf)) + goto error; + if (strlcat(path_buf, "*", sizeof(path_buf)) >= sizeof(path_buf)) + goto error; + + if (ext) + { + if (strlcat(path_buf, ext, sizeof(path_buf)) >= sizeof(path_buf)) + goto error; + } + + hFind = FindFirstFile(path_buf, &ffd); + if (hFind == INVALID_HANDLE_VALUE) + goto error; + + dir_list = (char**)calloc(cur_size, sizeof(char*)); + if (!dir_list) + goto error; + + do + { + // Not a perfect search of course, but hopefully good enough in practice. + if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + continue; + if (ext && !strstr(ffd.cFileName, ext)) + continue; + + dir_list[cur_ptr] = (char*)malloc(PATH_MAX); + if (!dir_list[cur_ptr]) + goto error; + + strlcpy(dir_list[cur_ptr], dir, PATH_MAX); + strlcat(dir_list[cur_ptr], ffd.cFileName, PATH_MAX); + + cur_ptr++; + if (cur_ptr + 1 == cur_size) // Need to reserve for NULL. + { + cur_size *= 2; + dir_list = (char**)realloc(dir_list, cur_size * sizeof(char*)); + if (!dir_list) + goto error; + + // Make sure it's all NULL'd out since we cannot rely on realloc to do this. + memset(dir_list + cur_ptr, 0, (cur_size - cur_ptr) * sizeof(char*)); + } + }while (FindNextFile(hFind, &ffd) != 0); + + FindClose(hFind); + return dir_list; + + error: + SSNES_ERR("Failed to open directory: \"%s\"\n", dir); + if (hFind != INVALID_HANDLE_VALUE) + FindClose(hFind); + dir_list_free(dir_list); + return NULL; +} + +static void find_and_set_first_file(void) +{ + //Last fallback - we'll need to start the first .xex file + // we can find in the SSNES cores directory + char ** dir_list = dir_list_new("game:\\", ".xex"); + if (!dir_list) + { + SSNES_ERR("Failed last fallback - SSNES Salamander will exit.\n"); + return; + } + + char * first_xex = dir_list[0]; + + if(first_xex) + { + //Check if it's SSNES Salamander itself - if so, first_xex needs to + //be overridden + char fname_tmp[MAX_PATH_LENGTH], fname[MAX_PATH_LENGTH]; + + fill_pathname_base(fname_tmp, first_xex, sizeof(fname_tmp)); + + if(strcmp(fname_tmp, "SSNES-Salamander.xex") == 0) + { + SSNES_WARN("First entry is SSNES Salamander itself, increment entry by one and check if it exists.\n"); + first_xex = dir_list[1]; + fill_pathname_base(fname_tmp, first_xex, sizeof(fname_tmp)); + + if(!first_xex) + { + SSNES_WARN("There is no second entry - no choice but to boot SSNES Salamander\n"); + first_xex = dir_list[0]; + fill_pathname_base(fname_tmp, first_xex, sizeof(fname_tmp)); + } + } + + SSNES_LOG("Start first entry in libsnes cores dir: [%s].\n", first_xex); + + snprintf(fname, sizeof(fname), "game:\\%s", fname_tmp); + strlcpy(libsnes_path, fname, sizeof(libsnes_path)); + } + else + { + SSNES_ERR("Failed last fallback - SSNES Salamander will exit.\n"); + } + + dir_list_free(dir_list); +} + +static void init_settings(void) +{ + char tmp_str[MAX_PATH_LENGTH]; + bool config_file_exists; + + + if(!path_file_exists(SYS_CONFIG_FILE)) + { + config_file_exists = false; + SSNES_ERR("Config file \"%s\" doesn't exist. Creating...\n", SYS_CONFIG_FILE); + FILE * f; + f = fopen(SYS_CONFIG_FILE, "w"); + fclose(f); + } + else + config_file_exists = true; + + + //try to find CORE.xex + char core_xex[1024]; + snprintf(core_xex, sizeof(core_xex), "game:\\CORE.xex"); + + if(path_file_exists(core_xex)) + { + //Start CORE.xex + snprintf(libsnes_path, sizeof(libsnes_path), core_xex); + SSNES_LOG("Start [%s].\n", libsnes_path); + } + else + { + if(config_file_exists) + { + config_file_t * conf = config_file_new(SYS_CONFIG_FILE); + config_get_array(conf, "libsnes_path", tmp_str, sizeof(tmp_str)); + snprintf(libsnes_path, sizeof(libsnes_path), tmp_str); + } + + if(!config_file_exists || !strcmp(libsnes_path, "")) + find_and_set_first_file(); + else + { + SSNES_LOG("Start [%s] found in ssnes.cfg.\n", libsnes_path); + } + } +} + +static void get_environment_settings (void) +{ + //for devkits only, we will need to mount all partitions for retail + //in a different way + //DmMapDevkitDrive(); + + int result_filecache = XSetFileCacheSize(0x100000); + + if(result_filecache != TRUE) + { + SSNES_ERR("Couldn't change number of bytes reserved for file system cache.\n"); + } + unsigned long result = XMountUtilityDriveEx(XMOUNTUTILITYDRIVE_FORMAT0,8192, 0); + + if(result != ERROR_SUCCESS) + { + SSNES_ERR("Couldn't mount/format utility drive.\n"); + } + + // detect install environment + unsigned long license_mask; + + if (XContentGetLicenseMask(&license_mask, NULL) != ERROR_SUCCESS) + { + SSNES_LOG("SSNES was launched as a standalone DVD, or using DVD emulation, or from the development area of the HDD.\n"); + } + else + { + XContentQueryVolumeDeviceType("GAME",&volume_device_type, NULL); + + switch(volume_device_type) + { + case XCONTENTDEVICETYPE_HDD: + SSNES_LOG("SSNES was launched from a content package on HDD.\n"); + break; + case XCONTENTDEVICETYPE_MU: + SSNES_LOG("SSNES was launched from a content package on USB or Memory Unit.\n"); + break; + case XCONTENTDEVICETYPE_ODD: + SSNES_LOG("SSNES was launched from a content package on Optical Disc Drive.\n"); + break; + default: + SSNES_LOG("SSNES was launched from a content package on an unknown device type.\n"); + break; + + } + } + + strlcpy(SYS_CONFIG_FILE, "game:\\ssnes.cfg", sizeof(SYS_CONFIG_FILE)); +} + +int main(int argc, char *argv[]) +{ + int ret; + XINPUT_STATE state; + + get_environment_settings(); + + XInputGetState(0, &state); + + if(state.Gamepad.wButtons & XINPUT_GAMEPAD_Y) + { + //override path, boot first XEX in cores directory + SSNES_LOG("Fallback - Will boot first XEX in SSNES directory.\n"); + find_and_set_first_file(); + } + else + { + //normal XEX loading path + init_settings(); + } + + XLaunchNewImage(libsnes_path, NULL); + SSNES_LOG("Launch libsnes core: [%s] (return code: %x]).\n", libsnes_path, ret); + + return 1; +} \ No newline at end of file diff --git a/msvc-360/SSNES-360/SSNES-360.sln b/msvc-360/SSNES-360/SSNES-360.sln index e7f725c3cf..a7ba430d48 100644 --- a/msvc-360/SSNES-360/SSNES-360.sln +++ b/msvc-360/SSNES-360/SSNES-360.sln @@ -3,6 +3,8 @@ Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SSNES-360", "SSNES-360.vcxproj", "{9CE8EEF7-CC1C-4A04-BB5C-62411CB5BADE}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SSNES-Salamander", "..\SSNES-Salamander\SSNES-Salamander.vcxproj", "{29D5B973-F267-4039-84E7-8D34E9D00800}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution CodeAnalysis|Xbox 360 = CodeAnalysis|Xbox 360 @@ -25,6 +27,18 @@ Global {9CE8EEF7-CC1C-4A04-BB5C-62411CB5BADE}.Release_LTCG|Xbox 360.Build.0 = Release_LTCG|Xbox 360 {9CE8EEF7-CC1C-4A04-BB5C-62411CB5BADE}.Release|Xbox 360.ActiveCfg = Release|Xbox 360 {9CE8EEF7-CC1C-4A04-BB5C-62411CB5BADE}.Release|Xbox 360.Build.0 = Release|Xbox 360 + {29D5B973-F267-4039-84E7-8D34E9D00800}.CodeAnalysis|Xbox 360.ActiveCfg = CodeAnalysis|Xbox 360 + {29D5B973-F267-4039-84E7-8D34E9D00800}.CodeAnalysis|Xbox 360.Build.0 = CodeAnalysis|Xbox 360 + {29D5B973-F267-4039-84E7-8D34E9D00800}.Debug|Xbox 360.ActiveCfg = Debug|Xbox 360 + {29D5B973-F267-4039-84E7-8D34E9D00800}.Debug|Xbox 360.Build.0 = Debug|Xbox 360 + {29D5B973-F267-4039-84E7-8D34E9D00800}.Profile_FastCap|Xbox 360.ActiveCfg = Profile_FastCap|Xbox 360 + {29D5B973-F267-4039-84E7-8D34E9D00800}.Profile_FastCap|Xbox 360.Build.0 = Profile_FastCap|Xbox 360 + {29D5B973-F267-4039-84E7-8D34E9D00800}.Profile|Xbox 360.ActiveCfg = Profile|Xbox 360 + {29D5B973-F267-4039-84E7-8D34E9D00800}.Profile|Xbox 360.Build.0 = Profile|Xbox 360 + {29D5B973-F267-4039-84E7-8D34E9D00800}.Release_LTCG|Xbox 360.ActiveCfg = Release_LTCG|Xbox 360 + {29D5B973-F267-4039-84E7-8D34E9D00800}.Release_LTCG|Xbox 360.Build.0 = Release_LTCG|Xbox 360 + {29D5B973-F267-4039-84E7-8D34E9D00800}.Release|Xbox 360.ActiveCfg = Release|Xbox 360 + {29D5B973-F267-4039-84E7-8D34E9D00800}.Release|Xbox 360.Build.0 = Release|Xbox 360 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/msvc-360/SSNES-360/SSNES-360.vcxproj b/msvc-360/SSNES-360/SSNES-360.vcxproj index 386409731f..60c2f7382d 100644 --- a/msvc-360/SSNES-360/SSNES-360.vcxproj +++ b/msvc-360/SSNES-360/SSNES-360.vcxproj @@ -81,21 +81,26 @@ true + $(OutDir)CORE.xex true false + $(OutDir)CORE.xex false + $(OutDir)CORE.xex false + $(OutDir)CORE.xex false + $(OutDir)CORE.xex @@ -122,7 +127,16 @@ /privilege=6 %(AdditionalOptions) + true + + + + + + + + @@ -150,7 +164,16 @@ /privilege=6 %(AdditionalOptions) + true + + + + + + + + @@ -183,7 +206,16 @@ /privilege=6 %(AdditionalOptions) + true + + + + + + + + @@ -215,7 +247,16 @@ /privilege=6 %(AdditionalOptions) + true + + + + + + + + @@ -246,7 +287,16 @@ /privilege=6 %(AdditionalOptions) + true + + + + + + + + @@ -279,7 +329,16 @@ /privilege=6 %(AdditionalOptions) + true + + + + + + + + diff --git a/msvc-360/SSNES-Salamander/SSNES-Salamander.vcxproj b/msvc-360/SSNES-Salamander/SSNES-Salamander.vcxproj new file mode 100644 index 0000000000..0895f1699b --- /dev/null +++ b/msvc-360/SSNES-Salamander/SSNES-Salamander.vcxproj @@ -0,0 +1,287 @@ + + + + + CodeAnalysis + Xbox 360 + + + Debug + Xbox 360 + + + Profile + Xbox 360 + + + Profile_FastCap + Xbox 360 + + + Release + Xbox 360 + + + Release_LTCG + Xbox 360 + + + + {29D5B973-F267-4039-84E7-8D34E9D00800} + Xbox360Proj + + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + true + $(OutDir)$(ProjectName).xex + + + true + $(OutDir)$(ProjectName).xex + + + false + $(OutDir)$(ProjectName).xex + + + false + $(OutDir)$(ProjectName).xex + + + false + $(OutDir)$(ProjectName).xex + + + false + $(OutDir)$(ProjectName).xex + + + + NotUsing + Level3 + ProgramDatabase + Disabled + false + true + false + MultiThreadedDebug + _DEBUG;_XBOX;%(PreprocessorDefinitions);HAVE_CONFIGFILE;_CRT_SECURE_NO_WARNINGS;SSNES_CONSOLE=1 + Callcap + + + true + $(OutDir)$(ProjectName).pdb + xapilibd.lib;d3d9d.lib;d3dx9d.lib;xgraphicsd.lib;xboxkrnl.lib;xnetd.lib;xaudiod2.lib;xactd3.lib;x3daudiod.lib;xmcored.lib;xbdm.lib;vcompd.lib;%(AdditionalDependencies) + + + CopyToHardDrive + + + + + NotUsing + Level4 + ProgramDatabase + Disabled + false + true + AnalyzeOnly + false + MultiThreadedDebug + _DEBUG;_XBOX;%(PreprocessorDefinitions);HAVE_CONFIGFILE;_CRT_SECURE_NO_WARNINGS;SSNES_CONSOLE=1 + Callcap + + + true + $(OutDir)$(ProjectName).pdb + xapilibd.lib;d3d9d.lib;d3dx9d.lib;xgraphicsd.lib;xboxkrnl.lib;xnetd.lib;xaudiod2.lib;xactd3.lib;x3daudiod.lib;xmcored.lib;xbdm.lib;vcompd.lib;%(AdditionalDependencies) + + + CopyToHardDrive + + + + + Level3 + NotUsing + Full + true + false + true + ProgramDatabase + Size + false + MultiThreaded + NDEBUG;_XBOX;PROFILE;%(PreprocessorDefinitions);HAVE_CONFIGFILE;_CRT_SECURE_NO_WARNINGS;SSNES_CONSOLE=1 + Callcap + + + true + false + xapilib.lib;%(IgnoreSpecificDefaultLibraries) + true + $(OutDir)$(ProjectName).pdb + true + xapilibi.lib;d3d9i.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xnet.lib;xaudio2.lib;xact3i.lib;x3daudioi.lib;xmcorei.lib;xbdm.lib;vcomp.lib;%(AdditionalDependencies) + + + CopyToHardDrive + + + + + Level3 + NotUsing + Full + true + false + true + ProgramDatabase + Fastcap + Size + false + MultiThreaded + NDEBUG;_XBOX;PROFILE;FASTCAP;%(PreprocessorDefinitions);HAVE_CONFIGFILE;_CRT_SECURE_NO_WARNINGS;SSNES_CONSOLE=1 + + + true + false + true + $(OutDir)$(ProjectName).pdb + true + xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xbdm.lib;%(AdditionalDependencies) + + + CopyToHardDrive + + + + + Level3 + NotUsing + Full + true + true + ProgramDatabase + Size + false + false + MultiThreaded + NDEBUG;_XBOX;%(PreprocessorDefinitions);HAVE_CONFIGFILE;_CRT_SECURE_NO_WARNINGS;SSNES_CONSOLE=1 + + + true + true + true + $(OutDir)$(ProjectName).pdb + true + xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;%(AdditionalDependencies) + + + CopyToHardDrive + + + + + Level3 + NotUsing + Full + true + true + ProgramDatabase + Size + false + false + MultiThreaded + NDEBUG;_XBOX;LTCG;%(PreprocessorDefinitions);HAVE_CONFIGFILE;_CRT_SECURE_NO_WARNINGS;SSNES_CONSOLE=1 + + + true + true + true + $(OutDir)$(ProjectName).pdb + true + xapilib.lib;d3d9ltcg.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xnet.lib;xaudio2.lib;xact3ltcg.lib;x3daudioltcg.lib;xmcoreltcg.lib;vcomp.lib;%(AdditionalDependencies) + + + CopyToHardDrive + + + + + CompileAsCpp + CompileAsCpp + CompileAsCpp + CompileAsCpp + CompileAsCpp + CompileAsCpp + + + CompileAsCpp + CompileAsCpp + CompileAsCpp + CompileAsCpp + CompileAsCpp + CompileAsCpp + + + + CompileAsCpp + CompileAsCpp + CompileAsCpp + CompileAsCpp + CompileAsCpp + CompileAsCpp + + + + + + \ No newline at end of file diff --git a/msvc-360/SSNES-Salamander/SSNES-Salamander.vcxproj.filters b/msvc-360/SSNES-Salamander/SSNES-Salamander.vcxproj.filters new file mode 100644 index 0000000000..dd2375d27e --- /dev/null +++ b/msvc-360/SSNES-Salamander/SSNES-Salamander.vcxproj.filters @@ -0,0 +1,27 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file