diff --git a/build_win_dbg.sh b/build_win_dbg.sh index 8752bc6a..aca35539 100755 --- a/build_win_dbg.sh +++ b/build_win_dbg.sh @@ -2,8 +2,8 @@ # NOTE: -gdwarf-2 needed for my version of wine to recognize the symbols. -x86_64-w64-mingw32-gcc -D__USE_MINGW_ANSI_STDIO=0 \ - -Wall -W -Werror \ +x86_64-w64-mingw32-gcc -D__USE_MINGW_ANSI_STDIO=0 -DPLATFORM_WINDOWS \ + -Wall -W -Werror -Wl,--default-image-base-low \ -Wno-unknown-warning-option -Wno-address-of-packed-member \ -g -gdwarf-2 -o beebjit.exe \ main.c config.c bbc.c defs_6502.c state.c video.c via.c \ diff --git a/build_win_opt.sh b/build_win_opt.sh index 1df50a68..90bbe9f0 100755 --- a/build_win_opt.sh +++ b/build_win_opt.sh @@ -2,8 +2,8 @@ # NOTE: -gdwarf-2 needed for my version of wine to recognize the symbols. -x86_64-w64-mingw32-gcc -D__USE_MINGW_ANSI_STDIO=0 \ - -Wall -W -Werror \ +x86_64-w64-mingw32-gcc -D__USE_MINGW_ANSI_STDIO=0 -DPLATFORM_WINDOWS \ + -Wall -W -Werror -Wl,--default-image-base-low \ -Wno-unknown-warning-option -Wno-address-of-packed-member \ -O3 -DNDEBUG -flto -o beebjit.exe \ main.c config.c bbc.c defs_6502.c state.c video.c via.c \ diff --git a/util.c b/util.c index ec365f67..0adab77d 100644 --- a/util.c +++ b/util.c @@ -10,6 +10,9 @@ #include #include #include +#ifdef PLATFORM_WINDOWS +#include "windows.h" +#endif void* util_malloc(size_t size) { @@ -279,9 +282,12 @@ util_file_name_split(char** p_file_name_base, const char* p_sep = NULL; const char* p_str = p_full_file_name; - /* TODO: respect Windows separator? */ while (*p_str != '\0') { +#ifdef PLATFORM_WINDOWS + if (*p_str == '/' || *p_str == '\\') { +#else if (*p_str == '/') { +#endif p_sep = p_str; } p_str++; @@ -309,7 +315,11 @@ util_file_name_join(const char* p_file_name_base, const char* p_file_name) { /* TODO: respect Windows separator? */ (void) snprintf(file_name_buf, sizeof(file_name_buf), +#ifdef PLATFORM_WINDOWS + "%s\\%s", +#else "%s/%s", +#endif p_file_name_base, p_file_name); return strdup(&file_name_buf[0]); @@ -319,6 +329,23 @@ struct util_file* util_file_open(const char* p_file_name, int writeable, int create) { struct util_file* p_file = util_file_try_open(p_file_name, writeable, create); if (p_file == NULL) { +#ifdef PLATFORM_WINDOWS + char executable_path_buf[4096]; + char* executable_dir; + char* executable_file_name; + char* joined_file_name; + GetModuleFileNameA(NULL, executable_path_buf, 4096); + util_file_name_split(&executable_dir, &executable_file_name, executable_path_buf); + joined_file_name = util_file_name_join(executable_dir, p_file_name); + + p_file = util_file_try_open(joined_file_name, writeable, create); + + util_free(joined_file_name); + util_free(executable_file_name); + util_free(executable_dir); + } + if (p_file == NULL) { +#endif util_bail("couldn't open %s", p_file_name); } return p_file;