mirror of
https://github.com/86Box/86Box.git
synced 2026-02-23 09:58:19 -07:00
Merge branch '86Box:master' into nec-v20
This commit is contained in:
@@ -40,7 +40,7 @@ if(MUNT_EXTERNAL)
|
||||
endif()
|
||||
|
||||
project(86Box
|
||||
VERSION 3.6
|
||||
VERSION 3.7
|
||||
DESCRIPTION "Emulator of x86-based systems"
|
||||
HOMEPAGE_URL "https://86box.net"
|
||||
LANGUAGES C CXX)
|
||||
|
||||
@@ -183,6 +183,7 @@ int confirm_save = 1; /* (C) enable save confirmation */
|
||||
int enable_discord = 0; /* (C) enable Discord integration */
|
||||
int pit_mode = -1; /* (C) force setting PIT mode */
|
||||
int fm_driver = 0; /* (C) select FM sound driver */
|
||||
int open_dir_usr_path = 0; /* default file open dialog directory of usr_path */
|
||||
|
||||
/* Statistics. */
|
||||
extern int mmuflush;
|
||||
|
||||
@@ -611,6 +611,8 @@ load_general(void)
|
||||
|
||||
enable_discord = !!config_get_int(cat, "enable_discord", 0);
|
||||
|
||||
open_dir_usr_path = config_get_int(cat, "open_dir_usr_path", 0);
|
||||
|
||||
video_framerate = config_get_int(cat, "video_gl_framerate", -1);
|
||||
video_vsync = config_get_int(cat, "video_gl_vsync", 0);
|
||||
strncpy(video_shader, config_get_string(cat, "video_gl_shader", ""), sizeof(video_shader));
|
||||
@@ -2380,6 +2382,11 @@ save_general(void)
|
||||
else
|
||||
config_delete_var(cat, "enable_discord");
|
||||
|
||||
if (open_dir_usr_path)
|
||||
config_set_int(cat, "open_dir_usr_path", open_dir_usr_path);
|
||||
else
|
||||
config_delete_var(cat, "open_dir_usr_path");
|
||||
|
||||
if (video_framerate != -1)
|
||||
config_set_int(cat, "video_gl_framerate", video_framerate);
|
||||
else
|
||||
@@ -2767,7 +2774,7 @@ save_storage_controllers(void)
|
||||
|
||||
delete_section_if_empty(cat);
|
||||
|
||||
if (cassette_enable == 1)
|
||||
if (cassette_enable == 0)
|
||||
config_delete_var(cat, "cassette_enabled");
|
||||
else
|
||||
config_set_int(cat, "cassette_enabled", cassette_enable);
|
||||
|
||||
13
src/device.c
13
src/device.c
@@ -331,17 +331,14 @@ device_get_priv(const device_t *d)
|
||||
int
|
||||
device_available(const device_t *d)
|
||||
{
|
||||
device_config_t *config;
|
||||
device_config_bios_t *bios;
|
||||
device_config_t *config = NULL;
|
||||
device_config_bios_t *bios = NULL;
|
||||
int bf, roms_present = 0;
|
||||
int i = 0;
|
||||
|
||||
#ifdef RELEASE_BUILD
|
||||
if (d->flags & DEVICE_NOT_WORKING) return(0);
|
||||
#endif
|
||||
if (d != NULL) {
|
||||
config = (device_config_t *) d->config;
|
||||
if (config != NULL) {
|
||||
if (config != NULL) {
|
||||
while (config->type != -1) {
|
||||
if (config->type == CONFIG_BIOS) {
|
||||
bios = (device_config_bios_t *) config->bios;
|
||||
@@ -362,9 +359,9 @@ device_available(const device_t *d)
|
||||
}
|
||||
}
|
||||
|
||||
/* No CONFIG_BIOS field present, use the classic available(). */
|
||||
/* No CONFIG_BIOS field present, use the classic available(). */
|
||||
if (d->available != NULL)
|
||||
return(d->available());
|
||||
return(d->available());
|
||||
else
|
||||
return(1);
|
||||
}
|
||||
|
||||
@@ -1398,7 +1398,7 @@ write64_ami(void *priv, uint8_t val)
|
||||
else
|
||||
add_data(dev, 'H');
|
||||
} else
|
||||
add_data(dev, 'F');
|
||||
add_data(dev, 'H');
|
||||
return 0;
|
||||
|
||||
case 0xa2: /* clear keyboard controller lines P22/P23 */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -137,6 +137,7 @@ extern int fm_driver; /* (C) select FM sound driver */
|
||||
extern char exe_path[2048]; /* path (dir) of executable */
|
||||
extern char usr_path[1024]; /* path (dir) of user data */
|
||||
extern char cfg_path[1024]; /* full path of config file */
|
||||
extern int open_dir_usr_path; /* default file open dialog directory of usr_path */
|
||||
#ifndef USE_NEW_DYNAREC
|
||||
extern FILE *stdlog; /* file to log output to */
|
||||
#endif
|
||||
|
||||
@@ -54,7 +54,6 @@
|
||||
#define CONFIG_BIOS 11
|
||||
|
||||
enum {
|
||||
DEVICE_NOT_WORKING = 1, /* does not currently work correctly and will be disabled in a release build */
|
||||
DEVICE_PCJR = 2, /* requires an IBM PCjr */
|
||||
DEVICE_AT = 4, /* requires an AT-compatible system */
|
||||
DEVICE_PS2 = 8, /* requires a PS/1 or PS/2 system */
|
||||
@@ -70,6 +69,17 @@ enum {
|
||||
DEVICE_LPT = 0x2000 /* requires a parallel port */
|
||||
};
|
||||
|
||||
|
||||
#define BIOS_NORMAL 0
|
||||
#define BIOS_INTERLEAVED 1
|
||||
#define BIOS_INTERLEAVED_SINGLEFILE 2
|
||||
#define BIOS_INTERLEAVED_QUAD 3
|
||||
#define BIOS_INTERLEAVED_QUAD_SINGLEFILE 4
|
||||
#define BIOS_INTEL_AMI 5
|
||||
#define BIOS_INTERLEAVED_INVERT 8
|
||||
#define BIOS_HIGH_BIT_INVERT 16
|
||||
|
||||
|
||||
typedef struct {
|
||||
const char *description;
|
||||
int value;
|
||||
@@ -80,6 +90,8 @@ typedef struct {
|
||||
const char *internal_name;
|
||||
int bios_type;
|
||||
int files_no;
|
||||
uint32_t local, size;
|
||||
void *dev1, *dev2;
|
||||
const char **files;
|
||||
} device_config_bios_t;
|
||||
|
||||
|
||||
@@ -20,11 +20,11 @@
|
||||
#define EMU_NAME "86Box"
|
||||
#define EMU_NAME_W LSTR(EMU_NAME)
|
||||
|
||||
#define EMU_VERSION "3.6"
|
||||
#define EMU_VERSION "3.7"
|
||||
#define EMU_VERSION_W LSTR(EMU_VERSION)
|
||||
#define EMU_VERSION_EX "3.50" /* frozen due to IDE re-detection behavior on Windows */
|
||||
#define EMU_VERSION_MAJ 3
|
||||
#define EMU_VERSION_MIN 6
|
||||
#define EMU_VERSION_MIN 7
|
||||
#define EMU_VERSION_PATCH 0
|
||||
|
||||
#define EMU_BUILD_NUM 0
|
||||
@@ -40,7 +40,7 @@
|
||||
#define EMU_ROMS_URL "https://github.com/86Box/roms/releases/latest"
|
||||
#define EMU_ROMS_URL_W LSTR(EMU_ROMS_URL)
|
||||
#ifdef RELEASE_BUILD
|
||||
# define EMU_DOCS_URL "https://86box.readthedocs.io/en/v3.6/"
|
||||
# define EMU_DOCS_URL "https://86box.readthedocs.io/en/v3.7/"
|
||||
#else
|
||||
# define EMU_DOCS_URL "https://86box.readthedocs.io"
|
||||
#endif
|
||||
|
||||
@@ -440,6 +440,40 @@ const machine_t machines[] = {
|
||||
.device = NULL,
|
||||
.vid_device = NULL
|
||||
},
|
||||
{
|
||||
.name = "[8088] Bondwell BW230",
|
||||
.internal_name = "bw230",
|
||||
.type = MACHINE_TYPE_8088,
|
||||
.chipset = MACHINE_CHIPSET_DISCRETE,
|
||||
.init = machine_xt_bw230_init,
|
||||
.pad = 0,
|
||||
.pad0 = 0,
|
||||
.pad1 = MACHINE_AVAILABLE,
|
||||
.pad2 = 0,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_8088,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 0,
|
||||
.max_bus = 0,
|
||||
.min_voltage = 0,
|
||||
.max_voltage = 0,
|
||||
.min_multi = 0,
|
||||
.max_multi = 0
|
||||
},
|
||||
.bus_flags = MACHINE_PC,
|
||||
.flags = MACHINE_FLAGS_NONE,
|
||||
.ram = {
|
||||
.min = 64,
|
||||
.max = 640,
|
||||
.step = 64
|
||||
},
|
||||
.nvrmask = 0,
|
||||
.kbc = KBC_IBM_PC_XT,
|
||||
.kbc_p1 = 0xff00,
|
||||
.gpio = 0xffffffff,
|
||||
.device = NULL,
|
||||
.vid_device = NULL
|
||||
},
|
||||
{
|
||||
.name = "[8088] Columbia Data Products MPC-1600",
|
||||
.internal_name = "mpc1600",
|
||||
@@ -610,6 +644,108 @@ const machine_t machines[] = {
|
||||
.device = NULL,
|
||||
.vid_device = NULL
|
||||
},
|
||||
{
|
||||
.name = "[8088] Hyosung Topstar 88T",
|
||||
.internal_name = "top88",
|
||||
.type = MACHINE_TYPE_8088,
|
||||
.chipset = MACHINE_CHIPSET_DISCRETE,
|
||||
.init = machine_xt_top88_init,
|
||||
.pad = 0,
|
||||
.pad0 = 0,
|
||||
.pad1 = MACHINE_AVAILABLE,
|
||||
.pad2 = 0,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_8088,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 0,
|
||||
.max_bus = 0,
|
||||
.min_voltage = 0,
|
||||
.max_voltage = 0,
|
||||
.min_multi = 0,
|
||||
.max_multi = 0
|
||||
},
|
||||
.bus_flags = MACHINE_PC,
|
||||
.flags = MACHINE_FLAGS_NONE,
|
||||
.ram = {
|
||||
.min = 128,
|
||||
.max = 640,
|
||||
.step = 64
|
||||
},
|
||||
.nvrmask = 0,
|
||||
.kbc = KBC_IBM_PC_XT,
|
||||
.kbc_p1 = 0xff00,
|
||||
.gpio = 0xffffffff,
|
||||
.device = NULL,
|
||||
.vid_device = NULL
|
||||
},
|
||||
{
|
||||
.name = "[8088] Hyundai SUPER-16T",
|
||||
.internal_name = "super16t",
|
||||
.type = MACHINE_TYPE_8088,
|
||||
.chipset = MACHINE_CHIPSET_DISCRETE,
|
||||
.init = machine_xt_super16t_init,
|
||||
.pad = 0,
|
||||
.pad0 = 0,
|
||||
.pad1 = MACHINE_AVAILABLE,
|
||||
.pad2 = 0,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_8088,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 4772728,
|
||||
.max_bus = 7159092,
|
||||
.min_voltage = 0,
|
||||
.max_voltage = 0,
|
||||
.min_multi = 0,
|
||||
.max_multi = 0
|
||||
},
|
||||
.bus_flags = MACHINE_PC,
|
||||
.flags = MACHINE_FLAGS_NONE,
|
||||
.ram = {
|
||||
.min = 128,
|
||||
.max = 640,
|
||||
.step = 64
|
||||
},
|
||||
.nvrmask = 0,
|
||||
.kbc = KBC_IBM_PC_XT,
|
||||
.kbc_p1 = 0xff00,
|
||||
.gpio = 0xffffffff,
|
||||
.device = NULL,
|
||||
.vid_device = NULL
|
||||
},
|
||||
{
|
||||
.name = "[8088] Hyundai SUPER-16TE",
|
||||
.internal_name = "super16te",
|
||||
.type = MACHINE_TYPE_8088,
|
||||
.chipset = MACHINE_CHIPSET_DISCRETE,
|
||||
.init = machine_xt_super16te_init,
|
||||
.pad = 0,
|
||||
.pad0 = 0,
|
||||
.pad1 = MACHINE_AVAILABLE,
|
||||
.pad2 = 0,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_8088,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 0,
|
||||
.max_bus = 10000000,
|
||||
.min_voltage = 0,
|
||||
.max_voltage = 0,
|
||||
.min_multi = 0,
|
||||
.max_multi = 0
|
||||
},
|
||||
.bus_flags = MACHINE_PC,
|
||||
.flags = MACHINE_FLAGS_NONE,
|
||||
.ram = {
|
||||
.min = 128,
|
||||
.max = 640,
|
||||
.step = 64
|
||||
},
|
||||
.nvrmask = 0,
|
||||
.kbc = KBC_IBM_PC_XT,
|
||||
.kbc_p1 = 0xff00,
|
||||
.gpio = 0xffffffff,
|
||||
.device = NULL,
|
||||
.vid_device = NULL
|
||||
},
|
||||
{
|
||||
.name = "[8088] Juko ST",
|
||||
.internal_name = "jukopc",
|
||||
@@ -916,6 +1052,40 @@ const machine_t machines[] = {
|
||||
.device = NULL,
|
||||
.vid_device = NULL
|
||||
},
|
||||
{
|
||||
.name = "[8088] Sanyo SX-16",
|
||||
.internal_name = "sansx16",
|
||||
.type = MACHINE_TYPE_8088,
|
||||
.chipset = MACHINE_CHIPSET_DISCRETE,
|
||||
.init = machine_xt_sansx16_init,
|
||||
.pad = 0,
|
||||
.pad0 = 0,
|
||||
.pad1 = MACHINE_AVAILABLE,
|
||||
.pad2 = 0,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_8088,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 0,
|
||||
.max_bus = 0,
|
||||
.min_voltage = 0,
|
||||
.max_voltage = 0,
|
||||
.min_multi = 0,
|
||||
.max_multi = 0
|
||||
},
|
||||
.bus_flags = MACHINE_PC,
|
||||
MACHINE_FLAGS_NONE,
|
||||
.ram = {
|
||||
.min = 256,
|
||||
.max = 640,
|
||||
.step = 256
|
||||
},
|
||||
.nvrmask = 0,
|
||||
.kbc = KBC_IBM_PC_XT,
|
||||
.kbc_p1 = 0xff00,
|
||||
.gpio = 0xffffffff,
|
||||
.device = NULL,
|
||||
.vid_device = NULL
|
||||
},
|
||||
{
|
||||
.name = "[8088] Schneider EuroPC",
|
||||
.internal_name = "europc",
|
||||
|
||||
18
src/nvr_at.c
18
src/nvr_at.c
@@ -1050,7 +1050,9 @@ nvr_at_init(const device_t *info)
|
||||
if (info->local == 12) {
|
||||
local->def = 0x00;
|
||||
local->flags |= FLAG_AMI_1992_HACK;
|
||||
} else
|
||||
} else if (info->local == 20)
|
||||
local->def = 0x00;
|
||||
else
|
||||
local->def = 0xff;
|
||||
nvr->irq = 8;
|
||||
local->cent = RTC_CENTURY_AT;
|
||||
@@ -1297,3 +1299,17 @@ const device_t p6rp4_nvr_device = {
|
||||
.force_redraw = NULL,
|
||||
.config = NULL
|
||||
};
|
||||
|
||||
const device_t amstrad_megapc_nvr_device = {
|
||||
.name = "Amstrad MegapC NVRAM",
|
||||
.internal_name = "amstrad_megapc_nvr",
|
||||
.flags = DEVICE_ISA | DEVICE_AT,
|
||||
.local = 20,
|
||||
.init = nvr_at_init,
|
||||
.close = nvr_at_close,
|
||||
.reset = nvr_at_reset,
|
||||
{ .available = NULL },
|
||||
.speed_changed = nvr_at_speed_changed,
|
||||
.force_redraw = NULL,
|
||||
.config = NULL
|
||||
};
|
||||
|
||||
18
src/pic.c
18
src/pic.c
@@ -436,6 +436,7 @@ pic_read(uint16_t addr, void *priv)
|
||||
dev->data_bus = dev->irr;
|
||||
#endif
|
||||
if (dev->ocw3 & 0x04) {
|
||||
dev->interrupt &= ~0x20; /* Freeze the interrupt until the poll is over. */
|
||||
if (dev->int_pending) {
|
||||
dev->data_bus = 0x80 | (dev->interrupt & 7);
|
||||
pic_acknowledge(dev);
|
||||
@@ -516,6 +517,8 @@ pic_write(uint16_t addr, uint8_t val, void *priv)
|
||||
update_pending();
|
||||
} else if (val & 0x08) {
|
||||
dev->ocw3 = val;
|
||||
if (dev->ocw3 & 0x04)
|
||||
dev->interrupt |= 0x20; /* Freeze the interrupt until the poll is over. */
|
||||
if (dev->ocw3 & 0x40)
|
||||
dev->special_mask_mode = !!(dev->ocw3 & 0x20);
|
||||
} else {
|
||||
@@ -721,10 +724,25 @@ pic_irq_ack(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Needed for Xi8088. */
|
||||
if ((pic.ack_bytes == 0) && pic.int_pending && pic_slave_on(&pic, pic.interrupt)) {
|
||||
if (!pic.slaves[pic.interrupt]->int_pending) {
|
||||
/* If we are on AT, IRQ 2 is pending, and we cannot find a pending IRQ on PIC 2, fatal out. */
|
||||
fatal("IRQ %i pending on AT without a pending IRQ on PIC %i (normal)\n", pic.interrupt, pic.interrupt);
|
||||
exit(-1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
pic.interrupt |= 0x40; /* Mark slave pending. */
|
||||
}
|
||||
|
||||
ret = pic_irq_ack_read(&pic, pic.ack_bytes);
|
||||
pic.ack_bytes = (pic.ack_bytes + 1) % (pic_i86_mode(&pic) ? 2 : 3);
|
||||
|
||||
if (pic.ack_bytes == 0) {
|
||||
/* Needed for Xi8088. */
|
||||
if (pic.interrupt & 0x40)
|
||||
pic2.interrupt = 0x17;
|
||||
pic.interrupt = 0x17;
|
||||
update_pending();
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#include "qt_mainwindow.hpp"
|
||||
#include "qt_d3d9renderer.hpp"
|
||||
#include <QResizeEvent>
|
||||
#include <QTimer>
|
||||
@@ -139,7 +140,7 @@ void D3D9Renderer::resizeEvent(QResizeEvent *event)
|
||||
|
||||
void D3D9Renderer::blit(int x, int y, int w, int h)
|
||||
{
|
||||
if ((x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (monitors[m_monitor_index].target_buffer == NULL) || surfaceInUse) {
|
||||
if (blitDummied || (x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (monitors[m_monitor_index].target_buffer == NULL) || surfaceInUse) {
|
||||
video_blit_complete_monitor(m_monitor_index);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -289,6 +289,7 @@ int main(int argc, char* argv[]) {
|
||||
cpu_thread_run = 0;
|
||||
main_thread->join();
|
||||
pc_close(nullptr);
|
||||
endblit();
|
||||
|
||||
socket.close();
|
||||
return ret;
|
||||
|
||||
@@ -123,6 +123,8 @@ filter_result keyb_filter(BMessage *message, BHandler **target, BMessageFilter *
|
||||
static BMessageFilter* filter;
|
||||
#endif
|
||||
|
||||
std::atomic<bool> blitDummied{false};
|
||||
|
||||
extern void qt_mouse_capture(int);
|
||||
extern "C" void qt_blit(int x, int y, int w, int h, int monitor_index);
|
||||
|
||||
@@ -648,6 +650,11 @@ MainWindow::~MainWindow() {
|
||||
void MainWindow::showEvent(QShowEvent *event) {
|
||||
if (shownonce) return;
|
||||
shownonce = true;
|
||||
if (window_remember) {
|
||||
if (window_w == 0) window_w = 320;
|
||||
if (window_h == 0) window_h = 200;
|
||||
}
|
||||
|
||||
if (window_remember && !QApplication::platformName().contains("wayland")) {
|
||||
setGeometry(window_x, window_y, window_w, window_h + menuBar()->height() + (hide_status_bar ? 0 : statusBar()->height()) + (hide_tool_bar ? 0 : ui->toolBar->height()));
|
||||
}
|
||||
@@ -1474,7 +1481,7 @@ void MainWindow::on_actionFullscreen_triggered() {
|
||||
questionbox.exec();
|
||||
config_save();
|
||||
|
||||
/* (re-capture mouse after dialog. */
|
||||
/* (re-capture mouse after dialog). */
|
||||
if (wasCaptured)
|
||||
emit setMouseCapture(true);
|
||||
}
|
||||
@@ -1594,7 +1601,7 @@ void MainWindow::keyPressEvent(QKeyEvent* event)
|
||||
void MainWindow::blitToWidget(int x, int y, int w, int h, int monitor_index)
|
||||
{
|
||||
if (monitor_index >= 1) {
|
||||
if (renderers[monitor_index]) renderers[monitor_index]->blit(x, y, w, h);
|
||||
if (!blitDummied && renderers[monitor_index] && renderers[monitor_index]->isVisible()) renderers[monitor_index]->blit(x, y, w, h);
|
||||
else video_blit_complete_monitor(monitor_index);
|
||||
}
|
||||
else ui->stackedWidget->blit(x, y, w, h);
|
||||
@@ -1915,6 +1922,8 @@ void MainWindow::on_actionHiDPI_scaling_triggered()
|
||||
|
||||
void MainWindow::on_actionHide_status_bar_triggered()
|
||||
{
|
||||
auto w = ui->stackedWidget->width();
|
||||
auto h = ui->stackedWidget->height();
|
||||
hide_status_bar ^= 1;
|
||||
ui->actionHide_status_bar->setChecked(hide_status_bar);
|
||||
statusBar()->setVisible(!hide_status_bar);
|
||||
@@ -1926,13 +1935,16 @@ void MainWindow::on_actionHide_status_bar_triggered()
|
||||
} else {
|
||||
int vid_resize_orig = vid_resize;
|
||||
vid_resize = 0;
|
||||
emit resizeContents(monitors[0].mon_scrnsz_x, monitors[0].mon_scrnsz_y);
|
||||
emit resizeContents(w, h);
|
||||
vid_resize = vid_resize_orig;
|
||||
if (vid_resize == 1) setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_actionHide_tool_bar_triggered()
|
||||
{
|
||||
auto w = ui->stackedWidget->width();
|
||||
auto h = ui->stackedWidget->height();
|
||||
hide_tool_bar ^= 1;
|
||||
ui->actionHide_tool_bar->setChecked(hide_tool_bar);
|
||||
ui->toolBar->setVisible(!hide_tool_bar);
|
||||
@@ -1944,8 +1956,9 @@ void MainWindow::on_actionHide_tool_bar_triggered()
|
||||
} else {
|
||||
int vid_resize_orig = vid_resize;
|
||||
vid_resize = 0;
|
||||
emit resizeContents(monitors[0].mon_scrnsz_x, monitors[0].mon_scrnsz_y);
|
||||
emit resizeContents(w, h);
|
||||
vid_resize = vid_resize_orig;
|
||||
if (vid_resize == 1) setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2047,6 +2060,8 @@ void MainWindow::on_actionShow_non_primary_monitors_triggered()
|
||||
{
|
||||
show_second_monitors ^= 1;
|
||||
|
||||
blitDummied = true;
|
||||
|
||||
if (show_second_monitors) {
|
||||
for (int monitor_index = 1; monitor_index < MONITORS_NUM; monitor_index++) {
|
||||
auto& secondaryRenderer = renderers[monitor_index];
|
||||
@@ -2073,5 +2088,7 @@ void MainWindow::on_actionShow_non_primary_monitors_triggered()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
blitDummied = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
class MediaMenu;
|
||||
class RendererStack;
|
||||
|
||||
extern std::atomic<bool> blitDummied;
|
||||
|
||||
namespace Ui {
|
||||
class MainWindow;
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <QStringBuilder>
|
||||
|
||||
extern "C" {
|
||||
#include <86box/86box.h>
|
||||
#include <86box/config.h>
|
||||
#include <86box/device.h>
|
||||
#include <86box/timer.h>
|
||||
@@ -173,7 +174,7 @@ void MediaMenu::cassetteNewImage() {
|
||||
void MediaMenu::cassetteSelectImage(bool wp) {
|
||||
auto filename = QFileDialog::getOpenFileName(parentWidget,
|
||||
QString(),
|
||||
QString(),
|
||||
getMediaOpenDirectory(),
|
||||
tr("Cassette images") %
|
||||
util::DlgFilter({ "pcm","raw","wav","cas" }) %
|
||||
tr("All files") %
|
||||
@@ -247,7 +248,7 @@ void MediaMenu::cartridgeSelectImage(int i) {
|
||||
auto filename = QFileDialog::getOpenFileName(
|
||||
parentWidget,
|
||||
QString(),
|
||||
QString(),
|
||||
getMediaOpenDirectory(),
|
||||
tr("Cartridge images") %
|
||||
util::DlgFilter({ "a","b","jrc" }) %
|
||||
tr("All files") %
|
||||
@@ -291,7 +292,7 @@ void MediaMenu::floppySelectImage(int i, bool wp) {
|
||||
auto filename = QFileDialog::getOpenFileName(
|
||||
parentWidget,
|
||||
QString(),
|
||||
QString(),
|
||||
getMediaOpenDirectory(),
|
||||
tr("All images") %
|
||||
util::DlgFilter({ "0??","1??","??0","86f","bin","cq?","d??","flp","hdm","im?","json","td0","*fd?","mfm","xdf" }) %
|
||||
tr("Advanced sector images") %
|
||||
@@ -400,7 +401,7 @@ void MediaMenu::cdromMount(int i) {
|
||||
auto filename = QFileDialog::getOpenFileName(
|
||||
parentWidget,
|
||||
QString(),
|
||||
QString(),
|
||||
getMediaOpenDirectory(),
|
||||
tr("CD-ROM images") %
|
||||
util::DlgFilter({ "iso","cue" }) %
|
||||
tr("All files") %
|
||||
@@ -571,7 +572,7 @@ void MediaMenu::moSelectImage(int i, bool wp) {
|
||||
auto filename = QFileDialog::getOpenFileName(
|
||||
parentWidget,
|
||||
QString(),
|
||||
QString(),
|
||||
getMediaOpenDirectory(),
|
||||
tr("MO images") %
|
||||
util::DlgFilter({ "im?", "mdi" }) %
|
||||
tr("All files") %
|
||||
@@ -656,6 +657,13 @@ void MediaMenu::moUpdateMenu(int i) {
|
||||
menu->setTitle(QString::asprintf(tr("MO %i (%ls): %ls").toUtf8().constData(), i + 1, busName.toStdU16String().data(), name.isEmpty() ? tr("(empty)").toStdU16String().data() : name.toStdU16String().data()));
|
||||
}
|
||||
|
||||
QString MediaMenu::getMediaOpenDirectory() {
|
||||
QString openDirectory;
|
||||
if (open_dir_usr_path > 0) {
|
||||
openDirectory = QString::fromUtf8(usr_path);
|
||||
}
|
||||
return openDirectory;
|
||||
}
|
||||
|
||||
// callbacks from 86box C code
|
||||
extern "C" {
|
||||
|
||||
@@ -66,6 +66,8 @@ private:
|
||||
QMap<int, QMenu*> zipMenus;
|
||||
QMap<int, QMenu*> moMenus;
|
||||
|
||||
QString getMediaOpenDirectory();
|
||||
|
||||
int cassetteRecordPos;
|
||||
int cassettePlayPos;
|
||||
int cassetteRewindPos;
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
#include "qt_opengloptionsdialog.hpp"
|
||||
#include "qt_openglrenderer.hpp"
|
||||
|
||||
#ifndef GL_MAP_PERSISTENT_BIT
|
||||
#define GL_MAP_PERSISTENT_BIT 0x0040
|
||||
#endif
|
||||
|
||||
#ifndef GL_MAP_COHERENT_BIT
|
||||
#define GL_MAP_COHERENT_BIT 0x0080
|
||||
#endif
|
||||
|
||||
OpenGLRenderer::OpenGLRenderer(QWidget *parent)
|
||||
: QWindow(parent->windowHandle())
|
||||
, renderTimer(new QTimer(this))
|
||||
@@ -239,10 +247,12 @@ void
|
||||
OpenGLRenderer::initializeExtensions()
|
||||
{
|
||||
#ifndef NO_BUFFER_STORAGE
|
||||
if (context->hasExtension("GL_ARB_buffer_storage")) {
|
||||
if (context->hasExtension("GL_ARB_buffer_storage") || context->hasExtension("GL_EXT_buffer_storage")) {
|
||||
hasBufferStorage = true;
|
||||
|
||||
glBufferStorage = (PFNGLBUFFERSTORAGEPROC) context->getProcAddress("glBufferStorage");
|
||||
glBufferStorage = (PFNGLBUFFERSTORAGEEXTPROC_LOCAL) context->getProcAddress(context->hasExtension("GL_EXT_buffer_storage") ? "glBufferStorageEXT" : "glBufferStorage");
|
||||
if (!glBufferStorage)
|
||||
glBufferStorage = glBufferStorage = (PFNGLBUFFERSTORAGEEXTPROC_LOCAL) context->getProcAddress("glBufferStorage");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -39,6 +39,8 @@
|
||||
#include "qt_opengloptions.hpp"
|
||||
#include "qt_renderercommon.hpp"
|
||||
|
||||
typedef void (QOPENGLF_APIENTRYP PFNGLBUFFERSTORAGEEXTPROC_LOCAL) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);
|
||||
|
||||
class OpenGLRenderer : public QWindow, protected QOpenGLExtraFunctions, public RendererCommon {
|
||||
Q_OBJECT
|
||||
|
||||
@@ -103,7 +105,7 @@ private:
|
||||
/* GL_ARB_buffer_storage */
|
||||
bool hasBufferStorage = false;
|
||||
#ifndef NO_BUFFER_STORAGE
|
||||
PFNGLBUFFERSTORAGEPROC glBufferStorage = nullptr;
|
||||
PFNGLBUFFERSTORAGEEXTPROC_LOCAL glBufferStorage = nullptr;
|
||||
#endif
|
||||
|
||||
private slots:
|
||||
|
||||
@@ -54,7 +54,6 @@ QElapsedTimer elapsed_timer;
|
||||
|
||||
static std::atomic_int blitmx_contention = 0;
|
||||
static std::recursive_mutex blitmx;
|
||||
static thread_local std::unique_lock blit_lock { blitmx, std::defer_lock };
|
||||
|
||||
class CharPointer {
|
||||
public:
|
||||
@@ -469,17 +468,17 @@ void dynld_close(void *handle)
|
||||
void startblit()
|
||||
{
|
||||
blitmx_contention++;
|
||||
if (blit_lock.try_lock()) {
|
||||
if (blitmx.try_lock()) {
|
||||
return;
|
||||
}
|
||||
|
||||
blit_lock.lock();
|
||||
blitmx.lock();
|
||||
}
|
||||
|
||||
void endblit()
|
||||
{
|
||||
blitmx_contention--;
|
||||
blit_lock.unlock();
|
||||
blitmx.unlock();
|
||||
if (blitmx_contention > 0) {
|
||||
// a deadlock has been observed on linux when toggling via video_toggle_option
|
||||
// because the mutex is typically unfair on linux
|
||||
|
||||
@@ -113,12 +113,14 @@ ProgSettings::ProgSettings(QWidget *parent) :
|
||||
|
||||
mouseSensitivity = mouse_sensitivity;
|
||||
ui->horizontalSlider->setValue(mouseSensitivity * 100.);
|
||||
ui->openDirUsrPath->setChecked(open_dir_usr_path > 0);
|
||||
}
|
||||
|
||||
void ProgSettings::accept()
|
||||
{
|
||||
strcpy(icon_set, ui->comboBox->currentData().toString().toUtf8().data());
|
||||
lang_id = ui->comboBoxLanguage->currentData().toUInt();
|
||||
open_dir_usr_path = ui->openDirUsrPath->isChecked() ? 1 : 0;
|
||||
|
||||
loadTranslators(QCoreApplication::instance());
|
||||
reloadStrings();
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>458</width>
|
||||
<height>303</height>
|
||||
<height>374</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
@@ -29,24 +29,14 @@
|
||||
<property name="sizeConstraint">
|
||||
<enum>QLayout::SetFixedSize</enum>
|
||||
</property>
|
||||
<item row="2" column="0">
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
<item row="1" column="0" colspan="2">
|
||||
<widget class="QComboBox" name="comboBox">
|
||||
<property name="editable">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="4" column="0" colspan="2">
|
||||
<widget class="QComboBox" name="comboBoxLanguage">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>(System Default)</string>
|
||||
<string>(Default)</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
@@ -58,30 +48,6 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QPushButton" name="pushButton">
|
||||
<property name="text">
|
||||
<string>Default</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="11" column="0" colspan="2">
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<widget class="QPushButton" name="pushButtonLanguage">
|
||||
<property name="text">
|
||||
<string>Default</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="2">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
@@ -89,8 +55,8 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="1">
|
||||
<widget class="QPushButton" name="pushButton_2">
|
||||
<item row="2" column="1">
|
||||
<widget class="QPushButton" name="pushButton">
|
||||
<property name="text">
|
||||
<string>Default</string>
|
||||
</property>
|
||||
@@ -109,25 +75,15 @@
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="3" column="0" colspan="2">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Language:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<item row="12" column="0" colspan="2">
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</spacer>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="0" colspan="2">
|
||||
<widget class="QSlider" name="horizontalSlider">
|
||||
@@ -151,18 +107,72 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="2">
|
||||
<widget class="QComboBox" name="comboBox">
|
||||
<property name="editable">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<item row="4" column="0" colspan="2">
|
||||
<widget class="QComboBox" name="comboBoxLanguage">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>(Default)</string>
|
||||
<string>(System Default)</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" colspan="2">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Language:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<widget class="QPushButton" name="pushButtonLanguage">
|
||||
<property name="text">
|
||||
<string>Default</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="1">
|
||||
<widget class="QPushButton" name="pushButton_2">
|
||||
<property name="text">
|
||||
<string>Default</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="9" column="0">
|
||||
<widget class="QCheckBox" name="openDirUsrPath">
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Select media images from program working directory</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
|
||||
@@ -257,7 +257,7 @@ RendererStack::switchRenderer(Renderer renderer)
|
||||
createRenderer(renderer);
|
||||
disconnect(this, &RendererStack::blit, this, &RendererStack::blitDummy);
|
||||
blitDummied = false;
|
||||
QTimer::singleShot(1000, this, [this]() { this->blitDummied = false; } );
|
||||
QTimer::singleShot(1000, this, [this]() { blitDummied = false; } );
|
||||
});
|
||||
|
||||
rendererWindow->hasBlitFunc() ? current.reset() : current.release()->deleteLater();
|
||||
@@ -435,7 +435,7 @@ RendererStack::blitRenderer(int x, int y, int w, int h)
|
||||
void
|
||||
RendererStack::blitCommon(int x, int y, int w, int h)
|
||||
{
|
||||
if ((x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (monitors[m_monitor_index].target_buffer == NULL) || imagebufs.empty() || std::get<std::atomic_flag *>(imagebufs[currentBuf])->test_and_set() || blitDummied) {
|
||||
if (blitDummied || (x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (monitors[m_monitor_index].target_buffer == NULL) || imagebufs.empty() || std::get<std::atomic_flag *>(imagebufs[currentBuf])->test_and_set()) {
|
||||
video_blit_complete_monitor(m_monitor_index);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -103,7 +103,7 @@ private:
|
||||
|
||||
RendererCommon *rendererWindow { nullptr };
|
||||
std::unique_ptr<QWidget> current;
|
||||
std::atomic<bool> directBlitting{false}, blitDummied{false};
|
||||
std::atomic<bool> directBlitting{false};
|
||||
};
|
||||
|
||||
#endif // QT_RENDERERCONTAINER_HPP
|
||||
|
||||
@@ -161,6 +161,8 @@ void SettingsStorageControllers::onCurrentMachineChanged(int machineId) {
|
||||
int is_at = IS_AT(machineId);
|
||||
ui->checkBoxTertiaryIDE->setEnabled(is_at > 0);
|
||||
ui->checkBoxQuaternaryIDE->setEnabled(is_at > 0);
|
||||
ui->checkBoxTertiaryIDE->setChecked(ui->checkBoxTertiaryIDE->isEnabled() && ide_ter_enabled);
|
||||
ui->checkBoxQuaternaryIDE->setChecked(ui->checkBoxQuaternaryIDE->isEnabled() && ide_qua_enabled);
|
||||
}
|
||||
|
||||
void SettingsStorageControllers::on_comboBoxHD_currentIndexChanged(int index) {
|
||||
|
||||
@@ -745,7 +745,7 @@ pas16_close(void *p)
|
||||
const device_t pas16_device = {
|
||||
.name = "Pro Audio Spectrum 16",
|
||||
.internal_name = "pas16",
|
||||
.flags = DEVICE_ISA | DEVICE_NOT_WORKING,
|
||||
.flags = DEVICE_ISA,
|
||||
.local = 0,
|
||||
.init = pas16_init,
|
||||
.close = pas16_close,
|
||||
|
||||
@@ -12,10 +12,10 @@
|
||||
# After a successful build, you can install the RPMs as follows:
|
||||
# sudo dnf install RPMS/$(uname -m)/86Box-3* RPMS/noarch/86Box-roms*
|
||||
|
||||
%global romver 20220701
|
||||
%global romver 20220730
|
||||
|
||||
Name: 86Box
|
||||
Version: 3.6
|
||||
Version: 3.7
|
||||
Release: 1%{?dist}
|
||||
Summary: Classic PC emulator
|
||||
License: GPLv2+
|
||||
@@ -100,9 +100,6 @@ appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/net.86box.86Bo
|
||||
pushd roms-%{romver}
|
||||
mkdir -p %{buildroot}%{_datadir}/%{name}/roms
|
||||
cp -a * %{buildroot}%{_datadir}/%{name}/roms/
|
||||
# hack to create symlink in /usr/bin
|
||||
cd %{buildroot}%{_bindir}
|
||||
ln -s ../share/%{name}/roms roms
|
||||
popd
|
||||
|
||||
# files part of the main package
|
||||
@@ -117,8 +114,7 @@ popd
|
||||
%files roms
|
||||
%license roms-%{romver}/LICENSE
|
||||
%{_datadir}/%{name}/roms
|
||||
%{_bindir}/roms
|
||||
|
||||
%changelog
|
||||
* Fri Jul 01 2022 Robert de Rooy <robert.de.rooy[AT]gmail.com> 3.6-1
|
||||
* Sat Jul 30 2022 Robert de Rooy <robert.de.rooy[AT]gmail.com> 3.7-1
|
||||
- Bump release
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
</categories>
|
||||
<launchable type="desktop-id">net.86box.86Box.desktop</launchable>
|
||||
<releases>
|
||||
<release version="3.6" date="2022-06-27"/>
|
||||
<release version="3.7" date="2022-07-30"/>
|
||||
</releases>
|
||||
<content_rating type="oars-1.1" />
|
||||
<description>
|
||||
|
||||
@@ -51,7 +51,8 @@
|
||||
#define BIOS_GD5428_ISA_PATH "roms/video/cirruslogic/5428.bin"
|
||||
#define BIOS_GD5428_MCA_PATH "roms/video/cirruslogic/SVGA141.ROM"
|
||||
#define BIOS_GD5428_PATH "roms/video/cirruslogic/vlbusjapan.BIN"
|
||||
#define BIOS_GD5428_BOCA_ISA_PATH "roms/video/cirruslogic/boca_gd5428_1.30b.bin"
|
||||
#define BIOS_GD5428_BOCA_ISA_PATH_1 "roms/video/cirruslogic/boca_gd5428_1.30b_1.bin"
|
||||
#define BIOS_GD5428_BOCA_ISA_PATH_2 "roms/video/cirruslogic/boca_gd5428_1.30b_2.bin"
|
||||
#define BIOS_GD5429_PATH "roms/video/cirruslogic/5429.vbi"
|
||||
#define BIOS_GD5430_DIAMOND_A8_VLB_PATH "roms/video/cirruslogic/diamondvlbus.bin"
|
||||
#define BIOS_GD5430_ORCHID_VLB_PATH "roms/video/cirruslogic/orchidvlbus.bin"
|
||||
@@ -3863,6 +3864,7 @@ static void
|
||||
int id = info->local & 0xff;
|
||||
int vram;
|
||||
char *romfn = NULL;
|
||||
char *romfn1 = NULL, *romfn2 = NULL;
|
||||
memset(gd54xx, 0, sizeof(gd54xx_t));
|
||||
|
||||
gd54xx->pci = !!(info->flags & DEVICE_PCI);
|
||||
@@ -3917,8 +3919,10 @@ static void
|
||||
if (info->local & 0x100)
|
||||
if (gd54xx->vlb)
|
||||
romfn = BIOS_GD5428_DIAMOND_B1_VLB_PATH;
|
||||
else
|
||||
romfn = BIOS_GD5428_BOCA_ISA_PATH;
|
||||
else {
|
||||
romfn1 = BIOS_GD5428_BOCA_ISA_PATH_1;
|
||||
romfn2 = BIOS_GD5428_BOCA_ISA_PATH_2;
|
||||
}
|
||||
else {
|
||||
if (gd54xx->vlb)
|
||||
romfn = BIOS_GD5428_PATH;
|
||||
@@ -4016,7 +4020,10 @@ static void
|
||||
gd54xx->vram_mask = gd54xx->vram_size - 1;
|
||||
|
||||
if (romfn)
|
||||
rom_init(&gd54xx->bios_rom, romfn, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
|
||||
rom_init(&gd54xx->bios_rom, romfn, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
|
||||
else if (romfn1 && romfn2)
|
||||
rom_init_interleaved(&gd54xx->bios_rom, BIOS_GD5428_BOCA_ISA_PATH_1, BIOS_GD5428_BOCA_ISA_PATH_2, 0xc0000,
|
||||
0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
|
||||
|
||||
if (info->flags & DEVICE_ISA)
|
||||
video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_gd54xx_isa);
|
||||
@@ -4193,7 +4200,7 @@ gd5428_diamond_b1_available(void)
|
||||
static int
|
||||
gd5428_boca_isa_available(void)
|
||||
{
|
||||
return rom_present(BIOS_GD5428_BOCA_ISA_PATH);
|
||||
return rom_present(BIOS_GD5428_BOCA_ISA_PATH_1) && rom_present(BIOS_GD5428_BOCA_ISA_PATH_2);
|
||||
}
|
||||
|
||||
static int
|
||||
|
||||
@@ -494,6 +494,7 @@ void voodoo_fifo_thread(void *param)
|
||||
switch (header >> 30)
|
||||
{
|
||||
case 0: /*Linear framebuffer (Banshee)*/
|
||||
case 1: /*Planar YUV*/
|
||||
if (voodoo->texture_present[0][(addr & voodoo->texture_mask) >> TEX_DIRTY_SHIFT])
|
||||
{
|
||||
// voodoo_fifo_log("texture_present at %08x %i\n", addr, (addr & voodoo->texture_mask) >> TEX_DIRTY_SHIFT);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "86box",
|
||||
"version-string": "3.6",
|
||||
"version-string": "3.7",
|
||||
"homepage": "https://86box.net/",
|
||||
"documentation": "http://86box.readthedocs.io/",
|
||||
"license": "GPL-2.0-or-later",
|
||||
|
||||
Reference in New Issue
Block a user