From e7566d6974a408154f58a55fccb5e1b58d5ccb7f Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 23 Mar 2022 16:00:36 +0600 Subject: [PATCH 01/21] qt: Get rid of resize rounding --- src/qt/qt_mainwindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index df2c841e9..f48d3af07 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -221,9 +221,9 @@ MainWindow::MainWindow(QWidget *parent) : connect(this, &MainWindow::resizeContents, this, [this](int w, int h) { if (!QApplication::platformName().contains("eglfs") && vid_resize == 0) { - w = qRound(w / (!dpi_scale ? util::screenOfWidget(this)->devicePixelRatio() : 1.)); + w = (w / (!dpi_scale ? util::screenOfWidget(this)->devicePixelRatio() : 1.)); - int modifiedHeight = qRound(h / (!dpi_scale ? util::screenOfWidget(this)->devicePixelRatio() : 1.)) + int modifiedHeight = (h / (!dpi_scale ? util::screenOfWidget(this)->devicePixelRatio() : 1.)) + menuBar()->height() + (statusBar()->height() * !hide_status_bar) + (ui->toolBar->height() * !hide_tool_bar); From 6f0ac4eace9d175e29083959dab973765edd6abf Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 3 Apr 2022 01:24:09 +0600 Subject: [PATCH 02/21] qt: Fix creation of differencing VHDs --- src/qt/qt_harddiskdialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/qt_harddiskdialog.cpp b/src/qt/qt_harddiskdialog.cpp index b82f6927b..b7a44d952 100644 --- a/src/qt/qt_harddiskdialog.cpp +++ b/src/qt/qt_harddiskdialog.cpp @@ -252,7 +252,7 @@ static MVHDGeom create_drive_vhd_dynamic(const QString& fileName, uint16_t cyl, static MVHDGeom create_drive_vhd_diff(const QString& fileName, const QString& parentFileName, int blocksize) { int vhd_error = 0; QByteArray filenameBytes = fileName.toUtf8(); - QByteArray parentFilenameBytes = fileName.toUtf8(); + QByteArray parentFilenameBytes = parentFileName.toUtf8(); MVHDCreationOptions options; options.block_size_in_sectors = blocksize; options.path = filenameBytes.data(); From 3cec306ecf6ee9c4b2e64f78843d0d9a232de61e Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 4 Apr 2022 18:11:39 +0200 Subject: [PATCH 03/21] Device config fix, phase 1. --- src/device.c | 23 +++++++++++++++++++++++ src/include/86box/device.h | 1 + src/video/vid_table.c | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/device.c b/src/device.c index 136c11446..75ea59ff4 100644 --- a/src/device.c +++ b/src/device.c @@ -339,6 +339,29 @@ device_available(const device_t *d) } +int +device_has_config(const device_t *d) +{ + int c = 0; + + if (d == NULL) + return 0; + + if (d->config == NULL) + return 0; + + config = d->config; + + while (config->type != -1) { + if (config->type != CONFIG_MAC) + c++; + config++; + } + + return (c > 0) ? 1 : 0; +} + + int device_poll(const device_t *d, int x, int y, int z, int b) { diff --git a/src/include/86box/device.h b/src/include/86box/device.h index 28e9485ef..afd7c3731 100644 --- a/src/include/86box/device.h +++ b/src/include/86box/device.h @@ -147,6 +147,7 @@ extern void device_register_pci_slot(const device_t *d, int device, int type, i extern void device_speed_changed(void); extern void device_force_redraw(void); extern void device_get_name(const device_t *d, int bus, char *name); +extern int device_has_config(const device_t *d); extern int device_is_valid(const device_t *, int m); diff --git a/src/video/vid_table.c b/src/video/vid_table.c index ccd9c4071..02d5ad81c 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -364,7 +364,7 @@ video_card_has_config(int card) { if (video_cards[card].device == NULL) return(0); - return(video_cards[card].device->config ? 1 : 0); + return(device_has_config(video_cards[card].device) ? 1 : 0); } From 8714f7969376273505dec33fca92dd8395c335ca Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 4 Apr 2022 18:15:41 +0200 Subject: [PATCH 04/21] Phase 2 (Bug fix and Sound). --- src/device.c | 3 ++- src/sound/sound.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/device.c b/src/device.c index 75ea59ff4..501ae6b64 100644 --- a/src/device.c +++ b/src/device.c @@ -343,6 +343,7 @@ int device_has_config(const device_t *d) { int c = 0; + device_config_t *config; if (d == NULL) return 0; @@ -350,7 +351,7 @@ device_has_config(const device_t *d) if (d->config == NULL) return 0; - config = d->config; + config = (device_config_t *) d->config; while (config->type != -1) { if (config->type != CONFIG_MAC) diff --git a/src/sound/sound.c b/src/sound/sound.c index 5a3e978f6..5110b9c59 100644 --- a/src/sound/sound.c +++ b/src/sound/sound.c @@ -186,7 +186,7 @@ sound_card_has_config(int card) { if (!sound_cards[card].device) return 0; - return sound_cards[card].device->config ? 1 : 0; + return device_has_config(sound_cards[card].device) ? 1 : 0; } char * From 1a99a7cc6aa972d93aef0c798e8a009045504e23 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 4 Apr 2022 18:16:53 +0200 Subject: [PATCH 05/21] Phase 3 (Network and SCSI). --- src/network/network.c | 2 +- src/scsi/scsi.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network/network.c b/src/network/network.c index a02000372..cb81ea154 100644 --- a/src/network/network.c +++ b/src/network/network.c @@ -630,7 +630,7 @@ network_card_has_config(int card) { if (! net_cards[card].device) return(0); - return(net_cards[card].device->config ? 1 : 0); + return(device_has_config(net_cards[card].device) ? 1 : 0); } diff --git a/src/scsi/scsi.c b/src/scsi/scsi.c index 7edfa1844..cf6f0207e 100644 --- a/src/scsi/scsi.c +++ b/src/scsi/scsi.c @@ -153,7 +153,7 @@ scsi_card_has_config(int card) { if (! scsi_cards[card].device) return(0); - return(scsi_cards[card].device->config ? 1 : 0); + return(device_had_config(scsi_cards[card].device) ? 1 : 0); } From b455d8f64d681312fbb39610274879e75552bfc6 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 4 Apr 2022 18:19:14 +0200 Subject: [PATCH 06/21] SCSI Bugfix, HDC, and FDC. --- src/disk/hdc.c | 2 +- src/floppy/fdc.c | 2 +- src/scsi/scsi.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/disk/hdc.c b/src/disk/hdc.c index 90d46a815..7ba9a0f1e 100644 --- a/src/disk/hdc.c +++ b/src/disk/hdc.c @@ -202,7 +202,7 @@ hdc_has_config(int hdc) if (dev == NULL) return(0); - if (dev->config == NULL) return(0); + if (!device_has_config(dev)) return(0); return(1); } diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 171a77fa7..a28328587 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -154,7 +154,7 @@ fdc_card_has_config(int card) { if (! fdc_cards[card].device) return(0); - return(fdc_cards[card].device->config ? 1 : 0); + return(device_has_config(fdc_cards[card].device) ? 1 : 0); } diff --git a/src/scsi/scsi.c b/src/scsi/scsi.c index cf6f0207e..675abff26 100644 --- a/src/scsi/scsi.c +++ b/src/scsi/scsi.c @@ -153,7 +153,7 @@ scsi_card_has_config(int card) { if (! scsi_cards[card].device) return(0); - return(device_had_config(scsi_cards[card].device) ? 1 : 0); + return(device_has_config(scsi_cards[card].device) ? 1 : 0); } From 4b09a6329aa8b5cb9392c5bab7a97e152b7d9fef Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 5 Apr 2022 02:16:23 +0600 Subject: [PATCH 07/21] Multiple ROM paths implementation --- src/86box.c | 129 +++++++++++++++++++++++++++++++++++----- src/include/86box/rom.h | 7 +++ src/mem/rom.c | 12 +++- 3 files changed, 132 insertions(+), 16 deletions(-) diff --git a/src/86box.c b/src/86box.c index db0182d84..a645d88d6 100644 --- a/src/86box.c +++ b/src/86box.c @@ -32,6 +32,7 @@ #ifndef _WIN32 #include +#include #endif #ifdef __APPLE__ #include @@ -125,6 +126,7 @@ uint64_t unique_id = 0; uint64_t source_hwnd = 0; #endif char rom_path[1024] = { '\0'}; /* (O) full path to ROMs */ +rom_path_t rom_paths = { "", NULL }; /* (O) full paths to ROMs */ char log_path[1024] = { '\0'}; /* (O) full path of logfile */ char vm_name[1024] = { '\0'}; /* (O) display name of the VM */ @@ -383,6 +385,48 @@ pc_log(const char *fmt, ...) #define pc_log(fmt, ...) #endif +static void +add_rom_path(const char* path) +{ + static char cwd[1024]; + memset(cwd, 0x00, sizeof(cwd)); + rom_path_t* cur_rom_path = &rom_paths; + while (cur_rom_path->next != NULL) { + cur_rom_path = cur_rom_path->next; + } + if (!plat_path_abs((char*)path)) { + /* + * This looks like a relative path. + * + * Add it to the current working directory + * to convert it (back) to an absolute path. + */ + plat_getcwd(cwd, 1024); + plat_path_slash(cwd); + snprintf(cur_rom_path->rom_path, 1024, "%s%s%c", cwd, path, 0); + } + else { + /* + * The user-provided path seems like an + * absolute path, so just use that. + */ + strncpy(cur_rom_path->rom_path, path, 1024); + } + plat_path_slash(cur_rom_path->rom_path); + cur_rom_path->next = calloc(1, sizeof(rom_path_t)); +} + +// Copied over from Unix code, which in turn is lifted from musl. Needed for parsing XDG_DATA_DIRS. +static char *local_strsep(char **str, const char *sep) +{ + char *s = *str, *end; + if (!s) return NULL; + end = s + strcspn(s, sep); + if (*end) *end++ = 0; + else end = 0; + *str = end; + return s; +} /* * Perform initial startup of the PC. @@ -496,6 +540,7 @@ usage: if ((c+1) == argc) goto usage; strcpy(path2, argv[++c]); + add_rom_path(path2); } else if (!strcasecmp(argv[c], "--config") || !strcasecmp(argv[c], "-C")) { if ((c+1) == argc) goto usage; @@ -591,26 +636,77 @@ usage: plat_dir_create(usr_path); } - if (path2[0] == '\0') { + if (vmrp) { + char vmrppath[1024] = { 0 }; + strcpy(vmrppath, usr_path); + plat_path_slash(vmrppath); + strcat(vmrppath, "roms"); + plat_path_slash(vmrppath); + add_rom_path(vmrppath); + if (path2[0] == '\0') { + strcpy(path2, vmrppath); + } + } + + { + char default_rom_path[1024] = { 0 }; #if defined(__APPLE__) - getDefaultROMPath(path2); + getDefaultROMPath(default_rom_path); #elif !defined(_WIN32) appimage = getenv("APPIMAGE"); if (appimage && (appimage[0] != '\0')) { - plat_get_dirname(path2, appimage); - plat_path_slash(path2); - strcat(path2, "roms"); - plat_path_slash(path2); + plat_get_dirname(default_rom_path, appimage); + plat_path_slash(default_rom_path); + strcat(default_rom_path, "roms"); + plat_path_slash(default_rom_path); } #endif + if (default_rom_path[0] == '\0') { + plat_getcwd(default_rom_path, 1024); + plat_path_slash(default_rom_path); + snprintf(default_rom_path, 1024, "%s%s%c", default_rom_path, "roms", 0); + plat_path_slash(default_rom_path); + } + add_rom_path(default_rom_path); + if (path2[0] == '\0') { + strcpy(path2, default_rom_path); + } } - if (vmrp && (path2[0] == '\0')) { - strcpy(path2, usr_path); - plat_path_slash(path2); - strcat(path2, "roms"); - plat_path_slash(path2); - } +#if !defined __APPLE__ && !defined _WIN32 + if (getenv("XDG_DATA_HOME")) { + char xdg_rom_path[1024] = { 0 }; + strncpy(xdg_rom_path, getenv("XDG_DATA_HOME"), 1024); + plat_path_slash(xdg_rom_path); + strcat(xdg_rom_path, "86Box/roms/"); + add_rom_path(xdg_rom_path); + } else { + char home_rom_path[1024] = { 0 }; + snprintf(home_rom_path, 1024, "%s/.local/share/86Box/roms/", getenv("HOME") ? getenv("HOME") : getpwuid(getuid())->pw_dir); + add_rom_path(home_rom_path); + } + if (getenv("XDG_DATA_DIRS")) { + char* xdg_rom_paths = strdup(getenv("XDG_DATA_DIRS")); + char* xdg_rom_paths_orig = xdg_rom_paths; + char* cur_xdg_rom_path = NULL; + if (xdg_rom_paths) { + while (xdg_rom_paths[strlen(xdg_rom_paths) - 1] == ':') { + xdg_rom_paths[strlen(xdg_rom_paths) - 1] = '\0'; + } + while ((cur_xdg_rom_path = local_strsep(&xdg_rom_paths, ";")) != NULL) { + char real_xdg_rom_path[1024] = { '\0' }; + strcat(real_xdg_rom_path, cur_xdg_rom_path); + plat_path_slash(real_xdg_rom_path); + strcat(real_xdg_rom_path, "86Box/roms/"); + add_rom_path(real_xdg_rom_path); + } + } + free(xdg_rom_paths_orig); + } else { + add_rom_path("/usr/local/share/86Box/roms/"); + add_rom_path("/usr/share/86Box/roms/"); + } +#endif /* * If the user provided a path for ROMs, use that @@ -708,8 +804,13 @@ usage: pclog("# VM: %s\n#\n", vm_name); pclog("# Emulator path: %s\n", exe_path); pclog("# Userfiles path: %s\n", usr_path); - if (rom_path[0] != '\0') - pclog("# ROM path: %s\n", rom_path); + if (rom_paths.next) { + rom_path_t* cur_rom_path = &rom_paths; + while (cur_rom_path->next) { + pclog("# ROM path: %s\n", cur_rom_path->rom_path); + cur_rom_path = cur_rom_path->next; + } + } else #ifndef _WIN32 pclog("# ROM path: %sroms/\n", exe_path); diff --git a/src/include/86box/rom.h b/src/include/86box/rom.h index dfea9f0b5..63500d912 100644 --- a/src/include/86box/rom.h +++ b/src/include/86box/rom.h @@ -41,6 +41,13 @@ typedef struct { } rom_t; +typedef struct rom_path_t { + char rom_path[1024]; + struct rom_path_t* next; +} rom_path_t; + +extern rom_path_t rom_paths; + extern uint8_t rom_read(uint32_t addr, void *p); extern uint16_t rom_readw(uint32_t addr, void *p); extern uint32_t rom_readl(uint32_t addr, void *p); diff --git a/src/mem/rom.c b/src/mem/rom.c index 30e873a4e..907c090ee 100644 --- a/src/mem/rom.c +++ b/src/mem/rom.c @@ -69,11 +69,19 @@ rom_fopen(char *fn, char *mode) fn2 = (char *) malloc(strlen(fn) + 1); memcpy(fn2, fn, strlen(fn) + 1); - if (rom_path[0] != '\0') { + if (rom_paths.next) { + rom_path_t* cur_rom_path = &rom_paths; memset(fn2, 0x00, strlen(fn) + 1); memcpy(fn2, &(fn[5]), strlen(fn) - 4); - plat_append_filename(temp, rom_path, fn2); + while (cur_rom_path->next) { + memset(temp, 0, sizeof(temp)); + plat_append_filename(temp, cur_rom_path->rom_path, fn2); + if (rom_present(temp)) { + break; + } + cur_rom_path = cur_rom_path->next; + } } else { /* Make sure to make it a backslash, just in case there's malformed code calling us that assumes Windows. */ From d0191d492884beb427fce733702d8b8eecb8f168 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 5 Apr 2022 15:25:48 +0600 Subject: [PATCH 08/21] Create ROM directories in home folder on Unix if they doesn't exist --- src/86box.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/86box.c b/src/86box.c index a645d88d6..73eb582a4 100644 --- a/src/86box.c +++ b/src/86box.c @@ -678,11 +678,25 @@ usage: char xdg_rom_path[1024] = { 0 }; strncpy(xdg_rom_path, getenv("XDG_DATA_HOME"), 1024); plat_path_slash(xdg_rom_path); - strcat(xdg_rom_path, "86Box/roms/"); + strncat(xdg_rom_path, "86Box/", 1024); + + if (!plat_dir_check(xdg_rom_path)) + plat_dir_create(xdg_rom_path); + strcat(xdg_rom_path, "roms/"); + + if (!plat_dir_check(xdg_rom_path)) + plat_dir_create(xdg_rom_path); add_rom_path(xdg_rom_path); } else { char home_rom_path[1024] = { 0 }; - snprintf(home_rom_path, 1024, "%s/.local/share/86Box/roms/", getenv("HOME") ? getenv("HOME") : getpwuid(getuid())->pw_dir); + snprintf(home_rom_path, 1024, "%s/.local/share/86Box/", getenv("HOME") ? getenv("HOME") : getpwuid(getuid())->pw_dir); + + if (!plat_dir_check(home_rom_path)) + plat_dir_create(home_rom_path); + strcat(home_rom_path, "roms/"); + + if (!plat_dir_check(home_rom_path)) + plat_dir_create(home_rom_path); add_rom_path(home_rom_path); } if (getenv("XDG_DATA_DIRS")) { From 2c63f5b4977d8a972fd074cc4aa75c6930b8bd2e Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 6 Apr 2022 00:18:17 +0600 Subject: [PATCH 09/21] rom_getfile now works properly --- src/mem/rom.c | 51 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/src/mem/rom.c b/src/mem/rom.c index 907c090ee..3dcbfe568 100644 --- a/src/mem/rom.c +++ b/src/mem/rom.c @@ -105,17 +105,54 @@ rom_fopen(char *fn, char *mode) int rom_getfile(char *fn, char *s, int size) { - FILE *f; + char temp[1024] = {'\0'}; + char *fn2; + int retval = 0; - plat_append_filename(s, exe_path, fn); + if ((strstr(fn, "roms/") == fn) || (strstr(fn, "roms\\") == fn)) { + /* Relative path */ + fn2 = (char *) malloc(strlen(fn) + 1); + memcpy(fn2, fn, strlen(fn) + 1); - f = plat_fopen(s, "rb"); - if (f != NULL) { - (void)fclose(f); - return(1); + if (rom_paths.next) { + rom_path_t* cur_rom_path = &rom_paths; + memset(fn2, 0x00, strlen(fn) + 1); + memcpy(fn2, &(fn[5]), strlen(fn) - 4); + + while (cur_rom_path->next) { + memset(temp, 0, sizeof(temp)); + plat_append_filename(temp, cur_rom_path->rom_path, fn2); + if (rom_present(temp)) { + strncpy(s, temp, size); + retval = 1; + break; + } + cur_rom_path = cur_rom_path->next; + } + } else { + /* Make sure to make it a backslash, just in case there's malformed + code calling us that assumes Windows. */ + if (fn2[4] == '\\') + fn2[4] = '/'; + + plat_append_filename(temp, exe_path, fn2); + if (rom_present(temp)) { + strncpy(s, temp, size); + retval = 1; + } } - return(0); + free(fn2); + fn2 = NULL; + } else { + /* Absolute path */ + if (rom_present(fn)) { + strncpy(s, fn, size); + retval = 1; + } + } + + return(retval); } From 1a3a7bec0e2af25ad03b95ff9b27d948b0996cee Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 6 Apr 2022 16:16:25 +0600 Subject: [PATCH 10/21] Move platform-specific ROM path adding code into plat modules --- src/86box.c | 51 ++-------------------------------- src/include/86box/plat.h | 1 + src/include/86box/rom.h | 2 ++ src/qt/qt_platform.cpp | 59 ++++++++++++++++++++++++++++++++++++++++ src/unix/unix.c | 55 +++++++++++++++++++++++++++++++++++++ src/win/win.c | 26 ++++++++++++++++++ 6 files changed, 145 insertions(+), 49 deletions(-) diff --git a/src/86box.c b/src/86box.c index 73eb582a4..4eae7ab02 100644 --- a/src/86box.c +++ b/src/86box.c @@ -385,7 +385,7 @@ pc_log(const char *fmt, ...) #define pc_log(fmt, ...) #endif -static void +void add_rom_path(const char* path) { static char cwd[1024]; @@ -673,54 +673,7 @@ usage: } } -#if !defined __APPLE__ && !defined _WIN32 - if (getenv("XDG_DATA_HOME")) { - char xdg_rom_path[1024] = { 0 }; - strncpy(xdg_rom_path, getenv("XDG_DATA_HOME"), 1024); - plat_path_slash(xdg_rom_path); - strncat(xdg_rom_path, "86Box/", 1024); - - if (!plat_dir_check(xdg_rom_path)) - plat_dir_create(xdg_rom_path); - strcat(xdg_rom_path, "roms/"); - - if (!plat_dir_check(xdg_rom_path)) - plat_dir_create(xdg_rom_path); - add_rom_path(xdg_rom_path); - } else { - char home_rom_path[1024] = { 0 }; - snprintf(home_rom_path, 1024, "%s/.local/share/86Box/", getenv("HOME") ? getenv("HOME") : getpwuid(getuid())->pw_dir); - - if (!plat_dir_check(home_rom_path)) - plat_dir_create(home_rom_path); - strcat(home_rom_path, "roms/"); - - if (!plat_dir_check(home_rom_path)) - plat_dir_create(home_rom_path); - add_rom_path(home_rom_path); - } - if (getenv("XDG_DATA_DIRS")) { - char* xdg_rom_paths = strdup(getenv("XDG_DATA_DIRS")); - char* xdg_rom_paths_orig = xdg_rom_paths; - char* cur_xdg_rom_path = NULL; - if (xdg_rom_paths) { - while (xdg_rom_paths[strlen(xdg_rom_paths) - 1] == ':') { - xdg_rom_paths[strlen(xdg_rom_paths) - 1] = '\0'; - } - while ((cur_xdg_rom_path = local_strsep(&xdg_rom_paths, ";")) != NULL) { - char real_xdg_rom_path[1024] = { '\0' }; - strcat(real_xdg_rom_path, cur_xdg_rom_path); - plat_path_slash(real_xdg_rom_path); - strcat(real_xdg_rom_path, "86Box/roms/"); - add_rom_path(real_xdg_rom_path); - } - } - free(xdg_rom_paths_orig); - } else { - add_rom_path("/usr/local/share/86Box/roms/"); - add_rom_path("/usr/share/86Box/roms/"); - } -#endif + plat_init_rom_paths(); /* * If the user provided a path for ROMs, use that diff --git a/src/include/86box/plat.h b/src/include/86box/plat.h index 71ad89927..ad7006165 100644 --- a/src/include/86box/plat.h +++ b/src/include/86box/plat.h @@ -104,6 +104,7 @@ extern int plat_getcwd(char *bufp, int max); extern int plat_chdir(char *path); extern void plat_tempfile(char *bufp, char *prefix, char *suffix); extern void plat_get_exe_name(char *s, int size); +extern void plat_init_rom_paths(); extern char *plat_get_basename(const char *path); extern void plat_get_dirname(char *dest, const char *path); extern char *plat_get_filename(char *s); diff --git a/src/include/86box/rom.h b/src/include/86box/rom.h index 63500d912..04fe94422 100644 --- a/src/include/86box/rom.h +++ b/src/include/86box/rom.h @@ -48,6 +48,8 @@ typedef struct rom_path_t { extern rom_path_t rom_paths; +extern void add_rom_path(const char* path); + extern uint8_t rom_read(uint32_t addr, void *p); extern uint16_t rom_readw(uint32_t addr, void *p); extern uint32_t rom_readl(uint32_t addr, void *p); diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index 508103169..c48a84020 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -88,6 +88,8 @@ extern "C" { #include <86box/timer.h> #include <86box/nvr.h> #include <86box/plat_dynld.h> +#include <86box/mem.h> +#include <86box/rom.h> #include <86box/config.h> #include <86box/ui.h> #include <86box/discord.h> @@ -583,3 +585,60 @@ plat_chdir(char *path) { return QDir::setCurrent(QString(path)) ? 0 : -1; } + +void +plat_init_rom_paths() +{ +#if !defined __APPLE__ && !defined _WIN32 + if (getenv("XDG_DATA_HOME")) { + char xdg_rom_path[1024] = { 0 }; + strncpy(xdg_rom_path, getenv("XDG_DATA_HOME"), 1024); + plat_path_slash(xdg_rom_path); + strncat(xdg_rom_path, "86Box/", 1024); + + if (!plat_dir_check(xdg_rom_path)) + plat_dir_create(xdg_rom_path); + strcat(xdg_rom_path, "roms/"); + + if (!plat_dir_check(xdg_rom_path)) + plat_dir_create(xdg_rom_path); + add_rom_path(xdg_rom_path); + } else { + char home_rom_path[1024] = { 0 }; + snprintf(home_rom_path, 1024, "%s/.local/share/86Box/", getenv("HOME") ? getenv("HOME") : QDir::homePath().toUtf8().constData()); + + if (!plat_dir_check(home_rom_path)) + plat_dir_create(home_rom_path); + strcat(home_rom_path, "roms/"); + + if (!plat_dir_check(home_rom_path)) + plat_dir_create(home_rom_path); + add_rom_path(home_rom_path); + } + if (getenv("XDG_DATA_DIRS")) { + char* xdg_rom_paths = strdup(getenv("XDG_DATA_DIRS")); + char* xdg_rom_paths_orig = xdg_rom_paths; + char* cur_xdg_rom_path = NULL; + if (xdg_rom_paths) { + while (xdg_rom_paths[strlen(xdg_rom_paths) - 1] == ':') { + xdg_rom_paths[strlen(xdg_rom_paths) - 1] = '\0'; + } + QStringList path_list = QString(xdg_rom_paths).split(":", Qt::SkipEmptyParts); + for (auto& cur_path : path_list) { + if (cur_path.right(1) != '/') + cur_path.push_back('/'); + add_rom_path((cur_path + "86Box/roms").toUtf8().constData()); + } + } + free(xdg_rom_paths_orig); + } else { + add_rom_path("/usr/local/share/86Box/roms/"); + add_rom_path("/usr/share/86Box/roms/"); + } +#elif _WIN32 + auto appDataDir = QDir(qEnvironmentVariable("LOCALAPPDATA")); + appDataDir.mkdir("86Box"); + appDataDir.mkdir("86Box/roms"); + add_rom_path((appDataDir.path().replace("\\","/") + "/86Box/roms").toUtf8().constData()); +#endif +} diff --git a/src/unix/unix.c b/src/unix/unix.c index 1f60ad565..1c8917626 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -21,6 +21,8 @@ #include #include <86box/86box.h> +#include <86box/mem.h> +#include <86box/rom.h> #include <86box/keyboard.h> #include <86box/mouse.h> #include <86box/config.h> @@ -744,6 +746,59 @@ plat_pause(int p) } } +void +plat_init_rom_paths() +{ +#ifndef __APPLE__ + if (getenv("XDG_DATA_HOME")) { + char xdg_rom_path[1024] = { 0 }; + strncpy(xdg_rom_path, getenv("XDG_DATA_HOME"), 1024); + plat_path_slash(xdg_rom_path); + strncat(xdg_rom_path, "86Box/", 1024); + + if (!plat_dir_check(xdg_rom_path)) + plat_dir_create(xdg_rom_path); + strcat(xdg_rom_path, "roms/"); + + if (!plat_dir_check(xdg_rom_path)) + plat_dir_create(xdg_rom_path); + add_rom_path(xdg_rom_path); + } else { + char home_rom_path[1024] = { 0 }; + snprintf(home_rom_path, 1024, "%s/.local/share/86Box/", getenv("HOME") ? getenv("HOME") : getpwuid(getuid())->pw_dir); + + if (!plat_dir_check(home_rom_path)) + plat_dir_create(home_rom_path); + strcat(home_rom_path, "roms/"); + + if (!plat_dir_check(home_rom_path)) + plat_dir_create(home_rom_path); + add_rom_path(home_rom_path); + } + if (getenv("XDG_DATA_DIRS")) { + char* xdg_rom_paths = strdup(getenv("XDG_DATA_DIRS")); + char* xdg_rom_paths_orig = xdg_rom_paths; + char* cur_xdg_rom_path = NULL; + if (xdg_rom_paths) { + while (xdg_rom_paths[strlen(xdg_rom_paths) - 1] == ':') { + xdg_rom_paths[strlen(xdg_rom_paths) - 1] = '\0'; + } + while ((cur_xdg_rom_path = local_strsep(&xdg_rom_paths, ";")) != NULL) { + char real_xdg_rom_path[1024] = { '\0' }; + strcat(real_xdg_rom_path, cur_xdg_rom_path); + plat_path_slash(real_xdg_rom_path); + strcat(real_xdg_rom_path, "86Box/roms/"); + add_rom_path(real_xdg_rom_path); + } + } + free(xdg_rom_paths_orig); + } else { + add_rom_path("/usr/local/share/86Box/roms/"); + add_rom_path("/usr/share/86Box/roms/"); + } +#endif +} + bool process_media_commands_3(uint8_t* id, char* fn, uint8_t* wp, int cmdargc) { bool err = false; diff --git a/src/win/win.c b/src/win/win.c index f4b906d7d..06db20bad 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -45,6 +45,8 @@ #include <86box/timer.h> #include <86box/nvr.h> #include <86box/video.h> +#include <86box/mem.h> +#include <86box/rom.h> #define GLOBAL #include <86box/plat.h> #include <86box/ui.h> @@ -910,6 +912,30 @@ plat_mmap(size_t size, uint8_t executable) } +void +plat_init_rom_paths() +{ + wchar_t appdata_dir[1024] = { L'\0' }; + + if (_wgetenv("LOCALAPPDATA") && _wgetenv("LOCALAPPDATA")[0] != L'\0') { + char appdata_dir_a[1024] = { '\0' }; + size_t len = 0; + wcsncpy(appdata_dir, _wgetenv("LOCALAPPDATA"), 1024); + len = wcslen(appdata_dir); + if (appdata_dir[len - 1] != L'\\') { + appdata_dir[len] = L'\\'; + appdata_dir[len + 1] = L'\0'; + } + wcscat(appdata_dir, "86box"); + CreateDirectoryW(appdata_dir, NULL); + wcscat(appdata_dir, "\\roms"); + CreateDirectoryW(appdata_dir, NULL); + wcscat(appdata_dir, "\\"); + c16stombs(appdata_dir_a, appdata_dir, 1024); + add_rom_path(appdata_dir_a); + } +} + void plat_munmap(void *ptr, size_t size) { From f8c53dec3ab9f524e007817a6012a743313a41da Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 6 Apr 2022 19:56:30 +0600 Subject: [PATCH 11/21] qt: Fix compilation on Linux --- src/qt/qt_platform.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index c48a84020..2033421b8 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -623,7 +623,7 @@ plat_init_rom_paths() while (xdg_rom_paths[strlen(xdg_rom_paths) - 1] == ':') { xdg_rom_paths[strlen(xdg_rom_paths) - 1] = '\0'; } - QStringList path_list = QString(xdg_rom_paths).split(":", Qt::SkipEmptyParts); + QStringList path_list = QString(xdg_rom_paths).split(":"); for (auto& cur_path : path_list) { if (cur_path.right(1) != '/') cur_path.push_back('/'); From e860c480b841a5410d34fb5874da096b786e955f Mon Sep 17 00:00:00 2001 From: richardg867 Date: Wed, 6 Apr 2022 15:27:10 -0300 Subject: [PATCH 12/21] Jenkins: Add MacPorts dependencies file --- .ci/dependencies_macports.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .ci/dependencies_macports.txt diff --git a/.ci/dependencies_macports.txt b/.ci/dependencies_macports.txt new file mode 100644 index 000000000..4171a0a69 --- /dev/null +++ b/.ci/dependencies_macports.txt @@ -0,0 +1,10 @@ +cmake@3.22.3_0 +pkgconfig@0.29.2_0 +ninja@1.10.2_4 +freetype@2.11.1_0 +libsdl2@2.0.20_0 +libpng@1.6.37_0 +openal-soft@1.21.1_0 +rtmidi@5.0.0_0 +qt5@5.15.3_0 +wget From e1906c03b3fa015f7b2f6443c1f599905d577a30 Mon Sep 17 00:00:00 2001 From: richardg867 Date: Wed, 6 Apr 2022 15:28:23 -0300 Subject: [PATCH 13/21] Jenkins: Add macOS to the build script --- .ci/build.sh | 86 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 58 insertions(+), 28 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index 0a1eb9ef3..9d476f6b7 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -28,9 +28,13 @@ # - Packaging the Discord DLL requires wget (MSYS should come with it) # - For Linux builds: # - Only Debian and derivatives are supported -# - dpkg and apt-get are called through sudo to manage dependencies +# - dpkg and apt-get are called through sudo to manage dependencies; make sure those +# are configured as NOPASSWD in /etc/sudoers if you're doing unattended builds # - For macOS builds: -# - TBD +# - A standard MacPorts installation is required, with the following macports.conf settings: +# +# - port is called through sudo to manage dependencies; make sure it is configured +# as NOPASSWD in /etc/sudoers if you're doing unattended builds # # Define common functions. @@ -178,13 +182,16 @@ fi echo [-] Building [$package_name] for [$arch] with flags [$cmake_flags] # Determine CMake toolchain file for this architecture. +toolchain_prefix=flags-gcc +is_mac && toolchain_prefix=llvm-macos case $arch in - 32 | x86) toolchain="flags-gcc-i686";; - 64 | x86_64) toolchain="flags-gcc-x86_64";; - ARM32 | arm32) toolchain="flags-gcc-armv7";; - ARM64 | arm64) toolchain="flags-gcc-aarch64";; - *) toolchain="flags-gcc-$arch";; + 32 | x86) toolchain="$toolchain_prefix-i686";; + 64 | x86_64) toolchain="$toolchain_prefix-x86_64";; + ARM32 | arm32) toolchain="$toolchain_prefix-armv7";; + ARM64 | arm64) toolchain="$toolchain_prefix-aarch64";; + *) toolchain="$toolchain_prefix-$arch";; esac +[ ! -e "cmake/$toolchain.cmake" ] && toolchain=flags-gcc # Perform platform-specific setup. strip_binary=strip @@ -313,11 +320,19 @@ then fi # Point CMake to the toolchain file. - cmake_flags_extra="$cmake_flags_extra -D \"CMAKE_TOOLCHAIN_FILE=cmake/$toolchain.cmake\"" + [ -e "cmake/$toolchain.cmake" ] && cmake_flags_extra="$cmake_flags_extra -D \"CMAKE_TOOLCHAIN_FILE=cmake/$toolchain.cmake\"" elif is_mac then # macOS lacks nproc, but sysctl can do the same job. alias nproc='sysctl -n hw.logicalcpu' + + # Install dependencies. + echo [-] Installing dependencies through MacPorts + sudo port selfupdate + sudo port install $(cat .ci/dependencies_macports.txt) + + # Point CMake to the toolchain file. + [ -e "cmake/$toolchain.cmake" ] && cmake_flags_extra="$cmake_flags_extra -D \"CMAKE_TOOLCHAIN_FILE=cmake/$toolchain.cmake\"" else # Determine Debian architecture. case $arch in @@ -350,18 +365,18 @@ else [ $length -gt $longest_libpkg ] && longest_libpkg=$length done - # Determine GNU toolchain architecture. + # Determine toolchain architecture triplet. case $arch in - x86) arch_gnu="i686-linux-gnu";; - arm32) arch_gnu="arm-linux-gnueabihf";; - arm64) arch_gnu="aarch64-linux-gnu";; - *) arch_gnu="$arch-linux-gnu";; + x86) arch_triplet="i686-linux-gnu";; + arm32) arch_triplet="arm-linux-gnueabihf";; + arm64) arch_triplet="aarch64-linux-gnu";; + *) arch_triplet="$arch-linux-gnu";; esac # Determine library directory name for this architecture. case $arch in x86) libdir="i386-linux-gnu";; - *) libdir="$arch_gnu";; + *) libdir="$arch_triplet";; esac # Create CMake toolchain file. @@ -369,15 +384,15 @@ else set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR $arch) -set(CMAKE_AR $arch_gnu-ar) -set(CMAKE_ASM_COMPILER $arch_gnu-gcc) -set(CMAKE_C_COMPILER $arch_gnu-gcc) -set(CMAKE_CXX_COMPILER $arch_gnu-g++) -set(CMAKE_LINKER $arch_gnu-ld) -set(CMAKE_OBJCOPY $arch_gnu-objcopy) -set(CMAKE_RANLIB $arch_gnu-ranlib) -set(CMAKE_SIZE $arch_gnu-size) -set(CMAKE_STRIP $arch_gnu-strip) +set(CMAKE_AR $arch_triplet-ar) +set(CMAKE_ASM_COMPILER $arch_triplet-gcc) +set(CMAKE_C_COMPILER $arch_triplet-gcc) +set(CMAKE_CXX_COMPILER $arch_triplet-g++) +set(CMAKE_LINKER $arch_triplet-ld) +set(CMAKE_OBJCOPY $arch_triplet-objcopy) +set(CMAKE_RANLIB $arch_triplet-ranlib) +set(CMAKE_SIZE $arch_triplet-size) +set(CMAKE_STRIP $arch_triplet-strip) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) @@ -389,7 +404,7 @@ set(ENV{PKG_CONFIG_LIBDIR} "/usr/lib/$libdir/pkgconfig:/usr/share/$libdir/pkgcon include("$(pwd)/cmake/$toolchain.cmake") EOF cmake_flags_extra="$cmake_flags_extra -D CMAKE_TOOLCHAIN_FILE=toolchain.cmake" - strip_binary="$arch_gnu-strip" + strip_binary="$arch_triplet-strip" # Install or update dependencies. echo [-] Installing dependencies through apt @@ -524,8 +539,21 @@ then fi elif is_mac then - # TBD - : + # Archive app bundle with libraries. + cmake_flags_install= + [ $strip -ne 0 ] && cmake_flags_install="$cmake_flags_install --strip" + cmake --install build --prefix "$(pwd)/archive_tmp" $cmake_flags_install + status=$? + + if [ $status -eq 0 ] + then + # Archive Discord Game SDK library. + unzip discord_game_sdk.zip "lib/$arch_discord/discord_game_sdk.dylib" -d "archive_tmp/"*".app/Contents/Frameworks" + [ ! -e "archive_tmp/"*".app/Contents/Frameworks/discord_game_sdk.dylib" ] && echo [!] No Discord Game SDK for architecture [$arch_discord] + + # Sign app bundle. + codesign --force --deep -s - "archive_tmp/"*".app" + fi else cwd_root=$(pwd) @@ -643,8 +671,10 @@ then status=$? elif is_mac then - # TBD - : + # Create zip. (TODO: dmg) + cd archive_tmp + zip -r "$cwd/$package_name.zip" . + status=$? else # Determine AppImage runtime architecture. case $arch in From ce7a1ad1c1d8e6dbc5f3c1ed81d6ef95132bff24 Mon Sep 17 00:00:00 2001 From: richardg867 Date: Wed, 6 Apr 2022 15:38:27 -0300 Subject: [PATCH 14/21] Jenkins: Use OpenAL on macOS --- .ci/build.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.ci/build.sh b/.ci/build.sh index 9d476f6b7..4e164bcdf 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -333,6 +333,9 @@ then # Point CMake to the toolchain file. [ -e "cmake/$toolchain.cmake" ] && cmake_flags_extra="$cmake_flags_extra -D \"CMAKE_TOOLCHAIN_FILE=cmake/$toolchain.cmake\"" + + # Use OpenAL. + cmake_flags_extra="$cmake_flags_extra -D OPENAL=ON" else # Determine Debian architecture. case $arch in From 7f27f44b3a6a24f711466319c8e80a2faa7b217f Mon Sep 17 00:00:00 2001 From: richardg867 Date: Wed, 6 Apr 2022 15:39:32 -0300 Subject: [PATCH 15/21] Jenkins: Add macOS Intel to Jenkinsfile --- .ci/Jenkinsfile | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index 3d4fa7e13..e9fd8b986 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -16,20 +16,22 @@ */ /* ['main builds', 'branch builds'] */ -def repository = ['https://github.com/86Box/86Box.git', 'https://github.com/richardg867/86Box.git'] +def repository = ['https://github.com/86Box/86Box.git', scm.userRemoteConfigs[0].url] def commitBrowser = ['https://github.com/86Box/86Box/commit/%s', null] -def branch = ['master', 'cleanup30'] +def branch = ['master', scm.branches[0].name] def buildType = ['beta', 'alpha'] def buildBranch = env.JOB_BASE_NAME.contains('-') ? 1 : 0 def osArchs = [ 'Windows': ['32', '64'], - 'Linux': ['x86', 'x86_64', 'arm32', 'arm64'] + 'Linux': ['x86', 'x86_64', 'arm32', 'arm64'], + 'macOS': ['x86_64'] ] def osFlags = [ 'Windows': '-D QT=ON', - 'Linux': '-D QT=ON' + 'Linux': '-D QT=ON', + 'macOS': '-D QT=ON' ] def archNames = [ @@ -41,6 +43,11 @@ def archNames = [ 'arm64': 'ARM (64-bit)' ] +def archNamesMac = [ + 'x86_64': 'Intel', + 'arm64': 'Apple Silicon' +] + def dynarecNames = [ 'ODR': 'Old Recompiler (recommended)', 'NDR': 'New Recompiler (beta)', @@ -53,9 +60,7 @@ def dynarecArchs = [ '64': ['ODR', 'NDR'], 'x86_64': ['ODR', 'NDR'], 'arm32': ['NDR'], - 'ARM32': ['NDR'], - 'arm64': ['NDR'], - 'ARM64': ['NDR'] + 'arm64': ['NDR'] ] def dynarecFlags = [ @@ -238,7 +243,7 @@ pipeline { osArchs.each { os, thisOsArchs -> def combinations = [:] thisOsArchs.each { arch -> - def thisArchDynarecs = dynarecArchs[arch] + def thisArchDynarecs = dynarecArchs[arch.toLowerCase()] if (!thisArchDynarecs) thisArchDynarecs = ['NoDR'] thisArchDynarecs.each { dynarec -> @@ -257,7 +262,10 @@ pipeline { /* Run build process. */ def packageName = "${env.JOB_BASE_NAME}${dynarecSlugs[dynarec]}${presetSlugs[preset]}-$os-$arch$buildSuffix" def ret = -1 - dir("${dynarecNames[dynarec]}/$os - ${archNames[arch]}") { + def archName = archNames[arch] + if (os == 'macOS') + archName = archNamesMac[arch] + dir("${dynarecNames[dynarec]}/$os - $archName") { ret = runBuild("-b \"$packageName\" \"$arch\" ${presetFlags[preset]} ${dynarecFlags[dynarec]} ${osFlags[os]} $buildFlags") } From 0fd3042e0cf18ed58657062ce2c1925e6bafdcec Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 7 Apr 2022 00:57:16 +0600 Subject: [PATCH 16/21] qt: Add support for loading ROMs from ~/Documents/86Box/roms on macOS --- src/qt/qt_platform.cpp | 5 ++++- src/unix/unix.c | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index c48a84020..5f4d23baa 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -589,7 +589,10 @@ plat_chdir(char *path) void plat_init_rom_paths() { -#if !defined __APPLE__ && !defined _WIN32 +#if defined __APPLE__ + QDir::root().mkpath(QStringLiteral("%1/Documents/86Box/roms/").arg(QDir::homePath())); + add_rom_path(QStringLiteral("%1/Documents/86Box/roms/").arg(QDir::homePath()).toUtf8().constData()); +#elif !defined _WIN32 if (getenv("XDG_DATA_HOME")) { char xdg_rom_path[1024] = { 0 }; strncpy(xdg_rom_path, getenv("XDG_DATA_HOME"), 1024); diff --git a/src/unix/unix.c b/src/unix/unix.c index 1c8917626..5f6429b89 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -796,6 +796,13 @@ plat_init_rom_paths() add_rom_path("/usr/local/share/86Box/roms/"); add_rom_path("/usr/share/86Box/roms/"); } +#else + char home_rom_path[1024] = { '\0' }; + snprintf(home_rom_path, 1024, "%s/Documents/86Box/", getenv("HOME") ? getenv("HOME") : getpwuid(getuid())->pw_dir); + plat_dir_create(home_rom_path); + strcat(home_rom_path, "roms/"); + plat_dir_create(home_rom_path); + add_rom_path(home_rom_path); #endif } From 027179ab959859f42bc9da82407fe387ea1f6b5e Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 7 Apr 2022 01:14:36 +0600 Subject: [PATCH 17/21] qt/languages/pt-PT.po: Fix "No ROMs Found" message --- src/qt/languages/pt-PT.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 301b52566..8497b935d 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -614,7 +614,7 @@ msgid "ZIP images" msgstr "Imagens ZIP" msgid "86Box could not find any usable ROM images.\n\nPlease download a ROM set and extract it into the \"roms\" directory." -msgstr "O 86Box não conseguiu encontrar nenhuma imagem ROM utilizável.\n\nPor favor, vá a href=\"https://github.com/86Box/roms/releases/latest\">descarregue um pacote ROM e instale-o na pasta \"roms\"." +msgstr "O 86Box não conseguiu encontrar nenhuma imagem ROM utilizável.\n\nPor favor, vá descarregue um pacote ROM e instale-o na pasta \"roms\"." msgid "(empty)" msgstr "(empty)" From 84b1a8a7d3964c7edd0a519bf801e98be5b105ba Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 7 Apr 2022 01:23:23 +0600 Subject: [PATCH 18/21] qt: Fix mistyped LCID value of en-US --- src/qt/qt_platform.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index 508103169..ff7b99c93 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -375,7 +375,7 @@ extern "C++" { {0x0405, {"cs-CZ", "Czech (Czech Republic)"} }, {0x0407, {"de-DE", "German (Germany)"} }, - {0x0408, {"en-US", "English (United States)"} }, + {0x0409, {"en-US", "English (United States)"} }, {0x0809, {"en-GB", "English (United Kingdom)"} }, {0x0C0A, {"es-ES", "Spanish (Spain)"} }, {0x040B, {"fi-FI", "Finnish (Finland)"} }, From c700f93b4b90ccd1b174716405ef51a90754e961 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 7 Apr 2022 01:27:16 +0600 Subject: [PATCH 19/21] qt: Fix warnings --- src/qt/qt_platform.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index 2df4acd3f..e6e3256d3 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -377,7 +377,7 @@ extern "C++" { {0x0405, {"cs-CZ", "Czech (Czech Republic)"} }, {0x0407, {"de-DE", "German (Germany)"} }, - {0x0408, {"en-US", "English (United States)"} }, + {0x0409, {"en-US", "English (United States)"} }, {0x0809, {"en-GB", "English (United Kingdom)"} }, {0x0C0A, {"es-ES", "Spanish (Spain)"} }, {0x040B, {"fi-FI", "Finnish (Finland)"} }, @@ -594,7 +594,7 @@ plat_init_rom_paths() add_rom_path(QStringLiteral("%1/Documents/86Box/roms/").arg(QDir::homePath()).toUtf8().constData()); #elif !defined _WIN32 if (getenv("XDG_DATA_HOME")) { - char xdg_rom_path[1024] = { 0 }; + char xdg_rom_path[1024 + 1] = { 0 }; strncpy(xdg_rom_path, getenv("XDG_DATA_HOME"), 1024); plat_path_slash(xdg_rom_path); strncat(xdg_rom_path, "86Box/", 1024); From 61c9f9beac9d606c2b293dae124284eee7712eb6 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 7 Apr 2022 02:17:14 +0600 Subject: [PATCH 20/21] cmake: Enable 64-bit file support on 32-bit Linux --- src/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 06cebf82b..36df54404 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -19,6 +19,10 @@ add_executable(86Box 86box.c config.c log.c random.c timer.c io.c acpi.c apm.c dma.c ddma.c discord.c nmi.c pic.c pit.c port_6x.c port_92.c ppi.c pci.c mca.c usb.c fifo8.c device.c nvr.c nvr_at.c nvr_ps2.c) +if(CMAKE_SYSTEM_NAME MATCHES "Linux") + add_compile_definitions(_FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE=1 _LARGEFILE64_SOURCE=1) +endif() + if(CPPTHREADS) target_sources(86Box PRIVATE thread.cpp) endif() From 44ef14b143abaf0588724e1f7ba7a8b00d8fa50d Mon Sep 17 00:00:00 2001 From: richardg867 Date: Wed, 6 Apr 2022 18:21:25 -0300 Subject: [PATCH 21/21] Jenkins: Fix Discord Game SDK extraction on macOS --- .ci/build.sh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index 4e164bcdf..437f06b95 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -32,7 +32,11 @@ # are configured as NOPASSWD in /etc/sudoers if you're doing unattended builds # - For macOS builds: # - A standard MacPorts installation is required, with the following macports.conf settings: -# +# buildfromsource always +# build_arch x86_64 (or arm64) +# universal_archs (blank) +# ui_interactive no +# macosx_deployment_target 10.13 # - port is called through sudo to manage dependencies; make sure it is configured # as NOPASSWD in /etc/sudoers if you're doing unattended builds # @@ -551,7 +555,7 @@ then if [ $status -eq 0 ] then # Archive Discord Game SDK library. - unzip discord_game_sdk.zip "lib/$arch_discord/discord_game_sdk.dylib" -d "archive_tmp/"*".app/Contents/Frameworks" + unzip -j discord_game_sdk.zip "lib/$arch_discord/discord_game_sdk.dylib" -d "archive_tmp/"*".app/Contents/Frameworks" [ ! -e "archive_tmp/"*".app/Contents/Frameworks/discord_game_sdk.dylib" ] && echo [!] No Discord Game SDK for architecture [$arch_discord] # Sign app bundle.