Merge branch '86Box:master' into master

This commit is contained in:
starfrost
2025-06-09 12:10:11 +01:00
committed by GitHub
78 changed files with 3170 additions and 1700 deletions

View File

@@ -70,6 +70,7 @@
#include <86box/unittester.h>
#include <86box/novell_cardkey.h>
#include <86box/isamem.h>
#include <86box/isarom.h>
#include <86box/isartc.h>
#include <86box/lpt.h>
#include <86box/serial.h>
@@ -181,6 +182,7 @@ int postcard_enabled = 0; /* (C) enable
int unittester_enabled = 0; /* (C) enable unit tester device */
int gameport_type[GAMEPORT_MAX] = { 0, 0 }; /* (C) enable gameports */
int isamem_type[ISAMEM_MAX] = { 0, 0, 0, 0 }; /* (C) enable ISA mem cards */
int isarom_type[ISAROM_MAX] = { 0, 0, 0, 0 }; /* (C) enable ISA ROM cards */
int isartc_type = 0; /* (C) enable ISA RTC card */
int gfxcard[GFXCARD_MAX] = { 0, 0 }; /* (C) graphics/video card */
int show_second_monitors = 1; /* (C) show non-primary monitors */
@@ -1472,6 +1474,10 @@ pc_reset_hard_init(void)
zip_hard_reset();
/* Reset any ISA ROM cards. */
isarom_reset();
/* Reset any ISA RTC cards. */
isartc_reset();
@@ -1901,4 +1907,4 @@ int FindAccelerator(const char *name) {
}
// No key was found
return -1;
}
}

View File

@@ -979,28 +979,28 @@ cdrom_toc_dump(cdrom_t *dev)
uint8_t b[65536] = { 0 };
int len = cdrom_read_toc(dev, b, CD_TOC_RAW, 0, 0, 65536);
const char *fn2 = "d:\\86boxnew\\toc_cue.dmp";
FILE * f = fopen(fn2, "wb");
fwrite(b, 1, len, f);
fflush(f);
fclose(f);
FILE * fp = fopen(fn2, "wb");
fwrite(b, 1, len, fp);
fflush(fp);
fclose(fp);
cdrom_log(dev->log, "Written TOC of %i bytes to %s\n", len, fn2);
memset(b, 0x00, 65536);
len = cdrom_read_toc(dev, b, CD_TOC_NORMAL, 0, 0, 65536);
fn2 = "d:\\86boxnew\\toc_cue_cooked.dmp";
f = fopen(fn2, "wb");
fwrite(b, 1, len, f);
fflush(f);
fclose(f);
fp = fopen(fn2, "wb");
fwrite(b, 1, len, fp);
fflush(fp);
fclose(fp);
cdrom_log(dev->log, "Written cooked TOC of %i bytes to %s\n", len, fn2);
memset(b, 0x00, 65536);
len = cdrom_read_toc(dev, b, CD_TOC_SESSION, 0, 0, 65536);
fn2 = "d:\\86boxnew\\toc_cue_session.dmp";
f = fopen(fn2, "wb");
fwrite(b, 1, len, f);
fflush(f);
fclose(f);
fp = fopen(fn2, "wb");
fwrite(b, 1, len, fp);
fflush(fp);
fclose(fp);
cdrom_log(dev->log, "Written session TOC of %i bytes to %s\n", len, fn2);
}
#endif

View File

@@ -988,7 +988,7 @@ neat_read(uint16_t port, void *priv)
if ((dev->indx >= 0x60) && (dev->indx <= 0x6e))
ret = dev->regs[dev->indx];
else if (dev->indx == 0x6f)
ret = (dev->regs[dev->indx] & 0xfd) | ~(mem_a20_alt & 0x02);
ret = (dev->regs[dev->indx] & 0xfd) | ((~mem_a20_alt) & 0x02);
break;
default:

View File

@@ -46,6 +46,7 @@
#include <86box/ini.h>
#include <86box/config.h>
#include <86box/isamem.h>
#include <86box/isarom.h>
#include <86box/isartc.h>
#include <86box/lpt.h>
#include <86box/serial.h>
@@ -1699,6 +1700,7 @@ load_other_peripherals(void)
if (!novell_keycard_enabled)
ini_section_delete_var(cat, "novell_keycard_enabled");
// ISA RAM Boards
for (uint8_t c = 0; c < ISAMEM_MAX; c++) {
sprintf(temp, "isamem%d_type", c);
@@ -1709,6 +1711,17 @@ load_other_peripherals(void)
ini_section_delete_var(cat, temp);
}
// ISA ROM Boards
for (uint8_t c = 0; c < ISAROM_MAX; c++) {
sprintf(temp, "isarom%d_type", c);
p = ini_section_get_string(cat, temp, "none");
isarom_type[c] = isarom_get_from_internal_name(p);
if (!strcmp(p, "none"))
ini_section_delete_var(cat, temp);
}
p = ini_section_get_string(cat, "isartc_type", "none");
isartc_type = isartc_get_from_internal_name(p);
@@ -1858,6 +1871,8 @@ config_load(void)
cdrom[0].sound_on = 1;
mem_size = 64;
isartc_type = 0;
for (i = 0; i < ISAROM_MAX; i++)
isarom_type[i] = 0;
for (i = 0; i < ISAMEM_MAX; i++)
isamem_type[i] = 0;
@@ -2706,6 +2721,7 @@ save_other_peripherals(void)
else
ini_section_set_int(cat, "novell_keycard_enabled", novell_keycard_enabled);
// ISA RAM Boards
for (uint8_t c = 0; c < ISAMEM_MAX; c++) {
sprintf(temp, "isamem%d_type", c);
if (isamem_type[c] == 0)
@@ -2715,6 +2731,16 @@ save_other_peripherals(void)
isamem_get_internal_name(isamem_type[c]));
}
// ISA ROM Boards
for (uint8_t c = 0; c < ISAROM_MAX; c++) {
sprintf(temp, "isarom%d_type", c);
if (isarom_type[c] == 0)
ini_section_delete_var(cat, temp);
else
ini_section_set_string(cat, temp,
isarom_get_internal_name(isarom_type[c]));
}
if (isartc_type == 0)
ini_section_delete_var(cat, "isartc_type");
else

View File

@@ -33,6 +33,7 @@ add_library(dev OBJECT
i2c_gpio.c
ibm_5161.c
isamem.c
isarom.c
isartc.c
isapnp.c
kbc_at.c

View File

@@ -2165,12 +2165,12 @@ isamem_get_internal_name(int board)
}
int
isamem_get_from_internal_name(const char *s)
isamem_get_from_internal_name(const char *str)
{
int c = 0;
while (boards[c].dev != NULL) {
if (!strcmp(boards[c].dev->internal_name, s))
if (!strcmp(boards[c].dev->internal_name, str))
return c;
c++;
}

643
src/device/isarom.c Normal file
View File

@@ -0,0 +1,643 @@
/*
* 86Box A hypervisor and IBM PC system emulator that specializes in
* running old operating systems and software designed for IBM
* PC systems and compatibles from 1981 through fairly recent
* system designs based on the PCI bus.
*
* This file is part of the 86Box distribution.
*
* Implementation of ISA ROM card Expansions.
*
* Authors: Jasmine Iwanek, <jriwanek@gmail.com>
*
* Copyright 2025 Jasmine Iwanek.
*/
#include <stdarg.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
#define HAVE_STDARG_H
#include <86box/86box.h>
#include <86box/io.h>
#include <86box/device.h>
#include <86box/mem.h>
#include <86box/rom.h>
#include <86box/nvr.h>
#include <86box/isarom.h>
#define ISAROM_CARD 0
#define ISAROM_CARD_DUAL 1
#define ISAROM_CARD_QUAD 2
#ifdef ENABLE_ISAROM_LOG
int isarom_do_log = ENABLE_ISAROM_LOG;
static void
isarom_log(const char *fmt, ...)
{
va_list ap;
if (isarom_do_log) {
va_start(ap, fmt);
pclog_ex(fmt, ap);
va_end(ap);
}
}
#else
# define isarom_log(fmt, ...)
#endif
typedef struct isarom_t {
struct {
rom_t rom;
uint32_t addr;
const char *fn;
uint32_t size;
uint32_t len;
char nvr_path[64];
uint8_t wp;
} socket[4];
uint8_t inst;
uint8_t type;
} isarom_t;
static inline uint8_t
get_limit(uint8_t type)
{
if (type == ISAROM_CARD_DUAL)
return 2;
if (type == ISAROM_CARD_QUAD)
return 4;
return 1;
}
static inline void
isarom_save_nvr(char *path, uint8_t *data, size_t size)
{
if (path[0] == 0x00)
return;
FILE *fp = nvr_fopen(path, "wb");
if (fp) {
fwrite(data, 1, size, fp);
fclose(fp);
}
}
void
isarom_close(void *priv)
{
isarom_t *dev = (isarom_t *) priv;
if (!priv)
return;
for (uint8_t i = 0; i < get_limit(dev->type); i++)
if (dev->socket[i].rom.rom) {
isarom_log("isarom[%u]: saving NVR for socket %u -> %s (%u bytes)\n",
dev->inst, i, dev->socket[i].nvr_path, dev->socket[i].size);
isarom_save_nvr(dev->socket[i].nvr_path, dev->socket[i].rom.rom, dev->socket[i].size);
}
free(dev);
}
static void *
isarom_init(const device_t *info)
{
isarom_t *dev = (isarom_t *) calloc(1, sizeof(isarom_t));
if (!dev)
return NULL;
dev->inst = device_get_instance();
dev->type = (uint8_t) info->local;
isarom_log("isarom[%u]: initializing device (type=%u)\n", dev->inst, dev->type);
for (uint8_t i = 0; i < get_limit(dev->type); i++) {
char key_fn[12];
char key_addr[14];
char key_size[14];
char key_writes[22];
char suffix[4] = "";
if (i > 0)
snprintf(suffix, sizeof(suffix), "%d", i + 1);
snprintf(key_fn, sizeof(key_fn), "bios_fn%s", suffix);
snprintf(key_addr, sizeof(key_addr), "bios_addr%s", suffix);
snprintf(key_size, sizeof(key_size), "bios_size%s", suffix);
snprintf(key_writes, sizeof(key_writes), "rom_writes_enabled%s", suffix);
dev->socket[i].fn = device_get_config_string(key_fn);
dev->socket[i].addr = device_get_config_hex20(key_addr);
dev->socket[i].size = device_get_config_int(key_size);
// Note: 2K is the smallest ROM I've found, but 86box's memory granularity is 4k, the number below is fine
// as we'll end up allocating no less than 4k due to the device config limits.
dev->socket[i].len = (dev->socket[i].size > 2048) ? dev->socket[i].size - 1 : 0;
dev->socket[i].wp = (uint8_t) device_get_config_int(key_writes) ? 1 : 0;
isarom_log("isarom[%u]: socket %u: addr=0x%05X size=%u wp=%u fn=%s\n",
dev->inst, i, dev->socket[i].addr, dev->socket[i].size,
dev->socket[i].wp, dev->socket[i].fn ? dev->socket[i].fn : "(null)");
if (dev->socket[i].addr != 0 && dev->socket[i].fn != NULL) {
rom_init(&dev->socket[i].rom,
dev->socket[i].fn,
dev->socket[i].addr,
dev->socket[i].size,
dev->socket[i].len,
0,
MEM_MAPPING_EXTERNAL);
isarom_log("isarom[%u]: ROM initialized for socket %u\n", dev->inst, i);
if (dev->socket[i].wp) {
mem_mapping_set_write_handler(&dev->socket[i].rom.mapping, rom_write, rom_writew, rom_writel);
snprintf(dev->socket[i].nvr_path, sizeof(dev->socket[i].nvr_path), "isarom_%i_%i.nvr", dev->inst, i + 1);
FILE *fp = nvr_fopen(dev->socket[i].nvr_path, "rb");
if (fp != NULL) {
fread(dev->socket[i].rom.rom, 1, dev->socket[i].size, fp);
fclose(fp);
isarom_log("isarom[%u]: loaded %zu bytes from %s\n", dev->inst, read_bytes, dev->socket[i].nvr_path);
} else
isarom_log("isarom[%u]: NVR not found, skipping load (%s)\n", dev->inst, dev->socket[i].nvr_path);
}
}
}
return dev;
}
#define BIOS_FILE_FILTER "ROM files (*.bin *.rom)|*.bin,*.rom"
#define BIOS_ADDR_SELECTION { \
{ "Disabled", 0x00000 }, \
{ "C000H", 0xc0000 }, \
{ "C200H", 0xc2000 }, \
{ "C400H", 0xc4000 }, \
{ "C600H", 0xc6000 }, \
{ "C800H", 0xc8000 }, \
{ "CA00H", 0xca000 }, \
{ "CC00H", 0xcc000 }, \
{ "CE00H", 0xce000 }, \
{ "D000H", 0xd0000 }, \
{ "D200H", 0xd2000 }, \
{ "D400H", 0xd4000 }, \
{ "D600H", 0xd6000 }, \
{ "D800H", 0xd8000 }, \
{ "DA00H", 0xda000 }, \
{ "DC00H", 0xdc000 }, \
{ "DE00H", 0xde000 }, \
{ "E000H", 0xe0000 }, \
{ "E200H", 0xe2000 }, \
{ "E400H", 0xe4000 }, \
{ "E600H", 0xe6000 }, \
{ "E800H", 0xe8000 }, \
{ "EA00H", 0xea000 }, \
{ "EC00H", 0xec000 }, \
{ "EE00H", 0xee000 }, \
{ "", 0 } \
}
#define BIOS_SIZE_SELECTION { \
{ "4K", 4096 }, \
{ "8K", 8192 }, \
{ "16K", 16384 }, \
{ "32K", 32768 }, \
{ "64K", 65536 }, \
{ "", 0 } \
}
// clang-format off
static const device_config_t isarom_config[] = {
{
.name = "bios_fn",
.description = "BIOS File",
.type = CONFIG_FNAME,
.default_string = NULL,
.default_int = 0,
.file_filter = BIOS_FILE_FILTER,
.spinner = { 0 },
.selection = { },
.bios = { { 0 } }
},
{
.name = "bios_addr",
.description = "BIOS Address",
.type = CONFIG_HEX20,
.default_string = NULL,
.default_int = 0x00000,
.file_filter = NULL,
.spinner = { 0 },
.selection = BIOS_ADDR_SELECTION,
.bios = { { 0 } }
},
{
.name = "bios_size",
.description = "BIOS Size:",
.type = CONFIG_INT,
.default_string = NULL,
.default_int = 8192,
.file_filter = NULL,
.spinner = { 0 },
.selection = BIOS_SIZE_SELECTION,
.bios = { { 0 } }
},
{
.name = "rom_writes_enabled",
.description = "Enable BIOS extension ROM Writes",
.type = CONFIG_BINARY,
.default_string = NULL,
.default_int = 0,
.file_filter = NULL,
.spinner = { 0 },
.selection = { { 0 } },
.bios = { { 0 } }
},
{ .name = "", .description = "", .type = CONFIG_END }
};
static const device_config_t isarom_dual_config[] = {
{
.name = "bios_fn",
.description = "BIOS File (ROM #1)",
.type = CONFIG_FNAME,
.default_string = NULL,
.default_int = 0,
.file_filter = BIOS_FILE_FILTER,
.spinner = { 0 },
.selection = { },
.bios = { { 0 } }
},
{
.name = "bios_addr",
.description = "BIOS Address (ROM #1)",
.type = CONFIG_HEX20,
.default_string = NULL,
.default_int = 0x00000,
.file_filter = NULL,
.spinner = { 0 },
.selection = BIOS_ADDR_SELECTION,
.bios = { { 0 } }
},
{
.name = "bios_size",
.description = "BIOS Size (ROM #1):",
.type = CONFIG_INT,
.default_string = NULL,
.default_int = 8192,
.file_filter = NULL,
.spinner = { 0 },
.selection = BIOS_SIZE_SELECTION,
.bios = { { 0 } }
},
{
.name = "rom_writes_enabled",
.description = "Enable BIOS extension ROM Writes (ROM #1)",
.type = CONFIG_BINARY,
.default_string = NULL,
.default_int = 0,
.file_filter = NULL,
.spinner = { 0 },
.selection = { { 0 } },
.bios = { { 0 } }
},
{
.name = "bios_fn2",
.description = "BIOS File (ROM #2)",
.type = CONFIG_FNAME,
.default_string = NULL,
.default_int = 0,
.file_filter = BIOS_FILE_FILTER,
.spinner = { 0 },
.selection = { },
.bios = { { 0 } }
},
{
.name = "bios_addr2",
.description = "BIOS Address (ROM #2)",
.type = CONFIG_HEX20,
.default_string = NULL,
.default_int = 0x00000,
.file_filter = NULL,
.spinner = { 0 },
.selection = BIOS_ADDR_SELECTION,
.bios = { { 0 } }
},
{
.name = "bios_size2",
.description = "BIOS Size (ROM #2):",
.type = CONFIG_INT,
.default_string = NULL,
.default_int = 8192,
.file_filter = NULL,
.spinner = { 0 },
.selection = BIOS_SIZE_SELECTION,
.bios = { { 0 } }
},
{
.name = "rom_writes_enabled2",
.description = "Enable BIOS extension ROM Writes (ROM #2)",
.type = CONFIG_BINARY,
.default_string = NULL,
.default_int = 0,
.file_filter = NULL,
.spinner = { 0 },
.selection = { { 0 } },
.bios = { { 0 } }
},
{ .name = "", .description = "", .type = CONFIG_END }
};
static const device_config_t isarom_quad_config[] = {
{
.name = "bios_fn",
.description = "BIOS File (ROM #1)",
.type = CONFIG_FNAME,
.default_string = NULL,
.default_int = 0,
.file_filter = BIOS_FILE_FILTER,
.spinner = { 0 },
.selection = { },
.bios = { { 0 } }
},
{
.name = "bios_addr",
.description = "BIOS Address (ROM #1)",
.type = CONFIG_HEX20,
.default_string = NULL,
.default_int = 0x00000,
.file_filter = NULL,
.spinner = { 0 },
.selection = BIOS_ADDR_SELECTION,
.bios = { { 0 } }
},
{
.name = "bios_size",
.description = "BIOS Size (ROM #1):",
.type = CONFIG_INT,
.default_string = NULL,
.default_int = 8192,
.file_filter = NULL,
.spinner = { 0 },
.selection = BIOS_SIZE_SELECTION,
.bios = { { 0 } }
},
{
.name = "rom_writes_enabled",
.description = "Enable BIOS extension ROM Writes (ROM #1)",
.type = CONFIG_BINARY,
.default_string = NULL,
.default_int = 0,
.file_filter = NULL,
.spinner = { 0 },
.selection = { { 0 } },
.bios = { { 0 } }
},
{
.name = "bios_fn2",
.description = "BIOS File (ROM #2)",
.type = CONFIG_FNAME,
.default_string = NULL,
.default_int = 0,
.file_filter = BIOS_FILE_FILTER,
.spinner = { 0 },
.selection = { },
.bios = { { 0 } }
},
{
.name = "bios_addr2",
.description = "BIOS Address (ROM #2)",
.type = CONFIG_HEX20,
.default_string = NULL,
.default_int = 0x00000,
.file_filter = NULL,
.spinner = { 0 },
.selection = BIOS_ADDR_SELECTION,
.bios = { { 0 } }
},
{
.name = "bios_size2",
.description = "BIOS Size (ROM #2):",
.type = CONFIG_INT,
.default_string = NULL,
.default_int = 8192,
.file_filter = NULL,
.spinner = { 0 },
.selection = BIOS_SIZE_SELECTION,
.bios = { { 0 } }
},
{
.name = "rom_writes_enabled2",
.description = "Enable BIOS extension ROM Writes (ROM #2)",
.type = CONFIG_BINARY,
.default_string = NULL,
.default_int = 0,
.file_filter = NULL,
.spinner = { 0 },
.selection = { { 0 } },
.bios = { { 0 } }
},
{
.name = "bios_fn3",
.description = "BIOS File (ROM #3)",
.type = CONFIG_FNAME,
.default_string = NULL,
.default_int = 0,
.file_filter = "ROM files (*.bin *.rom)|*.bin,*.rom",
.spinner = { 0 },
.selection = { },
.bios = { { 0 } }
},
{
.name = "bios_addr3",
.description = "BIOS Address (ROM #3)",
.type = CONFIG_HEX20,
.default_string = NULL,
.default_int = 0x00000,
.file_filter = NULL,
.spinner = { 0 },
.selection = BIOS_ADDR_SELECTION,
.bios = { { 0 } }
},
{
.name = "bios_size3",
.description = "BIOS Size (ROM #3):",
.type = CONFIG_INT,
.default_string = NULL,
.default_int = 8192,
.file_filter = NULL,
.spinner = { 0 },
.selection = BIOS_SIZE_SELECTION,
.bios = { { 0 } }
},
{
.name = "rom_writes_enabled3",
.description = "Enable BIOS extension ROM Writes (ROM #3)",
.type = CONFIG_BINARY,
.default_string = NULL,
.default_int = 0,
.file_filter = NULL,
.spinner = { 0 },
.selection = { { 0 } },
.bios = { { 0 } }
},
{
.name = "bios_fn4",
.description = "BIOS File (ROM #4)",
.type = CONFIG_FNAME,
.default_string = NULL,
.default_int = 0,
.file_filter = BIOS_FILE_FILTER,
.spinner = { 0 },
.selection = { },
.bios = { { 0 } }
},
{
.name = "bios_addr4",
.description = "BIOS Address (ROM #4)",
.type = CONFIG_HEX20,
.default_string = NULL,
.default_int = 0x00000,
.file_filter = NULL,
.spinner = { 0 },
.selection = BIOS_ADDR_SELECTION,
.bios = { { 0 } }
},
{
.name = "bios_size4",
.description = "BIOS Size (ROM #4):",
.type = CONFIG_INT,
.default_string = NULL,
.default_int = 8192,
.file_filter = NULL,
.spinner = { 0 },
.selection = BIOS_SIZE_SELECTION,
.bios = { { 0 } }
},
{
.name = "rom_writes_enabled4",
.description = "Enable BIOS extension ROM Writes (ROM #4)",
.type = CONFIG_BINARY,
.default_string = NULL,
.default_int = 0,
.file_filter = NULL,
.spinner = { 0 },
.selection = { { 0 } },
.bios = { { 0 } }
},
{ .name = "", .description = "", .type = CONFIG_END }
};
// clang-format on
static const device_t isarom_device = {
.name = "Generic ISA ROM Board",
.internal_name = "isarom",
.flags = DEVICE_ISA,
.local = ISAROM_CARD,
.init = isarom_init,
.close = isarom_close,
.reset = NULL,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = isarom_config
};
static const device_t isarom_dual_device = {
.name = "Generic Dual ISA ROM Board",
.internal_name = "isarom_dual",
.flags = DEVICE_ISA,
.local = ISAROM_CARD_DUAL,
.init = isarom_init,
.close = isarom_close,
.reset = NULL,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = isarom_dual_config
};
static const device_t isarom_quad_device = {
.name = "Generic Quad ISA ROM Board",
.internal_name = "isarom_quad",
.flags = DEVICE_ISA,
.local = ISAROM_CARD_QUAD,
.init = isarom_init,
.close = isarom_close,
.reset = NULL,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = isarom_quad_config
};
static const struct {
const device_t *dev;
} boards[] = {
// clang-format off
{ &device_none },
{ &isarom_device },
{ &isarom_dual_device },
{ &isarom_quad_device },
{ NULL }
// clang-format on
};
void
isarom_reset(void)
{
for (uint8_t i = 0; i < ISAROM_MAX; i++) {
if (isarom_type[i] == 0)
continue;
/* Add the device instance to the system. */
device_add_inst(boards[isarom_type[i]].dev, i + 1);
}
}
const char *
isarom_get_name(int board)
{
if (boards[board].dev == NULL)
return NULL;
return (boards[board].dev->name);
}
const char *
isarom_get_internal_name(int board)
{
return device_get_internal_name(boards[board].dev);
}
int
isarom_get_from_internal_name(const char *str)
{
int c = 0;
while (boards[c].dev != NULL) {
if (!strcmp(boards[c].dev->internal_name, str))
return c;
c++;
}
/* Not found. */
return 0;
}
const device_t *
isarom_get_device(int board)
{
/* Add the device instance to the system. */
return boards[board].dev;
}
int
isarom_has_config(int board)
{
if (boards[board].dev == NULL)
return 0;
return (boards[board].dev->config ? 1 : 0);
}

View File

@@ -532,8 +532,8 @@ isartc_init(const device_t *info)
switch (dev->board) {
case ISARTC_MM58167: /* Generic MM58167 RTC */
{
int rom_addr = device_get_config_hex20("bios_addr");
if (rom_addr != -1)
uint32_t rom_addr = device_get_config_hex20("bios_addr");
if (rom_addr != 0)
rom_init(&dev->rom, ISARTC_ROM_MM58167_1,
rom_addr, 0x0800, 0x7ff, 0, MEM_MAPPING_EXTERNAL);
@@ -830,7 +830,7 @@ static const device_config_t mm58167_config[] = {
.file_filter = NULL,
.spinner = { 0 },
.selection = {
{ .description = "Disabled", .value = -1 },
{ .description = "Disabled", .value = 0x00000 },
{ .description = "C800H", .value = 0xc8000 },
{ .description = "CA00H", .value = 0xca000 },
{ .description = "CC00H", .value = 0xcc000 },
@@ -919,12 +919,12 @@ isartc_get_internal_name(int board)
}
int
isartc_get_from_internal_name(char *s)
isartc_get_from_internal_name(const char *str)
{
int c = 0;
while (boards[c].dev != NULL) {
if (!strcmp(boards[c].dev->internal_name, s))
if (!strcmp(boards[c].dev->internal_name, str))
return c;
c++;
}

View File

@@ -1653,8 +1653,8 @@ fdc_callback(void *priv)
case 0x06: /* Read data */
case 0x0c: /* Read deleted data */
case 0x11: /* Scan equal */
case 0x16: /* Verify */
case 0x19: /* Scan low or equal */
case 0x1c: /* Verify */
case 0x1d: /* Scan high or equal */
if ((fdc->interrupt == 0x11) || (fdc->interrupt == 0x19) || (fdc->interrupt == 0x1D))
compare = 1;

View File

@@ -467,7 +467,7 @@ fdd_load(int drive, char *fn)
int c = 0;
int size;
const char *p;
FILE * fp;
FILE *fp;
fdd_log("FDD: loading drive %d with '%s'\n", drive, fn);

View File

@@ -134,6 +134,7 @@ extern int postcard_enabled; /* (C) enable POST card */
extern int unittester_enabled; /* (C) enable unit tester device */
extern int gameport_type[]; /* (C) enable gameports */
extern int isamem_type[]; /* (C) enable ISA mem cards */
extern int isarom_type[]; /* (C) enable ISA ROM cards */
extern int isartc_type; /* (C) enable ISA RTC card */
extern int sound_is_float; /* (C) sound uses FP values */
extern int voodoo_enabled; /* (C) video option */

View File

@@ -106,10 +106,10 @@ enum {
#define CDV EMU_VERSION_EX
static const struct cdrom_drive_types_s {
const char * vendor;
const char * model;
const char * revision;
const char * internal_name;
const char *vendor;
const char *model;
const char *revision;
const char *internal_name;
const int bus_type;
/* SCSI standard for SCSI (or both) devices, early for IDE. */
const int scsi_std;
@@ -296,7 +296,7 @@ typedef struct cdrom {
uint8_t speed;
uint8_t cur_speed;
void * priv;
void *priv;
char image_path[1024];
char prev_image_path[1280];
@@ -322,10 +322,10 @@ typedef struct cdrom {
const cdrom_ops_t *ops;
char * image_history[CD_IMAGE_HISTORY];
char *image_history[CD_IMAGE_HISTORY];
void * local;
void * log;
void *local;
void *log;
void (*insert)(void *priv);
void (*close)(void *priv);

View File

@@ -33,6 +33,6 @@ typedef struct track_file_t {
int motorola;
} track_file_t;
extern void * image_open(cdrom_t *dev, const char *path);
extern void *image_open(cdrom_t *dev, const char *path);
#endif /*CDROM_IMAGE_H*/

View File

@@ -122,6 +122,7 @@ typedef struct config_t {
int ide_qua_enabled; /* Quaternary IDE controller enabled */
int bugger_enabled; /* ISA bugger device enabled */
int isa_rtc_type; /* ISA RTC card */
int isa_rom_type[ISAROM_MAX]; /* ISA ROM boards */
int isa_mem_type[ISAMEM_MAX]; /* ISA memory boards */
/* Hard disks category */

View File

@@ -159,7 +159,7 @@ typedef struct hard_disk_t {
uint8_t pad;
uint8_t pad0;
void * priv;
void *priv;
char fn[1024]; /* Name of current image file */
/* Differential VHD parent file */
@@ -185,7 +185,7 @@ typedef struct hard_disk_t {
uint8_t max_multiple_block;
uint8_t pad1[3];
const char * model;
const char *model;
hdd_zone_t zones[HDD_MAX_ZONES];

View File

@@ -42,7 +42,6 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef EMU_ISAMEM_H
#define EMU_ISAMEM_H
@@ -52,17 +51,12 @@
extern "C" {
#endif
/* Global variables. */
extern const device_t isamem_device;
extern const device_t isamem_brat80_device;
extern const device_t isamem_ev159_device;
/* Functions. */
extern void isamem_reset(void);
extern const char *isamem_get_name(int t);
extern const char *isamem_get_internal_name(int t);
extern int isamem_get_from_internal_name(const char *s);
extern int isamem_get_from_internal_name(const char *str);
extern const device_t *isamem_get_device(int t);
extern int isamem_has_config(int board);

View File

@@ -0,0 +1,37 @@
/*
* 86Box A hypervisor and IBM PC system emulator that specializes in
* running old operating systems and software designed for IBM
* PC systems and compatibles from 1981 through fairly recent
* system designs based on the PCI bus.
*
* This file is part of the 86Box distribution.
*
* Implementation of ISA ROM card Expansions.
*
* Authors: Jasmine Iwanek, <jriwanek@gmail.com>
*
* Copyright 2025 Jasmine Iwanek.
*/
#ifndef EMU_ISAROM_H
#define EMU_ISAROM_H
#define ISAROM_MAX 4 /* max #cards in system */
#ifdef __cplusplus
extern "C" {
#endif
/* Functions. */
extern void isarom_reset(void);
extern const char *isarom_get_name(int t);
extern const char *isarom_get_internal_name(int t);
extern int isarom_get_from_internal_name(const char *str);
extern const device_t *isarom_get_device(int t);
extern int isarom_has_config(int board);
#ifdef __cplusplus
}
#endif
#endif /*EMU_ISAROM_H*/

View File

@@ -42,7 +42,6 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef EMU_ISARTC_H
#define EMU_ISARTC_H
@@ -50,13 +49,11 @@
extern "C" {
#endif
/* Global variables. */
/* Functions. */
extern void isartc_reset(void);
extern const char *isartc_get_internal_name(int t);
extern int isartc_get_from_internal_name(char *s);
extern int isartc_get_from_internal_name(const char *str);
extern const device_t *isartc_get_device(int t);
extern int isartc_has_config(int board);

View File

@@ -664,6 +664,7 @@ extern int machine_at_p5sp4_init(const machine_t *);
/* m_at_socket5.c */
extern int machine_at_plato_init(const machine_t *);
extern int machine_at_dellplato_init(const machine_t *);
extern int machine_at_d842_init(const machine_t *);
extern int machine_at_ambradp90_init(const machine_t *);
extern int machine_at_p54np4_init(const machine_t *);
extern int machine_at_586ip_init(const machine_t *);

View File

@@ -110,13 +110,13 @@ typedef struct mo_drive_t {
uint8_t pad;
uint8_t pad0;
FILE * fp;
void * priv;
FILE *fp;
void *priv;
char image_path[1024];
char prev_image_path[1024];
char * image_history[MO_IMAGE_HISTORY];
char *image_history[MO_IMAGE_HISTORY];
uint32_t type;
uint32_t medium_size;
@@ -129,16 +129,16 @@ typedef struct mo_drive_t {
typedef struct mo_t {
mode_sense_pages_t ms_pages_saved;
mo_drive_t * drv;
mo_drive_t *drv;
#ifdef EMU_IDE_H
ide_tf_t * tf;
ide_tf_t *tf;
#else
void * tf;
void *tf;
#endif
void * log;
uint8_t * buffer;
uint8_t *buffer;
uint8_t atapi_cdb[16];
uint8_t current_cdb[16];
uint8_t sense[256];

View File

@@ -148,6 +148,8 @@ typedef struct ega_t {
card should not attempt to display anything. */
void (*render_override)(void *priv);
void * priv_parent;
uint8_t alt_addr; /* 0 for 0x3XX range, 1 for 0x2XX range */
} ega_t;
#endif

View File

@@ -116,6 +116,7 @@ typedef struct svga_t {
int lastline_draw;
int displine;
int fullchange;
int left_overscan;
int x_add;
int y_add;
int pan;

View File

@@ -58,13 +58,13 @@ typedef struct zip_drive_t {
uint8_t pad;
uint8_t pad0;
FILE * fp;
void * priv;
FILE *fp;
void *priv;
char image_path[1024];
char prev_image_path[1024];
char * image_history[ZIP_IMAGE_HISTORY];
char *image_history[ZIP_IMAGE_HISTORY];
uint32_t is_250;
uint32_t medium_size;
@@ -74,16 +74,16 @@ typedef struct zip_drive_t {
typedef struct zip_t {
mode_sense_pages_t ms_pages_saved;
zip_drive_t * drv;
zip_drive_t *drv;
#ifdef EMU_IDE_H
ide_tf_t * tf;
ide_tf_t *tf;
#else
void * tf;
void *tf;
#endif
void * log;
void *log;
uint8_t * buffer;
uint8_t *buffer;
uint8_t atapi_cdb[16];
uint8_t current_cdb[16];
uint8_t sense[256];

View File

@@ -154,32 +154,68 @@ machine_at_ps2_ide_init(const machine_t *model)
static const device_config_t ibmat_config[] = {
// clang-format off
{
.name = "bios",
.description = "BIOS Version",
.type = CONFIG_BIOS,
.name = "bios",
.description = "BIOS Version",
.type = CONFIG_BIOS,
.default_string = "ibm5170_111585",
.default_int = 0,
.file_filter = "",
.spinner = { 0 },
.bios = {
{ .name = "62X082x (11/15/85)", .internal_name = "ibm5170_111585", .bios_type = BIOS_NORMAL,
.files_no = 2, .local = 0, .size = 65536, .files = { "roms/machines/ibmat/BIOS_5170_15NOV85_U27.BIN", "roms/machines/ibmat/BIOS_5170_15NOV85_U47.BIN", "" } },
.default_int = 0,
.file_filter = "",
.spinner = { 0 },
.bios = {
{
.name = "62X082x (11/15/85)",
.internal_name = "ibm5170_111585",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 0,
.size = 65536,
.files = { "roms/machines/ibmat/BIOS_5170_15NOV85_U27.BIN", "roms/machines/ibmat/BIOS_5170_15NOV85_U47.BIN", "" }
},
{
.name = "61X9266 (11/15/85) (Alt)",
.internal_name = "ibm5170_111585_alt",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 0,
.size = 65536,
.files = { "roms/machines/ibmat/BIOS_5170_15NOV85_U27_61X9266.BIN", "roms/machines/ibmat/BIOS_5170_15NOV85_U47_61X9265.BIN", "" }
},
{
.name = "648009x (06/10/85)",
.internal_name = "ibm5170_061085",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 0,
.size = 65536,
.files = { "roms/machines/ibmat/BIOS_5170_10JUN85_U27.BIN", "roms/machines/ibmat/BIOS_5170_10JUN85_U47.BIN", "" }
},
{
.name = "618102x (01/10/84)",
.internal_name = "ibm5170_011084",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 0,
.size = 65536,
.files = { "roms/machines/ibmat/BIOS_5170_10JAN84_U27.BIN", "roms/machines/ibmat/BIOS_5170_10JAN84_U47.BIN", "" }
},
// The following are Diagnostic ROMs.
{
.name = "Supersoft Diagnostics",
.internal_name = "diag_supersoft",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 2,
.size = 65536,
.files = { "roms/machines/diagnostic/5170_EVEN_LOW_U27_27256.bin", "roms/machines/diagnostic/5170_ODD_HIGH_U47_27256.bin", "" }
},
{ .name = "61X9266 (11/15/85) (Alt)", .internal_name = "ibm5170_111585_alt", .bios_type = BIOS_NORMAL,
.files_no = 2, .local = 0, .size = 65536, .files = { "roms/machines/ibmat/BIOS_5170_15NOV85_U27_61X9266.BIN", "roms/machines/ibmat/BIOS_5170_15NOV85_U47_61X9265.BIN", "" } },
{ .name = "648009x (06/10/85)", .internal_name = "ibm5170_061085", .bios_type = BIOS_NORMAL,
.files_no = 2, .local = 0, .size = 65536, .files = { "roms/machines/ibmat/BIOS_5170_10JUN85_U27.BIN", "roms/machines/ibmat/BIOS_5170_10JUN85_U47.BIN", "" } },
{ .name = "618102x (01/10/84)", .internal_name = "ibm5170_011084", .bios_type = BIOS_NORMAL,
.files_no = 2, .local = 0, .size = 65536, .files = { "roms/machines/ibmat/BIOS_5170_10JAN84_U27.BIN", "roms/machines/ibmat/BIOS_5170_10JAN84_U47.BIN", "" } },
{ .files_no = 0 }
},
},
{
.name = "enable_5161",
.name = "enable_5161",
.description = "IBM 5161 Expansion Unit",
.type = CONFIG_BINARY,
.type = CONFIG_BINARY,
.default_int = 0
},
{ .name = "", .description = "", .type = CONFIG_END }

View File

@@ -80,6 +80,87 @@ machine_at_dellplato_init(const machine_t *model)
return ret;
}
int
machine_at_d842_init(const machine_t *model)
{
int ret = 0;
const char* fn;
/* No ROMs available */
if (!device_available(model->device))
return ret;
device_context(model->device);
fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios_versions"), 0);
ret = bios_load_linear(fn, 0x000e0000, 131072, 0);
device_context_restore();
machine_at_common_init(model);
device_add(&ide_pci_2ch_device);
pci_init(PCI_CONFIG_TYPE_2 | PCI_NO_IRQ_STEERING);
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
pci_register_slot(0x01, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); /* Onboard */
pci_register_slot(0x03, PCI_CARD_VIDEO, 4, 0, 0, 0); /* Onboard */
pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4); /* Slot 01 */
pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4); /* Slot 02 */
device_add(&keyboard_ps2_pci_device);
device_add(&i430nx_device);
device_add(&sio_zb_device);
device_add(&fdc37c665_device);
device_add(&intel_flash_bxt_device);
return ret;
}
static const device_config_t d842_config[] = {
// clang-format off
{
.name = "bios_versions",
.description = "BIOS Versions",
.type = CONFIG_BIOS,
.default_string = "d842",
.default_int = 0,
.file_filter = "",
.spinner = { 0 }, /*W1*/
.bios = {
{ .name = "Version 1.03 Revision 1.03.842 (11/24/1994)", .internal_name = "d842", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/d842/d842.bin", "" } },
{ .name = "Version 4.04 Revision 1.05.842 (03/15/1996)", .internal_name = "d842_mar96", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/d842/d842_mar96.bin", "" } },
{ .name = "Version 4.04 Revision 1.06.842 (04/03/1998)", .internal_name = "d842_apr98", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/d842/d842_apr98.bin", "" } },
{ .name = "Version 4.04 Revision 1.07.842 (06/02/1998)", .internal_name = "d842_jun98", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/d842/d842_jun98.bin", "" } },
{ .name = "Version 1.03 Revision 1.09.842 (07/08/1996)", .internal_name = "d842_jul96", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/d842/d842_jul96.bin", "" } },
{ .name = "Version 1.03 Revision 1.10.842 (06/04/1998)", .internal_name = "d842_jun98_1", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/d842/d842_jun98_1.bin", "" } },
},
},
{ .name = "", .description = "", .type = CONFIG_END }
// clang-format on
};
const device_t d842_device = {
.name = "Siemens-Nixdorf D842",
.internal_name = "d842",
.flags = 0,
.local = 0,
.init = NULL,
.close = NULL,
.reset = NULL,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = &d842_config[0]
};
int
machine_at_ambradp90_init(const machine_t *model)
{
@@ -394,6 +475,7 @@ machine_at_hawk_init(const machine_t *model)
return ret;
}
int
machine_at_pt2000_init(const machine_t *model)
{

View File

@@ -85,7 +85,7 @@ static const device_config_t ibmpc_config[] = {
{ .name = "Supersoft Diagnostics", .internal_name = "diag_supersoft", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 40960, .files = { "roms/machines/diagnostic/Supersoft_PCXT_8KB.bin", "" } },
{ .name = "Ruud's Diagnostic Rom", .internal_name = "diag_ruuds", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 40960, .files = { "roms/machines/diagnostic/ruuds_diagnostic_rom_v5.3_8kb.bin", "" } },
.files_no = 1, .local = 0, .size = 40960, .files = { "roms/machines/diagnostic/ruuds_diagnostic_rom_v5.4_8kb.bin", "" } },
{ .name = "XT RAM Test", .internal_name = "diag_xtramtest", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 40960, .files = { "roms/machines/diagnostic/xtramtest_8k.bin", "" } },
{ .files_no = 0 }
@@ -195,7 +195,7 @@ static const device_config_t ibmpc82_config[] = {
{ .name = "Supersoft Diagnostics", .internal_name = "diag_supersoft", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 40960, .files = { "roms/machines/diagnostic/Supersoft_PCXT_8KB.bin", "" } },
{ .name = "Ruud's Diagnostic Rom", .internal_name = "diag_ruuds", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 40960, .files = { "roms/machines/diagnostic/ruuds_diagnostic_rom_v5.3_8kb.bin", "" } },
.files_no = 1, .local = 0, .size = 40960, .files = { "roms/machines/diagnostic/ruuds_diagnostic_rom_v5.4_8kb.bin", "" } },
{ .name = "XT RAM Test", .internal_name = "diag_xtramtest", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 40960, .files = { "roms/machines/diagnostic/xtramtest_8k.bin", "" } },
{ .files_no = 0 }
@@ -282,48 +282,103 @@ machine_pc82_init(const machine_t *model)
static const device_config_t ibmxt_config[] = {
// clang-format off
{
.name = "bios",
.description = "BIOS Version",
.type = CONFIG_BIOS,
.name = "bios",
.description = "BIOS Version",
.type = CONFIG_BIOS,
.default_string = "ibm5160_1501512_5000027",
.default_int = 0,
.file_filter = "",
.spinner = { 0 },
.bios = {
{ .name = "1501512 (11/08/82)", .internal_name = "ibm5160_1501512_5000027", .bios_type = BIOS_NORMAL,
.files_no = 2, .local = 0, .size = 65536, .files = { "roms/machines/ibmxt/BIOS_5160_08NOV82_U18_1501512.BIN", "roms/machines/ibmxt/BIOS_5160_08NOV82_U19_5000027.BIN", "" } },
{ .name = "1501512 (11/08/82) (Alt)", .internal_name = "ibm5160_1501512_6359116", .bios_type = BIOS_NORMAL,
.files_no = 2, .local = 0, .size = 65536, .files = { "roms/machines/ibmxt/BIOS_5160_08NOV82_U18_1501512.BIN", "roms/machines/ibmxt/BIOS_5160_08NOV82_U19_6359116.BIN", "" } },
{ .name = "5000026 (08/16/82)", .internal_name = "ibm5160_5000026_5000027", .bios_type = BIOS_NORMAL,
.files_no = 2, .local = 0, .size = 65536, .files = { "roms/machines/ibmxt/BIOS_5160_16AUG82_U18_5000026.BIN", "roms/machines/ibmxt/BIOS_5160_16AUG82_U19_5000027.BIN", "" } },
#if 0
.default_int = 0,
.file_filter = NULL,
.spinner = { 0 },
.bios = {
{
.name = "1501512 (11/08/82)",
.internal_name = "ibm5160_1501512_5000027",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 0,
.size = 65536,
.files = { "roms/machines/ibmxt/BIOS_5160_08NOV82_U18_1501512.BIN", "roms/machines/ibmxt/BIOS_5160_08NOV82_U19_5000027.BIN", "" }
},
{
.name = "1501512 (11/08/82) (Alt)",
.internal_name = "ibm5160_1501512_6359116",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 0,
.size = 65536,
.files = { "roms/machines/ibmxt/BIOS_5160_08NOV82_U18_1501512.BIN", "roms/machines/ibmxt/BIOS_5160_08NOV82_U19_6359116.BIN", "" }
},
{
.name = "5000026 (08/16/82)",
.internal_name = "ibm5160_5000026_5000027",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 0,
.size = 65536,
.files = { "roms/machines/ibmxt/BIOS_5160_16AUG82_U18_5000026.BIN", "roms/machines/ibmxt/BIOS_5160_16AUG82_U19_5000027.BIN", "" }
},
// GlaBIOS for IBM XT
{ .name = "GlaBIOS 0.2.5 (8088)", .internal_name = "glabios_025_8088", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 40960, .files = { "roms/machines/glabios/GLABIOS_0.2.5_8X.ROM", "" } },
{ .name = "GlaBIOS 0.2.5 (V20)", .internal_name = "glabios_025_v20", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 40960, .files = { "roms/machines/glabios/GLABIOS_0.2.5_VX.ROM", "" } },
{
.name = "GlaBIOS 0.2.5 (8088)",
.internal_name = "glabios_025_8088",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 1,
.size = 40960,
.files = { "roms/machines/glabios/GLABIOS_0.2.5_8X.ROM", "roms/machines/ibmxt/BIOS_5160_08NOV82_U19_5000027.BIN", "" }
},
{
.name = "GlaBIOS 0.2.5 (V20)",
.internal_name = "glabios_025_v20",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 1,
.size = 40960,
.files = { "roms/machines/glabios/GLABIOS_0.2.5_VX.ROM", "roms/machines/ibmxt/BIOS_5160_08NOV82_U19_5000027.BIN", "" }
},
// The following are Diagnostic ROMs.
{ .name = "Supersoft Diagnostics", .internal_name = "diag_supersoft", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 65536, .files = { "roms/machines/diagnostic/Supersoft_PCXT_8KB.bin", "" } },
{ .name = "Ruud's Diagnostic Rom", .internal_name = "diag_ruuds", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 65536, .files = { "roms/machines/diagnostic/ruuds_diagnostic_rom_v5.3_8kb.bin", "" } },
{ .name = "XT RAM Test", .internal_name = "diag_xtramtest", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 65536, .files = { "roms/machines/diagnostic/xtramtest_8k.bin", "" } },
#endif
{
.name = "Supersoft Diagnostics",
.internal_name = "diag_supersoft",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 2,
.size = 65536,
.files = { "roms/machines/diagnostic/Supersoft_PCXT_32KB.bin", "roms/machines/ibmxt/BIOS_5160_08NOV82_U19_5000027.BIN", "" }
},
{
.name = "Ruud's Diagnostic Rom",
.internal_name = "diag_ruuds",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 2,
.size = 65536,
.files = { "roms/machines/diagnostic/ruuds_diagnostic_rom_v5.4_32kb.bin", "roms/machines/ibmxt/BIOS_5160_08NOV82_U19_5000027.BIN", "" }
},
{
.name = "XT RAM Test",
.internal_name = "diag_xtramtest",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 2,
.size = 65536,
.files = { "roms/machines/diagnostic/xtramtest_32k.bin", "roms/machines/ibmxt/BIOS_5160_08NOV82_U19_5000027.BIN", "" }
},
{ .files_no = 0 }
},
},
{
.name = "enable_5161",
.name = "enable_5161",
.description = "IBM 5161 Expansion Unit",
.type = CONFIG_BINARY,
.type = CONFIG_BINARY,
.default_int = 1
},
{
.name = "enable_basic",
.name = "enable_basic",
.description = "IBM Cassette Basic",
.type = CONFIG_BINARY,
.type = CONFIG_BINARY,
.default_int = 1
},
{ .name = "", .description = "", .type = CONFIG_END }
@@ -351,6 +406,8 @@ machine_xt_init(const machine_t *model)
uint8_t enable_5161;
uint8_t enable_basic;
const char *fn;
uint16_t offset = 0;
uint32_t local = 0;
/* No ROMs available. */
if (!device_available(model->device))
@@ -360,11 +417,17 @@ machine_xt_init(const machine_t *model)
enable_5161 = machine_get_config_int("enable_5161");
enable_basic = machine_get_config_int("enable_basic");
fn = device_get_bios_file(model->device, device_get_config_bios("bios"), 0);
ret = bios_load_linear(fn, 0x000fe000, 65536, 0x6000);
local = device_get_bios_local(model->device, device_get_config_bios("bios"));
if (local == 0) // Offset for stock roms
offset = 0x6000;
ret = bios_load_linear(fn, 0x000fe000, 65536, offset);
if (enable_basic && ret) {
fn = device_get_bios_file(model->device, device_get_config_bios("bios"), 0);
(void) bios_load_aux_linear(fn, 0x000f8000, 24576, 0);
if (local == 0) { // needed for stock roms
fn = device_get_bios_file(model->device, device_get_config_bios("bios"), 0);
(void) bios_load_aux_linear(fn, 0x000f8000, 24576, 0);
}
fn = device_get_bios_file(model->device, device_get_config_bios("bios"), 1);
/* On the real machine, the BASIC is repeated. */
(void) bios_load_aux_linear(fn, 0x000f0000, 8192, 0);
@@ -408,42 +471,98 @@ machine_genxt_init(const machine_t *model)
static const device_config_t ibmxt86_config[] = {
// clang-format off
{
.name = "bios",
.description = "BIOS Version",
.type = CONFIG_BIOS,
.name = "bios",
.description = "BIOS Version",
.type = CONFIG_BIOS,
.default_string = "ibm5160_050986",
.default_int = 0,
.file_filter = "",
.spinner = { 0 },
.bios = {
{ .name = "1501512 (05/09/86)", .internal_name = "ibm5160_050986", .bios_type = BIOS_NORMAL,
.files_no = 2, .local = 0, .size = 65536, .files = { "roms/machines/ibmxt86/BIOS_5160_09MAY86_U18_59X7268_62X0890_27256_F800.BIN", "roms/machines/ibmxt86/BIOS_5160_09MAY86_U19_62X0819_68X4370_27256_F000.BIN", "" } },
{ .name = "5000026 (01/10/86)", .internal_name = "ibm5160_011086", .bios_type = BIOS_NORMAL,
.files_no = 2, .local = 0, .size = 65536, .files = { "roms/machines/ibmxt86/BIOS_5160_10JAN86_U18_62X0851_27256_F800.BIN", "roms/machines/ibmxt86/BIOS_5160_10JAN86_U19_62X0854_27256_F000.BIN", "" } },
{ .name = "1501512 (01/10/86) (Alt)", .internal_name = "ibm5160_011086_alt", .bios_type = BIOS_NORMAL,
.files_no = 2, .local = 0, .size = 65536, .files = { "roms/machines/ibmxt86/BIOS_5160_10JAN86_U18_62X0852_27256_F800.BIN", "roms/machines/ibmxt86/BIOS_5160_10JAN86_U19_62X0853_27256_F000.BIN", "" } },
#if 0
.default_int = 0,
.file_filter = NULL,
.spinner = { 0 },
.bios = {
{
.name = "1501512 (05/09/86)",
.internal_name = "ibm5160_050986",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 0,
.size = 65536,
.files = { "roms/machines/ibmxt86/BIOS_5160_09MAY86_U18_59X7268_62X0890_27256_F800.BIN", "roms/machines/ibmxt86/BIOS_5160_09MAY86_U19_62X0819_68X4370_27256_F000.BIN", "" }
},
{
.name = "5000026 (01/10/86)",
.internal_name = "ibm5160_011086",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 0,
.size = 65536,
.files = { "roms/machines/ibmxt86/BIOS_5160_10JAN86_U18_62X0851_27256_F800.BIN", "roms/machines/ibmxt86/BIOS_5160_10JAN86_U19_62X0854_27256_F000.BIN", "" }
},
{
.name = "1501512 (01/10/86) (Alt)",
.internal_name = "ibm5160_011086_alt",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 0,
.size = 65536,
.files = { "roms/machines/ibmxt86/BIOS_5160_10JAN86_U18_62X0852_27256_F800.BIN", "roms/machines/ibmxt86/BIOS_5160_10JAN86_U19_62X0853_27256_F000.BIN", "" }
},
// GlaBIOS for IBM XT
{ .name = "GlaBIOS 0.2.5 (8088)", .internal_name = "glabios_025_8088", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 40960, .files = { "roms/machines/glabios/GLABIOS_0.2.5_8X.ROM", "" } },
{ .name = "GlaBIOS 0.2.5 (V20)", .internal_name = "glabios_025_v20", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 40960, .files = { "roms/machines/glabios/GLABIOS_0.2.5_VX.ROM", "" } },
{
.name = "GlaBIOS 0.2.5 (8088)",
.internal_name = "glabios_025_8088",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 1,
.size = 65536,
.files = { "roms/machines/glabios/GLABIOS_0.2.5_8X.ROM", "roms/machines/ibmxt86/BIOS_5160_09MAY86_U19_62X0819_68X4370_27256_F000.BIN", "" }
},
{
.name = "GlaBIOS 0.2.5 (V20)",
.internal_name = "glabios_025_v20",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 1,
.size = 65536,
.files = { "roms/machines/glabios/GLABIOS_0.2.5_VX.ROM", "roms/machines/ibmxt86/BIOS_5160_09MAY86_U19_62X0819_68X4370_27256_F000.BIN", "" }
},
// The following are Diagnostic ROMs.
{ .name = "Supersoft Diagnostics", .internal_name = "diag_supersoft", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 65536, .files = { "roms/machines/diagnostic/Supersoft_PCXT_8KB.bin", "" } },
{ .name = "Ruud's Diagnostic Rom", .internal_name = "diag_ruuds", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 65536, .files = { "roms/machines/diagnostic/ruuds_diagnostic_rom_v5.3_8kb.bin", "" } },
{ .name = "XT RAM Test", .internal_name = "diag_xtramtest", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 65536, .files = { "roms/machines/diagnostic/xtramtest_8k.bin", "" } },
#endif
{
.name = "Supersoft Diagnostics",
.internal_name = "diag_supersoft",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 2,
.size = 65536,
.files = { "roms/machines/diagnostic/Supersoft_PCXT_32KB.bin", "roms/machines/ibmxt86/BIOS_5160_09MAY86_U19_62X0819_68X4370_27256_F000.BIN", "" }
},
{
.name = "Ruud's Diagnostic Rom",
.internal_name = "diag_ruuds",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 2,
.size = 65536,
.files = { "roms/machines/diagnostic/ruuds_diagnostic_rom_v5.4_32kb.bin", "roms/machines/ibmxt86/BIOS_5160_09MAY86_U19_62X0819_68X4370_27256_F000.BIN", "" }
},
{
.name = "XT RAM Test",
.internal_name = "diag_xtramtest",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 2,
.size = 65536,
.files = { "roms/machines/diagnostic/xtramtest_32k.bin", "roms/machines/ibmxt86/BIOS_5160_09MAY86_U19_62X0819_68X4370_27256_F000.BIN", "" }
},
{ .files_no = 0 }
},
},
{
.name = "enable_5161",
.name = "enable_5161",
.description = "IBM 5161 Expansion Unit",
.type = CONFIG_BINARY,
.type = CONFIG_BINARY,
.default_int = 1
},
{ .name = "", .description = "", .type = CONFIG_END }
@@ -470,6 +589,8 @@ machine_xt86_init(const machine_t *model)
int ret = 0;
uint8_t enable_5161;
const char *fn;
uint16_t offset = 0;
uint32_t local = 0;
/* No ROMs available. */
if (!device_available(model->device))
@@ -478,11 +599,17 @@ machine_xt86_init(const machine_t *model)
device_context(model->device);
enable_5161 = machine_get_config_int("enable_5161");
fn = device_get_bios_file(model->device, device_get_config_bios("bios"), 0);
ret = bios_load_linear(fn, 0x000fe000, 65536, 0x6000);
local = device_get_bios_local(model->device, device_get_config_bios("bios"));
if (local == 0) // Offset for stock roms
offset = 0x6000;
ret = bios_load_linear(fn, 0x000fe000, 65536, offset);
if (ret) {
fn = device_get_bios_file(model->device, device_get_config_bios("bios"), 0);
(void) bios_load_aux_linear(fn, 0x000f8000, 24576, 0);
if (local == 0) { // needed for stock roms
fn = device_get_bios_file(model->device, device_get_config_bios("bios"), 0);
(void) bios_load_aux_linear(fn, 0x000f8000, 24576, 0);
}
fn = device_get_bios_file(model->device, device_get_config_bios("bios"), 1);
(void) bios_load_aux_linear(fn, 0x000f0000, 32768, 0);
}

View File

@@ -39,6 +39,7 @@
#include <86box/video.h>
#include <86box/machine.h>
#include <86box/isamem.h>
#include <86box/isarom.h>
#include <86box/pci.h>
#include <86box/plat_unused.h>
@@ -111,6 +112,11 @@ machine_init_ex(int m)
/* Reset any ISA memory cards. */
isamem_reset();
#if 0
/* Reset any ISA ROM cards. */
isarom_reset();
#endif
/* Reset the fast off stuff. */
cpu_fast_off_reset();

View File

@@ -66,6 +66,7 @@ extern const device_t vendex_device;
extern const device_t c5sbm2_device;
extern const device_t sb486pv_device;
extern const device_t ap5s_device;
extern const device_t d842_device;
extern const device_t d943_device;
extern const device_t dells333sl_device;
@@ -2377,7 +2378,7 @@ const machine_t machines[] = {
.net_device = NULL
},
{
.name = "[8086] Olivetti M21/24/24SP",
.name = "[8086] Olivetti M21/24/24SP/AT&T PC 6300",
.internal_name = "m24",
.type = MACHINE_TYPE_8086,
.chipset = MACHINE_CHIPSET_PROPRIETARY,
@@ -2417,7 +2418,7 @@ const machine_t machines[] = {
},
/* Has Olivetti KBC firmware. */
{
.name = "[8086] Olivetti M240",
.name = "[8086] Olivetti M240/AT&T PC 6300 WGS",
.internal_name = "m240",
.type = MACHINE_TYPE_8086,
.chipset = MACHINE_CHIPSET_PROPRIETARY,
@@ -10346,6 +10347,46 @@ const machine_t machines[] = {
.snd_device = NULL,
.net_device = NULL
},
{
.name = "[i430NX] Siemens-Nixdorf D842",
.internal_name = "d842",
.type = MACHINE_TYPE_SOCKET5,
.chipset = MACHINE_CHIPSET_INTEL_430NX,
.init = machine_at_d842_init,
.p1_handler = NULL,
.gpio_handler = NULL,
.available_flag = MACHINE_AVAILABLE,
.gpio_acpi_handler = NULL,
.cpu = {
.package = CPU_PKG_SOCKET5_7,
.block = CPU_BLOCK_NONE,
.min_bus = 50000000,
.max_bus = 66666667,
.min_voltage = 3380,
.max_voltage = 3520,
.min_multi = 1.5,
.max_multi = 2.0
},
.bus_flags = MACHINE_PS2_PCI,
.flags = MACHINE_IDE_DUAL | MACHINE_APM,
.ram = {
.min = 2048,
.max = 131072,
.step = 2048
},
.nvrmask = 127,
.kbc_device = NULL,
.kbc_p1 = 0xff,
.gpio = 0xffffffff,
.gpio_acpi = 0xffffffff,
.device = &d842_device,
.fdc_device = NULL,
.sio_device = NULL,
.vid_device = NULL,
.snd_device = NULL,
.net_device = NULL
},
/* This has the Phoenix MultiKey KBC firmware.
This is basically an Intel Premiere/PCI II with a fancier POST screen. */
{
@@ -11814,7 +11855,7 @@ const machine_t machines[] = {
.fdc_device = NULL,
.sio_device = NULL,
.vid_device = &gd5436_onboard_pci_device,
.snd_device = &sb_vibra16s_onboard_device,
.snd_device = &sb_vibra16c_onboard_device,
.net_device = NULL
},

View File

@@ -97,7 +97,8 @@ rom_check(const char *fn)
else {
fp = fopen(fn, "rb");
ret = (fp != NULL);
fclose(fp);
if (fp != NULL)
fclose(fp);
}
return ret;
@@ -134,6 +135,9 @@ rom_fopen(const char *fn, char *mode)
char temp[1024];
FILE *fp = NULL;
if ((fn == NULL) || (mode == NULL))
return NULL;
if (strstr(fn, "roms/") == fn) {
/* Relative path */
for (rom_path_t *rom_path = &rom_paths; rom_path != NULL; rom_path = rom_path->next) {
@@ -320,11 +324,12 @@ rom_load_linear_oddeven(const char *fn, uint32_t addr, int sz, int off, uint8_t
}
for (int i = 0; i < (sz >> 1); i++) {
if (fread(ptr + (addr + (i << 1) + 1), 1, 1, fp) != 1)
fatal("rom_load_linear(): Error reading od data\n");
fatal("rom_load_linear(): Error reading odd data\n");
}
}
(void) fclose(fp);
if (fp != NULL)
(void) fclose(fp);
return 1;
}
@@ -353,7 +358,8 @@ rom_load_linear(const char *fn, uint32_t addr, int sz, int off, uint8_t *ptr)
fatal("rom_load_linear(): Error reading data\n");
}
(void) fclose(fp);
if (fp != NULL)
(void) fclose(fp);
return 1;
}
@@ -397,7 +403,8 @@ rom_load_linear_inverted(const char *fn, uint32_t addr, int sz, int off, uint8_t
}
}
(void) fclose(fp);
if (fp != NULL)
(void) fclose(fp);
return 1;
}
@@ -438,8 +445,10 @@ rom_load_interleaved(const char *fnl, const char *fnh, uint32_t addr, int sz, in
}
}
(void) fclose(fph);
(void) fclose(fpl);
if (fph != NULL)
(void) fclose(fph);
if (fpl != NULL)
(void) fclose(fpl);
return 1;
}

View File

@@ -291,8 +291,12 @@ net_slirp_get_revents(int idx, void *opaque)
WSA_TO_POLL(FD_WRITE, SLIRP_POLL_OUT);
WSA_TO_POLL(FD_CONNECT, SLIRP_POLL_OUT);
WSA_TO_POLL(FD_OOB, SLIRP_POLL_PRI);
WSA_TO_POLL(FD_CLOSE, SLIRP_POLL_IN);
WSA_TO_POLL(FD_CLOSE, SLIRP_POLL_HUP);
if (ret == 0)
ret |= SLIRP_POLL_IN;
return ret;
}
#else

View File

@@ -2053,6 +2053,7 @@ escp_close(void *priv)
free(dev->page);
}
FT_Done_Face(dev->fontface);
free(dev);
}

View File

@@ -1834,7 +1834,7 @@ msgid "2 MB"
msgstr "2 MB"
msgid "8 MB"
msgstr " 8 MB"
msgstr "8 MB"
msgid "28 MB"
msgstr "28 MB"

View File

@@ -1834,7 +1834,7 @@ msgid "2 MB"
msgstr "2 MB"
msgid "8 MB"
msgstr " 8 MB"
msgstr "8 MB"
msgid "28 MB"
msgstr "28 MB"

View File

@@ -1834,7 +1834,7 @@ msgid "2 MB"
msgstr "2 MB"
msgid "8 MB"
msgstr " 8 MB"
msgstr "8 MB"
msgid "28 MB"
msgstr "28 MB"

View File

@@ -1833,7 +1833,7 @@ msgid "2 MB"
msgstr "2 MB"
msgid "8 MB"
msgstr " 8 MB"
msgstr "8 MB"
msgid "28 MB"
msgstr "28 MB"

View File

@@ -1834,7 +1834,7 @@ msgid "2 MB"
msgstr "2 MB"
msgid "8 MB"
msgstr " 8 MB"
msgstr "8 MB"
msgid "28 MB"
msgstr "28 MB"

View File

@@ -2194,4 +2194,13 @@ msgid "Toggle pause"
msgstr "Переключить паузу"
msgid "Toggle mute"
msgstr "Переключить беззвучный режим"
msgstr "Переключить беззвучный режим"
msgid "Text files"
msgstr "Текстовые файлы"
msgid "ROM files"
msgstr "Файлы ПЗУ"
msgid "SoundFont files"
msgstr "Файлы SoundFont"

View File

@@ -31,6 +31,7 @@
#include <QLabel>
#include <QDir>
#include <QSettings>
#include <QStringBuilder>
extern "C" {
#include <86box/86box.h>
@@ -45,6 +46,7 @@ extern "C" {
#include "qt_filefield.hpp"
#include "qt_models_common.hpp"
#include "qt_util.hpp"
#ifdef Q_OS_LINUX
# include <sys/stat.h>
# include <sys/sysmacros.h>
@@ -276,11 +278,25 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep)
}
case CONFIG_FNAME:
{
auto *fileField = new FileField();
auto *fileField = new FileField(this);
fileField->setObjectName(config->name);
fileField->setFileName(selected);
fileField->setFilter(QString(config->file_filter).left(static_cast<int>(strcspn(config->file_filter,
"|"))));
/* Get the actually used part of the filter */
QString filter = QString(config->file_filter).left(static_cast<int>(strcspn(config->file_filter, "|")));
/* Extract the description and the extension list */
QRegularExpressionMatch match = QRegularExpression("(.+) \\((.+)\\)$").match(filter);
QString description = match.captured(1);
QString extensions = match.captured(2);
QStringList extensionList;
/* Split the extension list up and strip the filename globs */
QRegularExpression re("\\*\\.(.*)");
int i = 0;
while (extensions.section(' ', i, i) != "") {
QString extension = re.match(extensions.section(' ', i, i)).captured(1);
extensionList.append(extension);
i++;
}
fileField->setFilter(tr(description.toUtf8().constData()) % util::DlgFilter(extensionList) % tr("All files") % util::DlgFilter({ "*" }, true));
this->ui->formLayout->addRow(tr(config->description), fileField);
break;
}
@@ -388,6 +404,7 @@ DeviceConfig::ConfigureDevice(const _device_ *device, int instance, Settings *se
}
case CONFIG_MIDI_OUT:
case CONFIG_MIDI_IN:
case CONFIG_INT:
case CONFIG_SELECTION:
{
auto *cbox = dc.findChild<QComboBox *>(config->name);

View File

@@ -104,22 +104,22 @@ glsl_detect_bom(const char *fn)
static char *load_file(const char *fn) {
int bom = glsl_detect_bom(fn);
FILE *f = plat_fopen(fn, "rb");
if (!f)
FILE *fp = plat_fopen(fn, "rb");
if (!fp)
return 0;
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
fseek(f, 0, SEEK_SET);
fseek(fp, 0, SEEK_END);
long fsize = ftell(fp);
fseek(fp, 0, SEEK_SET);
if (bom) {
fsize -= 3;
fseek(f, 3, SEEK_SET);
fseek(fp, 3, SEEK_SET);
}
char *data = (char*)malloc(fsize + 1);
fread(data, fsize, 1, f);
fclose(f);
(void) fread(data, fsize, 1, fp);
fclose(fp);
data[fsize] = 0;

View File

@@ -51,22 +51,29 @@ SettingsDisplay::~SettingsDisplay()
void
SettingsDisplay::save()
{
gfxcard[0] = ui->comboBoxVideo->currentData().toInt();
// TODO
#if 0
for (uint8_t i = 0; i < GFXCARD_MAX; ++i) {
QComboBox *cbox = findChild<QComboBox *>(QString("comboBoxVideo%1").arg(i + 1));
gfxcard[i] = cbox->currentData().toInt();
}
#else
gfxcard[0] = ui->comboBoxVideo->currentData().toInt();
for (uint8_t i = 1; i < GFXCARD_MAX; i ++)
gfxcard[i] = ui->comboBoxVideoSecondary->currentData().toInt();
gfxcard[i] = ui->comboBoxVideoSecondary->currentData().toInt();
#endif
voodoo_enabled = ui->checkBoxVoodoo->isChecked() ? 1 : 0;
ibm8514_standalone_enabled = ui->checkBox8514->isChecked() ? 1 : 0;
xga_standalone_enabled = ui->checkBoxXga->isChecked() ? 1 : 0;
da2_standalone_enabled = ui->checkBoxDa2->isChecked() ? 1 : 0;
da2_standalone_enabled = ui->checkBoxDa2->isChecked() ? 1 : 0;
}
void
SettingsDisplay::onCurrentMachineChanged(int machineId)
{
// win_settings_video_proc, WM_INITDIALOG
this->machineId = machineId;
this->machineId = machineId;
auto curVideoCard = videoCard[0];
auto *model = ui->comboBoxVideo->model();
@@ -98,25 +105,26 @@ SettingsDisplay::onCurrentMachineChanged(int machineId)
}
model->removeRows(0, removeRows);
// TODO
if (machine_has_flags(machineId, MACHINE_VIDEO_ONLY) > 0) {
ui->comboBoxVideo->setEnabled(false);
ui->comboBoxVideoSecondary->setEnabled(false);
ui->pushButtonConfigureSecondary->setEnabled(false);
ui->pushButtonConfigureVideoSecondary->setEnabled(false);
selectedRow = 1;
} else {
ui->comboBoxVideo->setEnabled(true);
ui->comboBoxVideoSecondary->setEnabled(true);
ui->pushButtonConfigureSecondary->setEnabled(true);
ui->pushButtonConfigureVideoSecondary->setEnabled(true);
}
ui->comboBoxVideo->setCurrentIndex(selectedRow);
// TODO
for (uint8_t i = 1; i < GFXCARD_MAX; i ++)
if (gfxcard[i] == 0)
ui->pushButtonConfigureSecondary->setEnabled(false);
ui->pushButtonConfigureVideoSecondary->setEnabled(false);
}
void
SettingsDisplay::on_pushButtonConfigure_clicked()
SettingsDisplay::on_pushButtonConfigureVideo_clicked()
{
int videoCard = ui->comboBoxVideo->currentData().toInt();
auto *device = video_card_getdevice(videoCard);
@@ -160,17 +168,17 @@ SettingsDisplay::on_pushButtonConfigureDa2_clicked()
void
SettingsDisplay::on_comboBoxVideo_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
static QRegularExpression voodooRegex("3dfx|voodoo|banshee", QRegularExpression::CaseInsensitiveOption);
static QRegularExpression voodooRegex("3dfx|voodoo|banshee|raven", QRegularExpression::CaseInsensitiveOption);
auto curVideoCard_2 = videoCard[1];
videoCard[0] = ui->comboBoxVideo->currentData().toInt();
if (videoCard[0] == VID_INTERNAL)
ui->pushButtonConfigure->setEnabled(machine_has_flags(machineId, MACHINE_VIDEO) &&
device_has_config(machine_get_vid_device(machineId)));
ui->pushButtonConfigureVideo->setEnabled(machine_has_flags(machineId, MACHINE_VIDEO) &&
device_has_config(machine_get_vid_device(machineId)));
else
ui->pushButtonConfigure->setEnabled(video_card_has_config(videoCard[0]) > 0);
ui->pushButtonConfigureVideo->setEnabled(video_card_has_config(videoCard[0]) > 0);
bool machineHasPci = machine_has_bus(machineId, MACHINE_BUS_PCI) > 0;
ui->pushButtonConfigureVoodoo->setEnabled(machineHasPci && ui->checkBoxVoodoo->isChecked());
@@ -233,7 +241,7 @@ SettingsDisplay::on_comboBoxVideo_currentIndexChanged(int index)
if ((videoCard[1] == 0) || (machine_has_flags(machineId, MACHINE_VIDEO_ONLY) > 0)) {
ui->comboBoxVideoSecondary->setCurrentIndex(0);
ui->pushButtonConfigureSecondary->setEnabled(false);
ui->pushButtonConfigureVideoSecondary->setEnabled(false);
}
// Is the currently selected video card a voodoo?
@@ -287,15 +295,15 @@ void
SettingsDisplay::on_comboBoxVideoSecondary_currentIndexChanged(int index)
{
if (index < 0) {
ui->pushButtonConfigureSecondary->setEnabled(false);
ui->pushButtonConfigureVideoSecondary->setEnabled(false);
return;
}
videoCard[1] = ui->comboBoxVideoSecondary->currentData().toInt();
ui->pushButtonConfigureSecondary->setEnabled(index != 0 && video_card_has_config(videoCard[1]) > 0);
ui->pushButtonConfigureVideoSecondary->setEnabled(index != 0 && video_card_has_config(videoCard[1]) > 0);
}
void
SettingsDisplay::on_pushButtonConfigureSecondary_clicked()
SettingsDisplay::on_pushButtonConfigureVideoSecondary_clicked()
{
auto *device = video_card_getdevice(ui->comboBoxVideoSecondary->currentData().toInt());
DeviceConfig::ConfigureDevice(device);

View File

@@ -22,22 +22,23 @@ public slots:
void onCurrentMachineChanged(int machineId);
private slots:
void on_pushButtonConfigureSecondary_clicked();
private slots:
void on_comboBoxVideoSecondary_currentIndexChanged(int index);
private slots:
void on_checkBoxVoodoo_stateChanged(int state);
void on_checkBox8514_stateChanged(int state);
void on_checkBoxXga_stateChanged(int state);
void on_checkBoxDa2_stateChanged(int state);
void on_comboBoxVideo_currentIndexChanged(int index);
void on_pushButtonConfigureVideo_clicked();
void on_comboBoxVideoSecondary_currentIndexChanged(int index);
void on_pushButtonConfigureVideoSecondary_clicked();
void on_checkBoxVoodoo_stateChanged(int state);
void on_pushButtonConfigureVoodoo_clicked();
void on_checkBox8514_stateChanged(int state);
void on_pushButtonConfigure8514_clicked();
void on_checkBoxXga_stateChanged(int state);
void on_pushButtonConfigureXga_clicked();
void on_checkBoxDa2_stateChanged(int state);
void on_pushButtonConfigureDa2_clicked();
void on_pushButtonConfigure_clicked();
private:
Ui::SettingsDisplay *ui;

View File

@@ -26,28 +26,8 @@
<property name="bottomMargin">
<number>0</number>
</property>
<item row="1" column="2">
<widget class="QPushButton" name="pushButtonConfigure">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="6" column="0" colspan="2">
<widget class="QCheckBox" name="checkBoxXga">
<property name="text">
<string>XGA Graphics</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<widget class="QLabel" name="labelVideo">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -72,15 +52,21 @@
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QPushButton" name="pushButtonConfigureVoodoo">
<item row="1" column="2">
<widget class="QPushButton" name="pushButtonConfigureVideo">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_2">
<widget class="QLabel" name="labelVideoSecondary">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -92,10 +78,23 @@
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QCheckBox" name="checkBox8514">
<item row="3" column="0" colspan="2">
<widget class="QComboBox" name="comboBoxVideoSecondary">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maxVisibleItems">
<number>30</number>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QPushButton" name="pushButtonConfigureVideoSecondary">
<property name="text">
<string>IBM 8514/A Graphics</string>
<string>Configure</string>
</property>
</widget>
</item>
@@ -106,6 +105,20 @@
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QPushButton" name="pushButtonConfigureVoodoo">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QCheckBox" name="checkBox8514">
<property name="text">
<string>IBM 8514/A Graphics</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QPushButton" name="pushButtonConfigure8514">
<property name="text">
@@ -113,6 +126,13 @@
</property>
</widget>
</item>
<item row="6" column="0" colspan="2">
<widget class="QCheckBox" name="checkBoxXga">
<property name="text">
<string>XGA Graphics</string>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QPushButton" name="pushButtonConfigureXga">
<property name="text">
@@ -134,26 +154,6 @@
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QPushButton" name="pushButtonConfigureSecondary">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QComboBox" name="comboBoxVideoSecondary">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maxVisibleItems">
<number>30</number>
</property>
</widget>
</item>
<item row="8" column="0" colspan="3">
<spacer name="verticalSpacer">
<property name="orientation">

View File

@@ -359,9 +359,9 @@ SettingsFloppyCDROM::on_comboBoxSpeed_activated(int index)
void
SettingsFloppyCDROM::on_comboBoxBus_activated(int)
{
auto i = ui->tableViewCDROM->selectionModel()->currentIndex().siblingAtColumn(0);
auto i = ui->tableViewCDROM->selectionModel()->currentIndex().siblingAtColumn(0);
uint8_t bus_type = ui->comboBoxBus->currentData().toUInt();
int cdromIdx = ui->tableViewCDROM->selectionModel()->currentIndex().data().toInt();
int cdromIdx = ui->tableViewCDROM->selectionModel()->currentIndex().data().toInt();
Harddrives::busTrackClass->device_track(0, DEV_CDROM, ui->tableViewCDROM->model()->data(i,
Qt::UserRole).toInt(), ui->tableViewCDROM->model()->data(i,
@@ -384,9 +384,9 @@ SettingsFloppyCDROM::on_comboBoxBus_activated(int)
auto *modelType = ui->comboBoxCDROMType->model();
int removeRows = modelType->rowCount();
uint32_t j = 0;
int selectedTypeRow = 0;
int eligibleRows = 0;
uint32_t j = 0;
int selectedTypeRow = 0;
int eligibleRows = 0;
while (cdrom_drive_types[j].bus_type != BUS_TYPE_NONE) {
if (((bus_type == CDROM_BUS_ATAPI) || (bus_type == CDROM_BUS_SCSI)) &&
((cdrom_drive_types[j].bus_type == bus_type) ||
@@ -414,11 +414,10 @@ void
SettingsFloppyCDROM::enableCurrentlySelectedChannel()
{
const auto *item_model = qobject_cast<QStandardItemModel*>(ui->comboBoxChannel->model());
const auto index = ui->comboBoxChannel->currentIndex();
auto *item = item_model->item(index);
if(item) {
const auto index = ui->comboBoxChannel->currentIndex();
auto *item = item_model->item(index);
if(item)
item->setEnabled(true);
}
}
void
@@ -449,9 +448,9 @@ SettingsFloppyCDROM::on_comboBoxCDROMType_activated(int)
ui->tableViewCDROM->resizeColumnsToContents();
ui->tableViewCDROM->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
int speed = cdrom_get_speed(type);
int speed = cdrom_get_speed(type);
if (speed == -1) {
speed = ui->comboBoxSpeed->currentData().toUInt();
speed = ui->comboBoxSpeed->currentData().toUInt();
ui->comboBoxSpeed->setEnabled(true);
} else
ui->comboBoxSpeed->setEnabled(false);

View File

@@ -19,17 +19,20 @@ public:
signals:
void cdromChannelChanged();
private slots:
void on_comboBoxCDROMType_activated(int index);
void on_comboBoxChannel_activated(int index);
void on_comboBoxBus_activated(int index);
void on_comboBoxSpeed_activated(int index);
void on_comboBoxBus_currentIndexChanged(int index);
void on_comboBoxFloppyType_activated(int index);
void on_checkBoxCheckBPB_stateChanged(int arg1);
void on_checkBoxTurboTimings_stateChanged(int arg1);
void onFloppyRowChanged(const QModelIndex &current);
void on_comboBoxFloppyType_activated(int index);
void on_checkBoxTurboTimings_stateChanged(int arg1);
void on_checkBoxCheckBPB_stateChanged(int arg1);
void onCDROMRowChanged(const QModelIndex &current);
void on_comboBoxBus_activated(int index);
void on_comboBoxBus_currentIndexChanged(int index);
void on_comboBoxChannel_activated(int index);
void on_comboBoxSpeed_activated(int index);
void on_comboBoxCDROMType_activated(int index);
private:
Ui::SettingsFloppyCDROM *ui;

View File

@@ -27,7 +27,7 @@
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label">
<widget class="QLabel" name="labelFloppy">
<property name="text">
<string>Floppy drives:</string>
</property>
@@ -68,7 +68,7 @@
<widget class="QWidget" name="floppyControls" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label_2">
<widget class="QLabel" name="labelFloppyType">
<property name="text">
<string>Type:</string>
</property>
@@ -99,7 +99,7 @@
</widget>
</item>
<item>
<widget class="QLabel" name="label_6">
<widget class="QLabel" name="labelCDROM">
<property name="text">
<string>CD-ROM drives:</string>
</property>
@@ -140,33 +140,12 @@
<widget class="QWidget" name="cdControls" native="true">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_3">
<widget class="QLabel" name="labelBus">
<property name="text">
<string>Bus:</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Channel:</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Speed:</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Type:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBoxBus">
<property name="maxVisibleItems">
@@ -174,6 +153,13 @@
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="labelChannel">
<property name="text">
<string>Channel:</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QComboBox" name="comboBoxChannel">
<property name="maxVisibleItems">
@@ -181,6 +167,13 @@
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labelSpeed">
<property name="text">
<string>Speed:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="comboBoxSpeed">
<property name="maxVisibleItems">
@@ -188,6 +181,13 @@
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="labelCDROMType">
<property name="text">
<string>Type:</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxCDROMType">
<property name="maxVisibleItems">

View File

@@ -49,9 +49,8 @@ static void
normalize_hd_list()
{
hard_disk_t ihdd[HDD_NUM];
int j;
int j = 0;
j = 0;
memset(ihdd, 0x00, HDD_NUM * sizeof(hard_disk_t));
for (uint8_t i = 0; i < HDD_NUM; i++) {
@@ -75,8 +74,8 @@ static void
addRow(QAbstractItemModel *model, hard_disk_t *hd)
{
const QString userPath = usr_path;
int row = model->rowCount();
model->insertRow(row);
QString busName = Harddrives::BusChannelName(hd->bus_type, hd->channel);
@@ -88,11 +87,11 @@ addRow(QAbstractItemModel *model, hard_disk_t *hd)
model->setData(model->index(row, ColumnBus), hd->channel, DataBusChannelPrevious);
Harddrives::busTrackClass->device_track(1, DEV_HDD, hd->bus_type, hd->channel);
QString fileName = hd->fn;
if (fileName.startsWith(userPath, Qt::CaseInsensitive)) {
if (fileName.startsWith(userPath, Qt::CaseInsensitive))
model->setData(model->index(row, ColumnFilename), fileName.mid(userPath.size()));
} else {
else
model->setData(model->index(row, ColumnFilename), fileName);
}
model->setData(model->index(row, ColumnFilename), fileName, Qt::UserRole);
model->setData(model->index(row, ColumnCylinders), hd->tracks);
@@ -120,9 +119,8 @@ SettingsHarddisks::SettingsHarddisks(QWidget *parent)
ui->tableView->setModel(model);
for (int i = 0; i < HDD_NUM; i++) {
if (hdd[i].bus_type > 0) {
if (hdd[i].bus_type > 0)
addRow(model, &hdd[i]);
}
}
if (model->rowCount() == HDD_NUM) {
ui->pushButtonNew->setEnabled(false);
@@ -176,9 +174,8 @@ void SettingsHarddisks::reloadBusChannels() {
void
SettingsHarddisks::on_comboBoxBus_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
buschangeinprogress = true;
auto idx = ui->tableView->selectionModel()->currentIndex();
@@ -226,9 +223,8 @@ SettingsHarddisks::on_comboBoxBus_currentIndexChanged(int index)
void
SettingsHarddisks::on_comboBoxChannel_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
auto idx = ui->tableView->selectionModel()->currentIndex();
if (idx.isValid()) {
@@ -250,17 +246,15 @@ SettingsHarddisks::enableCurrentlySelectedChannel()
const auto *item_model = qobject_cast<QStandardItemModel*>(ui->comboBoxChannel->model());
const auto index = ui->comboBoxChannel->currentIndex();
auto *item = item_model->item(index);
if(item) {
if(item)
item->setEnabled(true);
}
}
void
SettingsHarddisks::on_comboBoxSpeed_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
auto idx = ui->tableView->selectionModel()->currentIndex();
if (idx.isValid()) {
@@ -288,20 +282,19 @@ SettingsHarddisks::onTableRowChanged(const QModelIndex &current)
auto *model = ui->comboBoxBus->model();
auto match = model->match(model->index(0, 0), Qt::UserRole, bus);
if (!match.isEmpty()) {
if (!match.isEmpty())
ui->comboBoxBus->setCurrentIndex(match.first().row());
}
model = ui->comboBoxChannel->model();
match = model->match(model->index(0, 0), Qt::UserRole, busChannel);
if (!match.isEmpty()) {
if (!match.isEmpty())
ui->comboBoxChannel->setCurrentIndex(match.first().row());
}
model = ui->comboBoxSpeed->model();
match = model->match(model->index(0, 0), Qt::UserRole, speed);
if (!match.isEmpty()) {
if (!match.isEmpty())
ui->comboBoxSpeed->setCurrentIndex(match.first().row());
}
reloadBusChannels();
}
@@ -358,11 +351,10 @@ void
SettingsHarddisks::on_pushButtonRemove_clicked()
{
auto idx = ui->tableView->selectionModel()->currentIndex();
if (!idx.isValid()) {
if (!idx.isValid())
return;
}
auto *model = ui->tableView->model();
auto *model = ui->tableView->model();
const auto col = idx.siblingAtColumn(ColumnBus);
Harddrives::busTrackClass->device_track(0, DEV_HDD, model->data(col, DataBus).toInt(), model->data(col, DataBusChannel).toInt());
model->removeRow(idx.row());

View File

@@ -21,14 +21,13 @@ signals:
void driveChannelChanged();
private slots:
void on_comboBoxBus_currentIndexChanged(int index);
void on_comboBoxChannel_currentIndexChanged(int index);
void on_comboBoxSpeed_currentIndexChanged(int index);
private slots:
void on_pushButtonRemove_clicked();
void on_pushButtonExisting_clicked();
void on_pushButtonNew_clicked();
void on_comboBoxBus_currentIndexChanged(int index);
void on_pushButtonExisting_clicked();
void on_pushButtonRemove_clicked();
void onTableRowChanged(const QModelIndex &current);

View File

@@ -46,7 +46,7 @@
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<layout class="QHBoxLayout" name="horizontalLayoutHardDisks">
<item>
<widget class="QLabel" name="labelBus">
<property name="text">

View File

@@ -38,7 +38,7 @@ extern "C" {
#include "qt_keybind.hpp"
extern MainWindow *main_window;
// Temporary working copy of key list
accelKey acc_keys_t[NUM_ACCELS];
@@ -48,41 +48,40 @@ SettingsInput::SettingsInput(QWidget *parent)
{
ui->setupUi(this);
QStringList horizontalHeader;
QStringList verticalHeader;
horizontalHeader.append(tr("Action"));
QStringList horizontalHeader;
QStringList verticalHeader;
horizontalHeader.append(tr("Action"));
horizontalHeader.append(tr("Keybind"));
QTableWidget *keyTable = ui->tableKeys;
keyTable->setRowCount(10);
keyTable->setColumnCount(3);
keyTable->setColumnHidden(2, true);
keyTable->setColumnWidth(0, 200);
keyTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
QStringList headers;
//headers << "Action" << "Bound key";
keyTable->setHorizontalHeaderLabels(horizontalHeader);
keyTable->verticalHeader()->setVisible(false);
keyTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
keyTable->setSelectionBehavior(QAbstractItemView::SelectRows);
keyTable->setSelectionMode(QAbstractItemView::SingleSelection);
keyTable->setShowGrid(true);
// Make a working copy of acc_keys so we can check for dupes later without getting
// confused
for(int x=0;x<NUM_ACCELS;x++) {
strcpy(acc_keys_t[x].name, acc_keys[x].name);
strcpy(acc_keys_t[x].desc, acc_keys[x].desc);
strcpy(acc_keys_t[x].seq, acc_keys[x].seq);
}
QTableWidget *keyTable = ui->tableKeys;
keyTable->setRowCount(10);
keyTable->setColumnCount(3);
keyTable->setColumnHidden(2, true);
keyTable->setColumnWidth(0, 200);
keyTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
QStringList headers;
//headers << "Action" << "Bound key";
keyTable->setHorizontalHeaderLabels(horizontalHeader);
keyTable->verticalHeader()->setVisible(false);
keyTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
keyTable->setSelectionBehavior(QAbstractItemView::SelectRows);
keyTable->setSelectionMode(QAbstractItemView::SingleSelection);
keyTable->setShowGrid(true);
refreshInputList();
// Make a working copy of acc_keys so we can check for dupes later without getting
// confused
for(int x = 0; x < NUM_ACCELS; x++) {
strcpy(acc_keys_t[x].name, acc_keys[x].name);
strcpy(acc_keys_t[x].desc, acc_keys[x].desc);
strcpy(acc_keys_t[x].seq, acc_keys[x].seq);
}
refreshInputList();
onCurrentMachineChanged(machine);
}
SettingsInput::~SettingsInput()
{
delete ui;
@@ -93,16 +92,16 @@ SettingsInput::save()
{
mouse_type = ui->comboBoxMouse->currentData().toInt();
joystick_type = ui->comboBoxJoystick->currentData().toInt();
// Copy accelerators from working set to global set
for(int x=0;x<NUM_ACCELS;x++) {
strcpy(acc_keys[x].name, acc_keys_t[x].name);
strcpy(acc_keys[x].desc, acc_keys_t[x].desc);
strcpy(acc_keys[x].seq, acc_keys_t[x].seq);
}
ProgSettings::reloadStrings();
// Copy accelerators from working set to global set
for(int x = 0; x < NUM_ACCELS; x++) {
strcpy(acc_keys[x].name, acc_keys_t[x].name);
strcpy(acc_keys[x].desc, acc_keys_t[x].desc);
strcpy(acc_keys[x].seq, acc_keys_t[x].seq);
}
ProgSettings::reloadStrings();
}
void
SettingsInput::onCurrentMachineChanged(int machineId)
{
@@ -115,13 +114,11 @@ SettingsInput::onCurrentMachineChanged(int machineId)
int selectedRow = 0;
for (int i = 0; i < mouse_get_ndev(); ++i) {
const auto *dev = mouse_get_device(i);
if ((i == MOUSE_TYPE_INTERNAL) && (machine_has_flags(machineId, MACHINE_MOUSE) == 0)) {
if ((i == MOUSE_TYPE_INTERNAL) && (machine_has_flags(machineId, MACHINE_MOUSE) == 0))
continue;
}
if (device_is_valid(dev, machineId) == 0) {
if (device_is_valid(dev, machineId) == 0)
continue;
}
QString name = DeviceConfig::DeviceName(dev, mouse_get_internal_name(i), 0);
int row = mouseModel->rowCount();
@@ -131,9 +128,8 @@ SettingsInput::onCurrentMachineChanged(int machineId)
mouseModel->setData(idx, name, Qt::DisplayRole);
mouseModel->setData(idx, i, Qt::UserRole);
if (i == mouse_type) {
if (i == mouse_type)
selectedRow = row - removeRows;
}
}
mouseModel->removeRows(0, removeRows);
ui->comboBoxMouse->setCurrentIndex(selectedRow);
@@ -141,13 +137,12 @@ SettingsInput::onCurrentMachineChanged(int machineId)
int i = 0;
const char *joyName = joystick_get_name(i);
auto *joystickModel = ui->comboBoxJoystick->model();
removeRows = joystickModel->rowCount();
selectedRow = 0;
removeRows = joystickModel->rowCount();
selectedRow = 0;
while (joyName) {
int row = Models::AddEntry(joystickModel, tr(joyName).toUtf8().data(), i);
if (i == joystick_type) {
if (i == joystick_type)
selectedRow = row - removeRows;
}
++i;
joyName = joystick_get_name(i);
@@ -159,95 +154,95 @@ SettingsInput::onCurrentMachineChanged(int machineId)
void
SettingsInput::refreshInputList()
{
for (int x=0;x<NUM_ACCELS;x++) {
ui->tableKeys->setItem(x, 0, new QTableWidgetItem(tr(acc_keys_t[x].desc)));
ui->tableKeys->setItem(x, 1, new QTableWidgetItem(QKeySequence(acc_keys_t[x].seq, QKeySequence::PortableText).toString(QKeySequence::NativeText)));
ui->tableKeys->setItem(x, 2, new QTableWidgetItem(acc_keys_t[x].name));
}
for (int x = 0; x < NUM_ACCELS; x++) {
ui->tableKeys->setItem(x, 0, new QTableWidgetItem(tr(acc_keys_t[x].desc)));
ui->tableKeys->setItem(x, 1, new QTableWidgetItem(QKeySequence(acc_keys_t[x].seq, QKeySequence::PortableText).toString(QKeySequence::NativeText)));
ui->tableKeys->setItem(x, 2, new QTableWidgetItem(acc_keys_t[x].name));
}
}
void
SettingsInput::on_tableKeys_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn)
{
// Enable/disable bind/clear buttons if user clicked valid row
QTableWidgetItem *cell = ui->tableKeys->item(currentRow,1);
if (!cell)
{
ui->pushButtonBind->setEnabled(false);
ui->pushButtonClearBind->setEnabled(false);
}
else
{
ui->pushButtonBind->setEnabled(true);
ui->pushButtonClearBind->setEnabled(true);
}
// Enable/disable bind/clear buttons if user clicked valid row
QTableWidgetItem *cell = ui->tableKeys->item(currentRow,1);
if (!cell) {
ui->pushButtonBind->setEnabled(false);
ui->pushButtonClearBind->setEnabled(false);
} else {
ui->pushButtonBind->setEnabled(true);
ui->pushButtonClearBind->setEnabled(true);
}
}
void
SettingsInput::on_tableKeys_cellDoubleClicked(int row, int col)
{
// Edit bind
QTableWidgetItem *cell = ui->tableKeys->item(row,1);
if (!cell) return;
QKeySequence keyseq = KeyBinder::BindKey(this, cell->text());
if (keyseq != false) {
// If no change was made, don't change anything.
if (keyseq.toString(QKeySequence::NativeText) == cell->text()) return;
// Otherwise, check for conflicts.
// Check against the *working* copy - NOT the one in use by the app,
// so we don't test against shortcuts the user already changed.
for(int x=0;x<NUM_ACCELS;x++)
{
if(QString::fromStdString(acc_keys_t[x].seq) == keyseq.toString(QKeySequence::PortableText))
{
// That key is already in use
main_window->showMessage(MBX_ANSI & MBX_INFO, "Bind conflict", "This key combo is already in use", false);
return;
}
}
// If we made it here, there were no conflicts.
// Go ahead and apply the bind.
// Find the correct accelerator key entry
int accKeyID = FindAccelerator(ui->tableKeys->item(row,2)->text().toUtf8().constData());
if (accKeyID < 0) return; // this should never happen
// Make the change
cell->setText(keyseq.toString(QKeySequence::NativeText));
strcpy(acc_keys_t[accKeyID].seq, keyseq.toString(QKeySequence::PortableText).toUtf8().constData());
refreshInputList();
}
// Edit bind
QTableWidgetItem *cell = ui->tableKeys->item(row,1);
if (!cell)
return;
QKeySequence keyseq = KeyBinder::BindKey(this, cell->text());
if (keyseq != false) {
// If no change was made, don't change anything.
if (keyseq.toString(QKeySequence::NativeText) == cell->text())
return;
// Otherwise, check for conflicts.
// Check against the *working* copy - NOT the one in use by the app,
// so we don't test against shortcuts the user already changed.
for(int x = 0; x < NUM_ACCELS; x++) {
if(QString::fromStdString(acc_keys_t[x].seq) == keyseq.toString(QKeySequence::PortableText)) {
// That key is already in use
main_window->showMessage(MBX_ANSI & MBX_INFO, "Bind conflict", "This key combo is already in use", false);
return;
}
}
// If we made it here, there were no conflicts.
// Go ahead and apply the bind.
// Find the correct accelerator key entry
int accKeyID = FindAccelerator(ui->tableKeys->item(row,2)->text().toUtf8().constData());
if (accKeyID < 0)
return; // this should never happen
// Make the change
cell->setText(keyseq.toString(QKeySequence::NativeText));
strcpy(acc_keys_t[accKeyID].seq, keyseq.toString(QKeySequence::PortableText).toUtf8().constData());
refreshInputList();
}
}
void
SettingsInput::on_pushButtonBind_clicked()
{
// Edit bind
QTableWidgetItem *cell = ui->tableKeys->currentItem();
if (!cell) return;
on_tableKeys_cellDoubleClicked(cell->row(), cell->column());
// Edit bind
QTableWidgetItem *cell = ui->tableKeys->currentItem();
if (!cell)
return;
on_tableKeys_cellDoubleClicked(cell->row(), cell->column());
}
void
SettingsInput::on_pushButtonClearBind_clicked()
{
// Wipe bind
QTableWidgetItem *cell = ui->tableKeys->item(ui->tableKeys->currentRow(), 1);
if (!cell) return;
cell->setText("");
// Find the correct accelerator key entry
int accKeyID = FindAccelerator(ui->tableKeys->item(cell->row(),2)->text().toUtf8().constData());
if (accKeyID < 0) return; // this should never happen
// Make the change
cell->setText("");
strcpy(acc_keys_t[accKeyID].seq, "");
// Wipe bind
QTableWidgetItem *cell = ui->tableKeys->item(ui->tableKeys->currentRow(), 1);
if (!cell)
return;
cell->setText("");
// Find the correct accelerator key entry
int accKeyID = FindAccelerator(ui->tableKeys->item(cell->row(),2)->text().toUtf8().constData());
if (accKeyID < 0)
return; // this should never happen
// Make the change
cell->setText("");
strcpy(acc_keys_t[accKeyID].seq, "");
}
void
@@ -263,9 +258,9 @@ SettingsInput::on_comboBoxJoystick_currentIndexChanged(int index)
int joystickId = ui->comboBoxJoystick->currentData().toInt();
for (int i = 0; i < MAX_JOYSTICKS; ++i) {
auto *btn = findChild<QPushButton *>(QString("pushButtonJoystick%1").arg(i + 1));
if (btn == nullptr) {
if (btn == nullptr)
continue;
}
btn->setEnabled(joystick_get_max_joysticks(joystickId) > i);
}
}
@@ -283,9 +278,8 @@ get_axis(JoystickConfiguration &jc, int axis, int joystick_nr)
int axis_sel = jc.selectedAxis(axis);
int nr_axes = plat_joystick_state[joystick_state[0][joystick_nr].plat_joystick_nr - 1].nr_axes;
if (axis_sel < nr_axes) {
if (axis_sel < nr_axes)
return axis_sel;
}
axis_sel -= nr_axes;
if (axis_sel & 1)

View File

@@ -26,17 +26,20 @@ public slots:
void onCurrentMachineChanged(int machineId);
private slots:
void on_pushButtonConfigureMouse_clicked();
void on_comboBoxJoystick_currentIndexChanged(int index);
void on_comboBoxMouse_currentIndexChanged(int index);
void on_pushButtonConfigureMouse_clicked();
void on_comboBoxJoystick_currentIndexChanged(int index);
void on_pushButtonJoystick1_clicked();
void on_pushButtonJoystick2_clicked();
void on_pushButtonJoystick3_clicked();
void on_pushButtonJoystick4_clicked();
void on_tableKeys_cellDoubleClicked(int row, int col);
void on_tableKeys_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn);
void on_pushButtonBind_clicked();
void on_pushButtonClearBind_clicked();
void on_pushButtonBind_clicked();
private:
Ui::SettingsInput *ui;

View File

@@ -23,6 +23,13 @@
<property name="rightMargin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="labelMouse">
<property name="text">
<string>Mouse:</string>
</property>
</widget>
</item>
<item row="0" column="1" colspan="2">
<widget class="QComboBox" name="comboBoxMouse">
<property name="sizePolicy">
@@ -36,75 +43,6 @@
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QPushButton" name="pushButtonJoystick4">
<property name="text">
<string>Joystick 4...</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QPushButton" name="pushButtonJoystick3">
<property name="text">
<string>Joystick 3...</string>
</property>
</widget>
</item>
<item row="5" column="3">
<widget class="QPushButton" name="pushButtonBind">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Bind</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QPushButton" name="pushButtonJoystick1">
<property name="text">
<string>Joystick 1...</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="2">
<widget class="QComboBox" name="comboBoxJoystick">
<property name="maxVisibleItems">
<number>30</number>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Mouse:</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QPushButton" name="pushButtonClearBind">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Clear binding</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Joystick:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="pushButtonJoystick2">
<property name="text">
<string>Joystick 2...</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QPushButton" name="pushButtonConfigureMouse">
<property name="sizePolicy">
@@ -118,8 +56,50 @@
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labelJoystick">
<property name="text">
<string>Joystick:</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="2">
<widget class="QComboBox" name="comboBoxJoystick">
<property name="maxVisibleItems">
<number>30</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QPushButton" name="pushButtonJoystick1">
<property name="text">
<string>Joystick 1...</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="pushButtonJoystick2">
<property name="text">
<string>Joystick 2...</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QPushButton" name="pushButtonJoystick3">
<property name="text">
<string>Joystick 3...</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QPushButton" name="pushButtonJoystick4">
<property name="text">
<string>Joystick 4...</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_3">
<widget class="QLabel" name="labelKeys">
<property name="text">
<string>Key Bindings:</string>
</property>
@@ -144,6 +124,26 @@
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QPushButton" name="pushButtonClearBind">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Clear binding</string>
</property>
</widget>
</item>
<item row="5" column="3">
<widget class="QPushButton" name="pushButtonBind">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Bind</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>

View File

@@ -358,4 +358,4 @@ void SettingsMachine::on_checkBoxFPUSoftfloat_stateChanged(int state) {
ui->softFloatWarningIcon->setVisible(false);
ui->softFloatWarningText->setVisible(false);
}
}
}

View File

@@ -18,22 +18,13 @@ public:
signals:
void currentMachineChanged(int machineId);
private slots:
void on_pushButtonConfigure_clicked();
private slots:
void on_comboBoxFPU_currentIndexChanged(int index);
private slots:
void on_comboBoxSpeed_currentIndexChanged(int index);
private slots:
void on_comboBoxCPU_currentIndexChanged(int index);
private slots:
void on_comboBoxMachine_currentIndexChanged(int index);
private slots:
void on_comboBoxMachineType_currentIndexChanged(int index);
void on_checkBoxFPUSoftfloat_stateChanged(int state);

View File

@@ -41,6 +41,7 @@
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="1">
<widget class="QComboBox" name="comboBoxMachineType">
<property name="maxVisibleItems">
@@ -48,6 +49,7 @@
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
@@ -55,6 +57,7 @@
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
@@ -62,6 +65,7 @@
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="comboBoxFPU">
<property name="maxVisibleItems">
@@ -69,6 +73,7 @@
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QSpinBox" name="spinBoxRAM">
<property name="sizePolicy">
@@ -79,6 +84,7 @@
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
@@ -86,6 +92,7 @@
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
@@ -93,6 +100,7 @@
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QWidget" name="widget_2" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
@@ -121,6 +129,7 @@
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_7">
<property name="text">
@@ -131,6 +140,7 @@
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="comboBoxSpeed">
<property name="sizePolicy">
@@ -147,6 +157,7 @@
</layout>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
@@ -154,6 +165,7 @@
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
@@ -161,6 +173,7 @@
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QWidget" name="widget_3" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_2">
@@ -183,6 +196,7 @@
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButtonConfigure">
<property name="sizePolicy">
@@ -199,6 +213,7 @@
</layout>
</widget>
</item>
<item row="4" column="1">
<widget class="QWidget" name="widget_4" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_3">
@@ -253,6 +268,7 @@
</layout>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="dynamicRecompilerLayout">
<item>
@@ -270,6 +286,7 @@
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="softFloatLayout">
<item>
@@ -285,6 +302,7 @@
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="softFloatWarningIcon">
<property name="text">
@@ -292,6 +310,7 @@
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="softFloatWarningText">
<property name="text">
@@ -314,6 +333,7 @@
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="sizePolicy">

View File

@@ -36,17 +36,17 @@ SettingsNetwork::enableElements(Ui::SettingsNetwork *ui)
auto *nic_cbox = findChild<QComboBox *>(QString("comboBoxNIC%1").arg(i + 1));
auto *net_type_cbox = findChild<QComboBox *>(QString("comboBoxNet%1").arg(i + 1));
auto *intf_label = findChild<QLabel *>(QString("interfaceLabel%1").arg(i + 1));
auto *intf_label = findChild<QLabel *>(QString("labelIntf%1").arg(i + 1));
auto *intf_cbox = findChild<QComboBox *>(QString("comboBoxIntf%1").arg(i + 1));
auto *conf_btn = findChild<QPushButton *>(QString("pushButtonConf%1").arg(i + 1));
// auto *net_type_conf_btn = findChild<QPushButton *>(QString("pushButtonNetTypeConf%1").arg(i + 1));
auto *vde_socket_label = findChild<QLabel *>(QString("socketVDELabel%1").arg(i + 1));
auto *vde_socket_label = findChild<QLabel *>(QString("labelSocketVDENIC%1").arg(i + 1));
auto *socket_line = findChild<QLineEdit *>(QString("socketVDENIC%1").arg(i + 1));
auto *option_list_label = findChild<QLabel *>(QString("optionListLabel%1").arg(i + 1));
auto *option_list_line = findChild<QWidget *>(QString("optionListLine%1").arg(i + 1));
auto *option_list_label = findChild<QLabel *>(QString("labelOptionList%1").arg(i + 1));
auto *option_list_line = findChild<QWidget *>(QString("lineOptionList%1").arg(i + 1));
intf_cbox->setEnabled(net_type_cbox->currentData().toInt() == NET_TYPE_PCAP);
conf_btn->setEnabled(network_card_has_config(nic_cbox->currentData().toInt()));
@@ -56,7 +56,6 @@ SettingsNetwork::enableElements(Ui::SettingsNetwork *ui)
option_list_label->setVisible(false);
option_list_line->setVisible(false);
// VDE
vde_socket_label->setVisible(false);
socket_line->setVisible(false);
@@ -70,21 +69,26 @@ SettingsNetwork::enableElements(Ui::SettingsNetwork *ui)
// Then only enable as needed based on network type
switch (net_type_cbox->currentData().toInt()) {
case NET_TYPE_VDE:
// option_list_label->setText("VDE Options");
// option_list_label->setText("VDE Options");
option_list_label->setVisible(true);
option_list_line->setVisible(true);
vde_socket_label->setVisible(true);
socket_line->setVisible(true);
break;
case NET_TYPE_PCAP:
// option_list_label->setText("PCAP Options");
// option_list_label->setText("PCAP Options");
option_list_label->setVisible(true);
option_list_line->setVisible(true);
intf_cbox->setVisible(true);
intf_label->setVisible(true);
break;
case NET_TYPE_SLIRP:
default:
break;
}
}
}
@@ -124,11 +128,10 @@ SettingsNetwork::save()
net_cards_conf[i].net_type = cbox->currentData().toInt();
cbox = findChild<QComboBox *>(QString("comboBoxIntf%1").arg(i + 1));
memset(net_cards_conf[i].host_dev_name, '\0', sizeof(net_cards_conf[i].host_dev_name));
if (net_cards_conf[i].net_type == NET_TYPE_PCAP) {
if (net_cards_conf[i].net_type == NET_TYPE_PCAP)
strncpy(net_cards_conf[i].host_dev_name, network_devs[cbox->currentData().toInt()].device, sizeof(net_cards_conf[i].host_dev_name) - 1);
} else if (net_cards_conf[i].net_type == NET_TYPE_VDE) {
else if (net_cards_conf[i].net_type == NET_TYPE_VDE)
strncpy(net_cards_conf[i].host_dev_name, socket_line->text().toUtf8().constData(), sizeof(net_cards_conf[i].host_dev_name));
}
}
}
@@ -141,7 +144,7 @@ SettingsNetwork::onCurrentMachineChanged(int machineId)
int selectedRow = 0;
// Network Card
QComboBox * cbox_[NET_CARD_MAX] = { 0 };
QComboBox *cbox_[NET_CARD_MAX] = { 0 };
QAbstractItemModel *models[NET_CARD_MAX] = { 0 };
int removeRows_[NET_CARD_MAX] = { 0 };
int selectedRows[NET_CARD_MAX] = { 0 };
@@ -226,9 +229,8 @@ SettingsNetwork::onCurrentMachineChanged(int machineId)
void
SettingsNetwork::on_comboIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
enableElements(ui);
}
@@ -236,8 +238,8 @@ SettingsNetwork::on_comboIndexChanged(int index)
void
SettingsNetwork::on_pushButtonConf1_clicked()
{
int netCard = ui->comboBoxNIC1->currentData().toInt();
auto *device = network_card_getdevice(netCard);
int netCard = ui->comboBoxNIC1->currentData().toInt();
auto *device = network_card_getdevice(netCard);
if (netCard == NET_INTERNAL)
device = machine_get_net_device(machineId);
DeviceConfig::ConfigureDevice(device, 1);
@@ -246,23 +248,23 @@ SettingsNetwork::on_pushButtonConf1_clicked()
void
SettingsNetwork::on_pushButtonConf2_clicked()
{
int netCard = ui->comboBoxNIC2->currentData().toInt();
auto *device = network_card_getdevice(netCard);
int netCard = ui->comboBoxNIC2->currentData().toInt();
auto *device = network_card_getdevice(netCard);
DeviceConfig::ConfigureDevice(device, 2);
}
void
SettingsNetwork::on_pushButtonConf3_clicked()
{
int netCard = ui->comboBoxNIC3->currentData().toInt();
auto *device = network_card_getdevice(netCard);
int netCard = ui->comboBoxNIC3->currentData().toInt();
auto *device = network_card_getdevice(netCard);
DeviceConfig::ConfigureDevice(device, 3);
}
void
SettingsNetwork::on_pushButtonConf4_clicked()
{
int netCard = ui->comboBoxNIC4->currentData().toInt();
auto *device = network_card_getdevice(netCard);
int netCard = ui->comboBoxNIC4->currentData().toInt();
auto *device = network_card_getdevice(netCard);
DeviceConfig::ConfigureDevice(device, 4);
}

View File

@@ -27,15 +27,29 @@
<number>0</number>
</property>
<item>
<widget class="QTabWidget" name="tabWidget">
<widget class="QTabWidget" name="tabWidgetNet">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab_1">
<widget class="QWidget" name="tabNet1">
<attribute name="title">
<string>Network Card #1</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_3">
<layout class="QGridLayout" name="gridLayoutNet1">
<item row="0" column="0">
<widget class="QLabel" name="labelMode1">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Mode:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBoxNet1">
<property name="maxVisibleItems">
@@ -50,7 +64,7 @@
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_7">
<widget class="QLabel" name="labelAdapter1">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -62,79 +76,6 @@
</property>
</widget>
</item>
<item row="6" column="1">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Mode:</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="Line" name="optionListLine1">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="pushButtonConf1">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="optionListLabel1">
<property name="text">
<string>Options</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="interfaceLabel1">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Interface:</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="socketVDELabel1">
<property name="text">
<string>VDE Socket:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="comboBoxNIC1">
<property name="sizePolicy">
@@ -151,10 +92,43 @@
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="socketVDENIC1">
<property name="maxLength">
<number>127</number>
<item row="1" column="2">
<widget class="QPushButton" name="pushButtonConf1">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="labelOptionList1">
<property name="text">
<string>Options</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="Line" name="lineOptionList1">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="labelIntf1">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Interface:</string>
</property>
</widget>
</item>
@@ -168,15 +142,22 @@
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>Network Card #2</string>
</attribute>
<layout class="QGridLayout" name="gridLayout">
<item row="5" column="0">
<widget class="QLabel" name="labelSocketVDENIC1">
<property name="text">
<string>VDE Socket:</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="socketVDENIC1">
<property name="maxLength">
<number>127</number>
</property>
</widget>
</item>
<item row="6" column="1">
<spacer name="verticalSpacer">
<spacer name="verticalSpacerNIC1">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
@@ -188,28 +169,16 @@
</property>
</spacer>
</item>
<item row="3" column="0">
<widget class="QLabel" name="interfaceLabel2">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Interface:</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="optionListLabel2">
<property name="text">
<string>Options</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tabNet2">
<attribute name="title">
<string>Network Card #2</string>
</attribute>
<layout class="QGridLayout" name="gridLayoutNet2">
<item row="0" column="0">
<widget class="QLabel" name="label_8">
<widget class="QLabel" name="labelMode2">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -234,22 +203,8 @@
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="socketVDELabel2">
<property name="text">
<string>VDE Socket:</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="Line" name="optionListLine2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_10">
<widget class="QLabel" name="labelAdapter2">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -261,6 +216,22 @@
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="comboBoxNIC2">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
</property>
<property name="maxVisibleItems">
<number>30</number>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="pushButtonConf2">
<property name="sizePolicy">
@@ -274,25 +245,33 @@
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="comboBoxNIC2">
<property name="maxVisibleItems">
<number>30</number>
<item row="2" column="0">
<widget class="QLabel" name="labelOptionList2">
<property name="text">
<string>Options</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="Line" name="lineOptionList2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="labelIntf2">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
<property name="text">
<string>Interface:</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="socketVDENIC2"/>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="comboBoxIntf2">
<property name="sizePolicy">
@@ -303,13 +282,54 @@
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="labelSocketVDENIC2">
<property name="text">
<string>VDE Socket:</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="socketVDENIC2">
<property name="maxLength">
<number>127</number>
</property>
</widget>
</item>
<item row="6" column="1">
<spacer name="verticalSpacerNIC2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_3">
<widget class="QWidget" name="tabNet3">
<attribute name="title">
<string>Network Card #3</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_2">
<layout class="QGridLayout" name="gridLayoutNet3">
<item row="0" column="0">
<widget class="QLabel" name="labelMode3">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Mode:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBoxNet3">
<property name="maxVisibleItems">
@@ -323,17 +343,16 @@
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="socketVDELabel3">
<property name="text">
<string>VDE Socket:</string>
<item row="1" column="0">
<widget class="QLabel" name="labelAdapter3">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="optionListLabel3">
<property name="text">
<string>Options</string>
<string>Adapter:</string>
</property>
</widget>
</item>
@@ -353,39 +372,6 @@
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="interfaceLabel3">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Interface:</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="Line" name="optionListLine3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_11">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Mode:</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="pushButtonConf3">
<property name="sizePolicy">
@@ -399,8 +385,22 @@
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_13">
<item row="2" column="0">
<widget class="QLabel" name="labelOptionList3">
<property name="text">
<string>Options</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="Line" name="lineOptionList3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="labelIntf3">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -408,13 +408,10 @@
</sizepolicy>
</property>
<property name="text">
<string>Adapter:</string>
<string>Interface:</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="socketVDENIC3"/>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="comboBoxIntf3">
<property name="sizePolicy">
@@ -425,8 +422,22 @@
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="labelSocketVDENIC3">
<property name="text">
<string>VDE Socket:</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="socketVDENIC3">
<property name="maxLength">
<number>127</number>
</property>
</widget>
</item>
<item row="6" column="1">
<spacer name="verticalSpacer_3">
<spacer name="verticalSpacerNIC3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
@@ -440,20 +451,14 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_4">
<widget class="QWidget" name="tabNet4">
<attribute name="title">
<string>Network Card #4</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_4">
<item row="2" column="0">
<widget class="QLabel" name="optionListLabel4">
<property name="text">
<string>Options</string>
</property>
</widget>
</item>
<layout class="QGridLayout" name="gridLayoutNet4">
<item row="0" column="0">
<widget class="QLabel" name="label_14">
<widget class="QLabel" name="labelMode4">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -465,28 +470,21 @@
</property>
</widget>
</item>
<item row="6" column="1">
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
<item row="0" column="1">
<widget class="QComboBox" name="comboBoxNet4">
<property name="maxVisibleItems">
<number>30</number>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="5" column="0">
<widget class="QLabel" name="socketVDELabel4">
<property name="text">
<string>VDE Socket:</string>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_16">
<widget class="QLabel" name="labelAdapter4">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -498,26 +496,6 @@
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="Line" name="optionListLine4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="interfaceLabel4">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Interface:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="comboBoxNIC4">
<property name="sizePolicy">
@@ -534,19 +512,6 @@
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBoxNet4">
<property name="maxVisibleItems">
<number>30</number>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="pushButtonConf4">
<property name="sizePolicy">
@@ -560,8 +525,32 @@
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="socketVDENIC4"/>
<item row="2" column="0">
<widget class="QLabel" name="labelOptionList4">
<property name="text">
<string>Options</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="Line" name="lineOptionList4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="labelIntf4">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Interface:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="comboBoxIntf4">
@@ -573,8 +562,36 @@
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="labelSocketVDENIC4">
<property name="text">
<string>VDE Socket:</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="socketVDENIC4">
<property name="maxLength">
<number>127</number>
</property>
</widget>
</item>
<item row="6" column="1">
<spacer name="verticalSpacerNIC4">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>

View File

@@ -11,8 +11,10 @@
*
*
* Authors: Joakim L. Gilje <jgilje@jgilje.net>
* Jasmine Iwanek <jriwanek@gmail.com>
*
* Copyright 2021 Joakim L. Gilje
* Copyright 2025 Jasmine Iwanek
*/
#include "qt_settingsotherperipherals.hpp"
#include "ui_qt_settingsotherperipherals.h"
@@ -22,6 +24,7 @@ extern "C" {
#include <86box/device.h>
#include <86box/machine.h>
#include <86box/isamem.h>
#include <86box/isarom.h>
#include <86box/isartc.h>
#include <86box/unittester.h>
#include <86box/novell_cardkey.h>
@@ -44,84 +47,131 @@ SettingsOtherPeripherals::onCurrentMachineChanged(int machineId)
this->machineId = machineId;
bool machineHasIsa = (machine_has_bus(machineId, MACHINE_BUS_ISA) > 0);
ui->pushButtonConfigureRTC->setEnabled(machineHasIsa);
ui->comboBoxRTC->setEnabled(machineHasIsa);
ui->checkBoxISABugger->setEnabled(machineHasIsa);
ui->pushButtonConfigureUT->setEnabled(unittester_enabled > 0);
ui->checkBoxKeyCard->setEnabled(machineHasIsa);
ui->pushButtonConfigureKeyCard->setEnabled(novell_keycard_enabled > 0);
ui->checkBoxISABugger->setChecked((machineHasIsa && (bugger_enabled > 0)) ? true : false);
ui->checkBoxPOSTCard->setChecked(postcard_enabled > 0 ? true : false);
ui->checkBoxUnitTester->setChecked(unittester_enabled > 0 ? true : false);
ui->checkBoxKeyCard->setChecked((machineHasIsa && (novell_keycard_enabled > 0)) ? true : false);
ui->checkBoxISABugger->setEnabled(machineHasIsa);
ui->checkBoxKeyCard->setEnabled(machineHasIsa);
ui->pushButtonConfigureKeyCard->setEnabled(novell_keycard_enabled > 0);
ui->pushButtonConfigureUT->setEnabled(unittester_enabled > 0);
ui->comboBoxRTC->setEnabled(machineHasIsa);
ui->pushButtonConfigureRTC->setEnabled(machineHasIsa);
ui->comboBoxCard1->clear();
ui->comboBoxCard2->clear();
ui->comboBoxCard3->clear();
ui->comboBoxCard4->clear();
ui->comboBoxRTC->clear();
auto *model = ui->comboBoxRTC->model();
int d = 0;
for (uint8_t i = 0; i < ISAMEM_MAX; ++i)
if (auto *cb = findChild<QComboBox *>(QString("comboBoxIsaMemCard%1").arg(i + 1)))
cb->clear();
for (uint8_t i = 0; i < ISAROM_MAX; ++i)
if (auto *cb = findChild<QComboBox *>(QString("comboBoxIsaRomCard%1").arg(i + 1)))
cb->clear();
int c = 0;
int selectedRow = 0;
// ISA RTC Cards
auto *model = ui->comboBoxRTC->model();
while (true) {
QString name = DeviceConfig::DeviceName(isartc_get_device(d), isartc_get_internal_name(d), 0);
if (name.isEmpty()) {
const QString name = DeviceConfig::DeviceName(isartc_get_device(c), isartc_get_internal_name(c), 0);
if (name.isEmpty())
break;
}
if (!device_is_valid(isartc_get_device(d), machineId)) {
if (!device_is_valid(isartc_get_device(c), machineId))
break;
}
int row = Models::AddEntry(model, name, d);
if (d == isartc_type) {
int row = Models::AddEntry(model, name, c);
if (c == isartc_type)
selectedRow = row;
}
++d;
++c;
}
ui->comboBoxRTC->setCurrentIndex(selectedRow);
ui->pushButtonConfigureRTC->setEnabled((isartc_type != 0) && isartc_has_config(isartc_type) && machineHasIsa);
// ISA Memory Expansion Card
QComboBox * cbox[ISAMEM_MAX] = { 0 };
QAbstractItemModel *models[ISAMEM_MAX] = { 0 };
int removeRows_[ISAMEM_MAX] = { 0 };
int selectedRows[ISAMEM_MAX] = { 0 };
// ISA Memory Expansion Cards
QComboBox *isamem_cbox[ISAMEM_MAX] = { 0 };
QAbstractItemModel *isamem_models[ISAMEM_MAX] = { 0 };
int isamem_removeRows_[ISAMEM_MAX] = { 0 };
int isamem_selectedRows[ISAMEM_MAX] = { 0 };
for (uint8_t c = 0; c < ISAMEM_MAX; ++c) {
cbox[c] = findChild<QComboBox *>(QString("comboBoxCard%1").arg(c + 1));
models[c] = cbox[c]->model();
removeRows_[c] = models[c]->rowCount();
for (uint8_t i = 0; i < ISAMEM_MAX; ++i) {
isamem_cbox[i] = findChild<QComboBox *>(QString("comboBoxIsaMemCard%1").arg(i + 1));
isamem_models[i] = isamem_cbox[i]->model();
isamem_removeRows_[i] = isamem_models[i]->rowCount();
}
d = 0;
c = 0;
while (true) {
const QString name = DeviceConfig::DeviceName(isamem_get_device(d),
isamem_get_internal_name(d), 0);
const QString name = DeviceConfig::DeviceName(isamem_get_device(c),
isamem_get_internal_name(c), 0);
if (name.isEmpty())
break;
if (device_is_valid(isamem_get_device(d), machineId)) {
for (uint8_t c = 0; c < ISAMEM_MAX; ++c) {
int row = Models::AddEntry(models[c], name, d);
if (device_is_valid(isamem_get_device(c), machineId)) {
for (uint8_t i = 0; i < ISAMEM_MAX; ++i) {
int row = Models::AddEntry(isamem_models[i], name, c);
if (d == isamem_type[c])
selectedRows[c] = row - removeRows_[c];
if (c == isamem_type[i])
isamem_selectedRows[i] = row - isamem_removeRows_[i];
}
}
d++;
c++;
}
for (uint8_t c = 0; c < ISAMEM_MAX; ++c) {
models[c]->removeRows(0, removeRows_[c]);
cbox[c]->setEnabled(models[c]->rowCount() > 1);
cbox[c]->setCurrentIndex(-1);
cbox[c]->setCurrentIndex(selectedRows[c]);
findChild<QPushButton *>(QString("pushButtonConfigureCard%1").arg(c + 1))->setEnabled((isamem_type[c] != 0) &&
isamem_has_config(isamem_type[c]) && machineHasIsa);
for (uint8_t i = 0; i < ISAMEM_MAX; ++i) {
isamem_models[i]->removeRows(0, isamem_removeRows_[i]);
isamem_cbox[i]->setEnabled(isamem_models[i]->rowCount() > 1);
isamem_cbox[i]->setCurrentIndex(-1);
isamem_cbox[i]->setCurrentIndex(isamem_selectedRows[i]);
findChild<QPushButton *>(QString("pushButtonConfigureIsaMemCard%1").arg(i + 1))->setEnabled((isamem_type[i] != 0) &&
isamem_has_config(isamem_type[i]) && machineHasIsa);
}
// ISA ROM Expansion Cards
QComboBox *isarom_cbox[ISAROM_MAX] = { 0 };
QAbstractItemModel *isarom_models[ISAROM_MAX] = { 0 };
int isarom_removeRows_[ISAROM_MAX] = { 0 };
int isarom_selectedRows[ISAROM_MAX] = { 0 };
for (uint8_t i = 0; i < ISAROM_MAX; ++i) {
isarom_cbox[i] = findChild<QComboBox *>(QString("comboBoxIsaRomCard%1").arg(i + 1));
isarom_models[i] = isarom_cbox[i]->model();
isarom_removeRows_[i] = isarom_models[i]->rowCount();
}
c = 0;
while (true) {
const QString name = DeviceConfig::DeviceName(isarom_get_device(c),
isarom_get_internal_name(c), 0);
if (name.isEmpty())
break;
if (device_is_valid(isarom_get_device(c), machineId)) {
for (uint8_t i = 0; i < ISAROM_MAX; ++i) {
int row = Models::AddEntry(isarom_models[i], name, c);
if (c == isarom_type[i])
isarom_selectedRows[i] = row - isarom_removeRows_[i];
}
}
c++;
}
for (uint8_t i = 0; i < ISAROM_MAX; ++i) {
isarom_models[i]->removeRows(0, isarom_removeRows_[i]);
isarom_cbox[i]->setEnabled(isarom_models[i]->rowCount() > 1);
isarom_cbox[i]->setCurrentIndex(-1);
isarom_cbox[i]->setCurrentIndex(isarom_selectedRows[i]);
findChild<QPushButton *>(QString("pushButtonConfigureIsaRomCard%1").arg(i + 1))->setEnabled((isarom_type[i] != 0) &&
isarom_has_config(isarom_type[i]) && machineHasIsa);
}
}
@@ -134,25 +184,31 @@ void
SettingsOtherPeripherals::save()
{
/* Other peripherals category */
isartc_type = ui->comboBoxRTC->currentData().toInt();
bugger_enabled = ui->checkBoxISABugger->isChecked() ? 1 : 0;
postcard_enabled = ui->checkBoxPOSTCard->isChecked() ? 1 : 0;
unittester_enabled = ui->checkBoxUnitTester->isChecked() ? 1 : 0;
novell_keycard_enabled = ui->checkBoxKeyCard->isChecked() ? 1 : 0;
isartc_type = ui->comboBoxRTC->currentData().toInt();
/* ISA memory boards. */
for (int i = 0; i < ISAMEM_MAX; i++) {
auto *cbox = findChild<QComboBox *>(QString("comboBoxCard%1").arg(i + 1));
auto *cbox = findChild<QComboBox *>(QString("comboBoxIsaMemCard%1").arg(i + 1));
isamem_type[i] = cbox->currentData().toInt();
}
/* ISA ROM boards. */
for (int i = 0; i < ISAROM_MAX; i++) {
auto *cbox = findChild<QComboBox *>(QString("comboBoxIsaRomCard%1").arg(i + 1));
isarom_type[i] = cbox->currentData().toInt();
}
}
void
SettingsOtherPeripherals::on_comboBoxRTC_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
ui->pushButtonConfigureRTC->setEnabled((index != 0) && isartc_has_config(index) && machine_has_bus(machineId, MACHINE_BUS_ISA));
}
@@ -163,63 +219,123 @@ SettingsOtherPeripherals::on_pushButtonConfigureRTC_clicked()
}
void
SettingsOtherPeripherals::on_comboBoxCard1_currentIndexChanged(int index)
SettingsOtherPeripherals::on_comboBoxIsaMemCard1_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
ui->pushButtonConfigureCard1->setEnabled((index != 0) && isamem_has_config(index) && machine_has_bus(machineId, MACHINE_BUS_ISA));
ui->pushButtonConfigureIsaMemCard1->setEnabled((index != 0) && isamem_has_config(index) && machine_has_bus(machineId, MACHINE_BUS_ISA));
}
void
SettingsOtherPeripherals::on_pushButtonConfigureCard1_clicked()
SettingsOtherPeripherals::on_pushButtonConfigureIsaMemCard1_clicked()
{
DeviceConfig::ConfigureDevice(isamem_get_device(ui->comboBoxCard1->currentData().toInt()), 1);
DeviceConfig::ConfigureDevice(isamem_get_device(ui->comboBoxIsaMemCard1->currentData().toInt()), 1);
}
void
SettingsOtherPeripherals::on_comboBoxCard2_currentIndexChanged(int index)
SettingsOtherPeripherals::on_comboBoxIsaMemCard2_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
ui->pushButtonConfigureCard2->setEnabled((index != 0) && isamem_has_config(index) && machine_has_bus(machineId, MACHINE_BUS_ISA));
ui->pushButtonConfigureIsaMemCard2->setEnabled((index != 0) && isamem_has_config(index) && machine_has_bus(machineId, MACHINE_BUS_ISA));
}
void
SettingsOtherPeripherals::on_pushButtonConfigureCard2_clicked()
SettingsOtherPeripherals::on_pushButtonConfigureIsaMemCard2_clicked()
{
DeviceConfig::ConfigureDevice(isamem_get_device(ui->comboBoxCard2->currentData().toInt()), 2);
DeviceConfig::ConfigureDevice(isamem_get_device(ui->comboBoxIsaMemCard2->currentData().toInt()), 2);
}
void
SettingsOtherPeripherals::on_comboBoxCard3_currentIndexChanged(int index)
SettingsOtherPeripherals::on_comboBoxIsaMemCard3_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
ui->pushButtonConfigureCard3->setEnabled((index != 0) && isamem_has_config(index) && machine_has_bus(machineId, MACHINE_BUS_ISA));
ui->pushButtonConfigureIsaMemCard3->setEnabled((index != 0) && isamem_has_config(index) && machine_has_bus(machineId, MACHINE_BUS_ISA));
}
void
SettingsOtherPeripherals::on_pushButtonConfigureCard3_clicked()
SettingsOtherPeripherals::on_pushButtonConfigureIsaMemCard3_clicked()
{
DeviceConfig::ConfigureDevice(isamem_get_device(ui->comboBoxCard3->currentData().toInt()), 3);
DeviceConfig::ConfigureDevice(isamem_get_device(ui->comboBoxIsaMemCard3->currentData().toInt()), 3);
}
void
SettingsOtherPeripherals::on_comboBoxCard4_currentIndexChanged(int index)
SettingsOtherPeripherals::on_comboBoxIsaMemCard4_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
ui->pushButtonConfigureCard4->setEnabled((index != 0) && isamem_has_config(index) && machine_has_bus(machineId, MACHINE_BUS_ISA));
ui->pushButtonConfigureIsaMemCard4->setEnabled((index != 0) && isamem_has_config(index) && machine_has_bus(machineId, MACHINE_BUS_ISA));
}
void
SettingsOtherPeripherals::on_pushButtonConfigureCard4_clicked()
SettingsOtherPeripherals::on_pushButtonConfigureIsaMemCard4_clicked()
{
DeviceConfig::ConfigureDevice(isamem_get_device(ui->comboBoxCard4->currentData().toInt()), 4);
DeviceConfig::ConfigureDevice(isamem_get_device(ui->comboBoxIsaMemCard4->currentData().toInt()), 4);
}
void
SettingsOtherPeripherals::on_comboBoxIsaRomCard1_currentIndexChanged(int index)
{
if (index < 0)
return;
ui->pushButtonConfigureIsaRomCard1->setEnabled((index != 0) && isarom_has_config(index) && machine_has_bus(machineId, MACHINE_BUS_ISA));
}
void
SettingsOtherPeripherals::on_pushButtonConfigureIsaRomCard1_clicked()
{
DeviceConfig::ConfigureDevice(isarom_get_device(ui->comboBoxIsaRomCard1->currentData().toInt()), 1);
}
void
SettingsOtherPeripherals::on_comboBoxIsaRomCard2_currentIndexChanged(int index)
{
if (index < 0)
return;
ui->pushButtonConfigureIsaRomCard2->setEnabled((index != 0) && isarom_has_config(index) && machine_has_bus(machineId, MACHINE_BUS_ISA));
}
void
SettingsOtherPeripherals::on_pushButtonConfigureIsaRomCard2_clicked()
{
DeviceConfig::ConfigureDevice(isarom_get_device(ui->comboBoxIsaRomCard2->currentData().toInt()), 2);
}
void
SettingsOtherPeripherals::on_comboBoxIsaRomCard3_currentIndexChanged(int index)
{
if (index < 0)
return;
ui->pushButtonConfigureIsaRomCard3->setEnabled((index != 0) && isarom_has_config(index) && machine_has_bus(machineId, MACHINE_BUS_ISA));
}
void
SettingsOtherPeripherals::on_pushButtonConfigureIsaRomCard3_clicked()
{
DeviceConfig::ConfigureDevice(isarom_get_device(ui->comboBoxIsaRomCard3->currentData().toInt()), 3);
}
void
SettingsOtherPeripherals::on_comboBoxIsaRomCard4_currentIndexChanged(int index)
{
if (index < 0)
return;
ui->pushButtonConfigureIsaRomCard4->setEnabled((index != 0) && isarom_has_config(index) && machine_has_bus(machineId, MACHINE_BUS_ISA));
}
void
SettingsOtherPeripherals::on_pushButtonConfigureIsaRomCard4_clicked()
{
DeviceConfig::ConfigureDevice(isarom_get_device(ui->comboBoxIsaRomCard4->currentData().toInt()), 4);
}
void
@@ -234,13 +350,12 @@ SettingsOtherPeripherals::on_pushButtonConfigureUT_clicked()
DeviceConfig::ConfigureDevice(&unittester_device);
}
void SettingsOtherPeripherals::on_pushButtonConfigureKeyCard_clicked()
{
DeviceConfig::ConfigureDevice(&novell_keycard_device);
}
void SettingsOtherPeripherals::on_checkBoxKeyCard_stateChanged(int arg1)
{
ui->pushButtonConfigureKeyCard->setEnabled(arg1 != 0);
}
void SettingsOtherPeripherals::on_pushButtonConfigureKeyCard_clicked()
{
DeviceConfig::ConfigureDevice(&novell_keycard_device);
}

View File

@@ -20,22 +20,32 @@ public slots:
void onCurrentMachineChanged(int machineId);
private slots:
void on_pushButtonConfigureCard4_clicked();
void on_comboBoxCard4_currentIndexChanged(int index);
void on_pushButtonConfigureCard3_clicked();
void on_comboBoxCard3_currentIndexChanged(int index);
void on_pushButtonConfigureCard2_clicked();
void on_comboBoxCard2_currentIndexChanged(int index);
void on_pushButtonConfigureCard1_clicked();
void on_comboBoxCard1_currentIndexChanged(int index);
void on_pushButtonConfigureRTC_clicked();
void on_comboBoxRTC_currentIndexChanged(int index);
void on_pushButtonConfigureRTC_clicked();
void on_comboBoxIsaMemCard1_currentIndexChanged(int index);
void on_pushButtonConfigureIsaMemCard1_clicked();
void on_comboBoxIsaMemCard2_currentIndexChanged(int index);
void on_pushButtonConfigureIsaMemCard2_clicked();
void on_comboBoxIsaMemCard3_currentIndexChanged(int index);
void on_pushButtonConfigureIsaMemCard3_clicked();
void on_comboBoxIsaMemCard4_currentIndexChanged(int index);
void on_pushButtonConfigureIsaMemCard4_clicked();
void on_comboBoxIsaRomCard1_currentIndexChanged(int index);
void on_pushButtonConfigureIsaRomCard1_clicked();
void on_comboBoxIsaRomCard2_currentIndexChanged(int index);
void on_pushButtonConfigureIsaRomCard2_clicked();
void on_comboBoxIsaRomCard3_currentIndexChanged(int index);
void on_pushButtonConfigureIsaRomCard3_clicked();
void on_comboBoxIsaRomCard4_currentIndexChanged(int index);
void on_pushButtonConfigureIsaRomCard4_clicked();
void on_checkBoxUnitTester_stateChanged(int arg1);
void on_pushButtonConfigureUT_clicked();
void on_pushButtonConfigureKeyCard_clicked();
void on_checkBoxKeyCard_stateChanged(int arg1);
void on_pushButtonConfigureKeyCard_clicked();
private:
Ui::SettingsOtherPeripherals *ui;

View File

@@ -27,9 +27,9 @@
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<layout class="QHBoxLayout" name="horizontalLayoutRtc">
<item>
<widget class="QLabel" name="label">
<widget class="QLabel" name="labelRtc">
<property name="text">
<string>ISA RTC:</string>
</property>
@@ -58,20 +58,74 @@
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<widget class="QGroupBox" name="groupBoxMem">
<property name="title">
<string>ISA Memory Expansion</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="2">
<widget class="QPushButton" name="pushButtonConfigureCard2">
<layout class="QGridLayout" name="gridLayoutMem">
<item row="0" column="0">
<widget class="QLabel" name="labelIsaMemCard1">
<property name="text">
<string>Card 1:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBoxIsaMemCard1">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maxVisibleItems">
<number>30</number>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="pushButtonConfigureIsaMemCard1">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labelIsaMemCard2">
<property name="text">
<string>Card 2:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="comboBoxCard2">
<widget class="QComboBox" name="comboBoxIsaMemCard2">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maxVisibleItems">
<number>30</number>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="pushButtonConfigureIsaMemCard2">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="labelIsaMemCard3">
<property name="text">
<string>Card 3:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="comboBoxIsaMemCard3">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
@@ -84,68 +138,21 @@
</widget>
</item>
<item row="2" column="2">
<widget class="QPushButton" name="pushButtonConfigureCard3">
<widget class="QPushButton" name="pushButtonConfigureIsaMemCard3">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<item row="3" column="0">
<widget class="QLabel" name="labelIsaMemCard4">
<property name="text">
<string>Card 2:</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Card 3:</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="pushButtonConfigureCard1">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBoxCard1">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maxVisibleItems">
<number>30</number>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Card 1:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="comboBoxCard3">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maxVisibleItems">
<number>30</number>
<string>Card 4:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="comboBoxCard4">
<widget class="QComboBox" name="comboBoxIsaMemCard4">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
@@ -158,24 +165,134 @@
</widget>
</item>
<item row="3" column="2">
<widget class="QPushButton" name="pushButtonConfigureCard4">
<widget class="QPushButton" name="pushButtonConfigureIsaMemCard4">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Card 4:</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<widget class="QGroupBox" name="groupBoxRom">
<property name="title">
<string>ISA ROM Cards</string>
</property>
<layout class="QGridLayout" name="gridLayoutRom">
<item row="0" column="0">
<widget class="QLabel" name="labelIsaRomCard1">
<property name="text">
<string>Card 1:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBoxIsaRomCard1">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maxVisibleItems">
<number>30</number>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="pushButtonConfigureIsaRomCard1">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labelIsaRomCard2">
<property name="text">
<string>Card 2:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="comboBoxIsaRomCard2">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maxVisibleItems">
<number>30</number>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="pushButtonConfigureIsaRomCard2">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="labelIsaRomCard3">
<property name="text">
<string>Card 3:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="comboBoxIsaRomCard3">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maxVisibleItems">
<number>30</number>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QPushButton" name="pushButtonConfigureIsaRomCard3">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="labelIsaRomCard4">
<property name="text">
<string>Card 4:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="comboBoxIsaRomCard4">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maxVisibleItems">
<number>30</number>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QPushButton" name="pushButtonConfigureIsaRomCard4">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutIBPC">
<item>
<widget class="QCheckBox" name="checkBoxISABugger">
<property name="text">
@@ -193,7 +310,7 @@
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<layout class="QHBoxLayout" name="horizontalLayoutUT">
<item>
<widget class="QCheckBox" name="checkBoxUnitTester">
<property name="sizePolicy">
@@ -217,7 +334,7 @@
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<layout class="QHBoxLayout" name="horizontalLayoutKeyCard">
<property name="topMargin">
<number>0</number>
</property>

View File

@@ -21,33 +21,19 @@ public:
signals:
void moChannelChanged();
void zipChannelChanged();
private slots:
void on_checkBoxZIP250_stateChanged(int arg1);
private slots:
void on_comboBoxZIPChannel_activated(int index);
private slots:
void on_comboBoxZIPBus_activated(int index);
private slots:
void on_comboBoxZIPBus_currentIndexChanged(int index);
private slots:
void on_comboBoxMOType_activated(int index);
private slots:
void on_comboBoxMOChannel_activated(int index);
private slots:
void on_comboBoxMOBus_activated(int index);
private slots:
void on_comboBoxMOBus_currentIndexChanged(int index);
private slots:
void onMORowChanged(const QModelIndex &current);
void on_comboBoxMOBus_currentIndexChanged(int index);
void on_comboBoxMOBus_activated(int index);
void on_comboBoxMOChannel_activated(int index);
void on_comboBoxMOType_activated(int index);
void onZIPRowChanged(const QModelIndex &current);
void on_comboBoxZIPBus_currentIndexChanged(int index);
void on_comboBoxZIPBus_activated(int index);
void on_comboBoxZIPChannel_activated(int index);
void on_checkBoxZIP250_stateChanged(int arg1);
private:
Ui::SettingsOtherRemovable *ui;

View File

@@ -27,7 +27,7 @@
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label">
<widget class="QLabel" name="labelMO">
<property name="text">
<string>MO drives:</string>
</property>
@@ -68,19 +68,12 @@
<widget class="QWidget" name="moControls" native="true">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<widget class="QLabel" name="labelMOBus">
<property name="text">
<string>Bus:</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Channel:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBoxMOBus">
<property name="maxVisibleItems">
@@ -88,6 +81,13 @@
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="labelMOChannel">
<property name="text">
<string>Channel:</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QComboBox" name="comboBoxMOChannel">
<property name="maxVisibleItems">
@@ -96,7 +96,7 @@
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<widget class="QLabel" name="labelMOType">
<property name="text">
<string>Type:</string>
</property>
@@ -113,7 +113,7 @@
</widget>
</item>
<item>
<widget class="QLabel" name="label_6">
<widget class="QLabel" name="labelZIP">
<property name="text">
<string>ZIP drives:</string>
</property>
@@ -154,7 +154,7 @@
<widget class="QWidget" name="zipControls" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label_3">
<widget class="QLabel" name="labelZIPBus">
<property name="text">
<string>Bus:</string>
</property>
@@ -168,7 +168,7 @@
</widget>
</item>
<item>
<widget class="QLabel" name="label_5">
<widget class="QLabel" name="labelZIPChannel">
<property name="text">
<string>Channel:</string>
</property>

View File

@@ -51,7 +51,7 @@ SettingsPorts::save()
{
for (int i = 0; i < PARALLEL_MAX; i++) {
auto *cbox = findChild<QComboBox *>(QString("comboBoxLpt%1").arg(i + 1));
auto *checkBox = findChild<QCheckBox *>(QString("checkBoxParallel%1").arg(i + 1));
auto *checkBox = findChild<QCheckBox *>(QString("checkBoxParallel%1").arg(i + 1));
if (cbox != NULL)
lpt_ports[i].device = cbox->currentData().toInt();
if (checkBox != NULL)
@@ -73,7 +73,7 @@ SettingsPorts::onCurrentMachineChanged(int machineId)
{
this->machineId = machineId;
int c = 0;
int c = 0;
// LPT Device
QComboBox * cbox[PARALLEL_MAX] = { 0 };
@@ -93,7 +93,7 @@ SettingsPorts::onCurrentMachineChanged(int machineId)
if (lptName == nullptr)
break;
const QString name = tr(lptName);
const QString name = tr(lptName);
for (uint8_t i = 0; i < PARALLEL_MAX; ++i) {
int row = Models::AddEntry(models[i], name, c);

View File

@@ -35,22 +35,25 @@ private slots:
void on_checkBoxSerial7_stateChanged(int state);
#endif
void on_checkBoxSerialPassThru1_stateChanged(int state);
void on_pushButtonSerialPassThru1_clicked();
void on_checkBoxSerialPassThru2_stateChanged(int state);
void on_pushButtonSerialPassThru2_clicked();
void on_checkBoxSerialPassThru3_stateChanged(int state);
void on_pushButtonSerialPassThru3_clicked();
void on_checkBoxSerialPassThru4_stateChanged(int state);
void on_pushButtonSerialPassThru4_clicked();
#if 0
void on_checkBoxSerialPassThru5_stateChanged(int state);
void on_checkBoxSerialPassThru6_stateChanged(int state);
void on_checkBoxSerialPassThru7_stateChanged(int state);
#endif
void on_pushButtonSerialPassThru1_clicked();
void on_pushButtonSerialPassThru2_clicked();
void on_pushButtonSerialPassThru3_clicked();
void on_pushButtonSerialPassThru4_clicked();
#if 0
void on_pushButtonSerialPassThru5_clicked();
void on_checkBoxSerialPassThru6_stateChanged(int state);
void on_pushButtonSerialPassThru6_clicked();
void on_checkBoxSerialPassThru7_stateChanged(int state);
void on_pushButtonSerialPassThru7_clicked();
#endif

View File

@@ -29,7 +29,7 @@
<item row="0" column="0">
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<widget class="QLabel" name="labelLpt1">
<property name="text">
<string>LPT1 Device:</string>
</property>
@@ -43,7 +43,7 @@
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<widget class="QLabel" name="labelLpt2">
<property name="text">
<string>LPT2 Device:</string>
</property>
@@ -57,7 +57,7 @@
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<widget class="QLabel" name="labelLpt3">
<property name="text">
<string>LPT3 Device:</string>
</property>
@@ -71,7 +71,7 @@
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_4">
<widget class="QLabel" name="labelLpt4">
<property name="text">
<string>LPT4 Device:</string>
</property>
@@ -88,27 +88,6 @@
</item>
<item row="1" column="0">
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="1">
<widget class="QCheckBox" name="checkBoxParallel2">
<property name="text">
<string>Parallel port 2</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="checkBoxParallel3">
<property name="text">
<string>Parallel port 3</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="checkBoxSerial3">
<property name="text">
<string>Serial port 3</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="checkBoxSerial1">
<property name="text">
@@ -116,20 +95,6 @@
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="checkBoxParallel4">
<property name="text">
<string>Parallel port 4</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="checkBoxSerial2">
<property name="text">
<string>Serial port 2</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="checkBoxParallel1">
<property name="text">
@@ -137,6 +102,34 @@
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="checkBoxSerial2">
<property name="text">
<string>Serial port 2</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="checkBoxParallel2">
<property name="text">
<string>Parallel port 2</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="checkBoxSerial3">
<property name="text">
<string>Serial port 3</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="checkBoxParallel3">
<property name="text">
<string>Parallel port 3</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="checkBoxSerial4">
<property name="text">
@@ -144,13 +137,76 @@
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="checkBoxParallel4">
<property name="text">
<string>Parallel port 4</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="3" column="0">
<layout class="QGridLayout" name="gridLayout_5">
<layout class="QGridLayout" name="gridLayoutPassThru">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<item row="0" column="0">
<widget class="QCheckBox" name="checkBoxSerialPassThru1">
<property name="text">
<string>Serial port passthrough 1</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="pushButtonSerialPassThru1">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="checkBoxSerialPassThru2">
<property name="text">
<string>Serial port passthrough 2</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="pushButtonSerialPassThru2">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="checkBoxSerialPassThru3">
<property name="text">
<string>Serial port passthrough 3</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="pushButtonSerialPassThru3">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="checkBoxSerialPassThru4">
<property name="text">
<string>Serial port passthrough 4</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="pushButtonSerialPassThru4">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="4" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
@@ -164,13 +220,6 @@
</property>
</spacer>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="checkBoxSerialPassThru3">
<property name="text">
<string>Serial port passthrough 3</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<spacer name="verticalSpacer">
<property name="orientation">
@@ -184,55 +233,6 @@
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="pushButtonSerialPassThru1">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="checkBoxSerialPassThru1">
<property name="text">
<string>Serial port passthrough 1</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="checkBoxSerialPassThru2">
<property name="text">
<string>Serial port passthrough 2</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="checkBoxSerialPassThru4">
<property name="text">
<string>Serial port passthrough 4</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="pushButtonSerialPassThru2">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="pushButtonSerialPassThru3">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="pushButtonSerialPassThru4">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>

View File

@@ -14,7 +14,7 @@
* Jasmine Iwanek <jriwanek@gmail.com>
*
* Copyright 2021 Joakim L. Gilje
* Copyright 2022-2023 Jasmine Iwanek
* Copyright 2022-2025 Jasmine Iwanek
*/
#include "qt_settingssound.hpp"
#include "ui_qt_settingssound.h"
@@ -76,8 +76,8 @@ SettingsSound::onCurrentMachineChanged(const int machineId)
int c;
int selectedRow;
// Sound Card
QComboBox * cbox[SOUND_CARD_MAX] = { 0 };
// Sound Cards
QComboBox *cbox[SOUND_CARD_MAX] = { 0 };
QAbstractItemModel *models[SOUND_CARD_MAX] = { 0 };
int removeRows_[SOUND_CARD_MAX] = { 0 };
int selectedRows[SOUND_CARD_MAX] = { 0 };
@@ -89,7 +89,7 @@ SettingsSound::onCurrentMachineChanged(const int machineId)
removeRows_[i] = models[i]->rowCount();
}
c = 0;
c = 0;
while (true) {
const QString name = DeviceConfig::DeviceName(sound_card_getdevice(c),
sound_card_get_internal_name(c), 1);
@@ -110,7 +110,7 @@ SettingsSound::onCurrentMachineChanged(const int machineId)
}
}
c++;
c++;
}
for (uint8_t i = 0; i < SOUND_CARD_MAX; ++i) {
@@ -122,21 +122,19 @@ SettingsSound::onCurrentMachineChanged(const int machineId)
// Midi Out
c = 0;
auto model = ui->comboBoxMidiOut->model();
auto *model = ui->comboBoxMidiOut->model();
auto removeRows = model->rowCount();
selectedRow = 0;
while (true) {
const QString name = DeviceConfig::DeviceName(midi_out_device_getdevice(c), midi_out_device_get_internal_name(c), 0);
if (name.isEmpty()) {
if (name.isEmpty())
break;
}
if (midi_out_device_available(c)) {
int row = Models::AddEntry(model, name, c);
if (c == midi_output_device_current) {
if (c == midi_output_device_current)
selectedRow = row - removeRows;
}
}
c++;
@@ -155,15 +153,13 @@ SettingsSound::onCurrentMachineChanged(const int machineId)
while (true) {
const QString name = DeviceConfig::DeviceName(midi_in_device_getdevice(c), midi_in_device_get_internal_name(c), 0);
if (name.isEmpty()) {
if (name.isEmpty())
break;
}
if (midi_in_device_available(c)) {
int row = Models::AddEntry(model, name, c);
if (c == midi_input_device_current) {
if (c == midi_input_device_current)
selectedRow = row - removeRows;
}
}
c++;
@@ -198,13 +194,11 @@ allowMpu401(Ui::SettingsSound *ui)
QString midiOut = midi_out_device_get_internal_name(ui->comboBoxMidiOut->currentData().toInt());
QString midiIn = midi_in_device_get_internal_name(ui->comboBoxMidiIn->currentData().toInt());
if (midiOut.isEmpty()) {
if (midiOut.isEmpty())
return false;
}
if (midiOut == QStringLiteral("none") && midiIn == QStringLiteral("none")) {
if (midiOut == QStringLiteral("none") && midiIn == QStringLiteral("none"))
return false;
}
return true;
}
@@ -212,9 +206,9 @@ allowMpu401(Ui::SettingsSound *ui)
void
SettingsSound::on_comboBoxSoundCard1_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
int sndCard = ui->comboBoxSoundCard1->currentData().toInt();
if (sndCard == SOUND_INTERNAL)
@@ -238,9 +232,8 @@ SettingsSound::on_pushButtonConfigureSoundCard1_clicked()
void
SettingsSound::on_comboBoxSoundCard2_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
int sndCard = ui->comboBoxSoundCard2->currentData().toInt();
@@ -258,9 +251,8 @@ SettingsSound::on_pushButtonConfigureSoundCard2_clicked()
void
SettingsSound::on_comboBoxSoundCard3_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
int sndCard = ui->comboBoxSoundCard3->currentData().toInt();
@@ -279,9 +271,8 @@ SettingsSound::on_pushButtonConfigureSoundCard3_clicked()
void
SettingsSound::on_comboBoxSoundCard4_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
int sndCard = ui->comboBoxSoundCard4->currentData().toInt();
@@ -300,9 +291,8 @@ SettingsSound::on_pushButtonConfigureSoundCard4_clicked()
void
SettingsSound::on_comboBoxMidiOut_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
ui->pushButtonConfigureMidiOut->setEnabled(midi_out_device_has_config(ui->comboBoxMidiOut->currentData().toInt()));
ui->checkBoxMPU401->setEnabled(allowMpu401(ui) && (machine_has_bus(machineId, MACHINE_BUS_ISA) || machine_has_bus(machineId, MACHINE_BUS_MCA)));
@@ -318,9 +308,8 @@ SettingsSound::on_pushButtonConfigureMidiOut_clicked()
void
SettingsSound::on_comboBoxMidiIn_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
ui->pushButtonConfigureMidiIn->setEnabled(midi_in_device_has_config(ui->comboBoxMidiIn->currentData().toInt()));
ui->checkBoxMPU401->setEnabled(allowMpu401(ui) && (machine_has_bus(machineId, MACHINE_BUS_ISA) || machine_has_bus(machineId, MACHINE_BUS_MCA)));

View File

@@ -20,20 +20,26 @@ public slots:
void onCurrentMachineChanged(int machineId);
private slots:
void on_pushButtonConfigureMPU401_clicked();
void on_checkBoxMPU401_stateChanged(int arg1);
void on_pushButtonConfigureMidiIn_clicked();
void on_pushButtonConfigureMidiOut_clicked();
void on_comboBoxMidiIn_currentIndexChanged(int index);
void on_comboBoxMidiOut_currentIndexChanged(int index);
void on_pushButtonConfigureSoundCard1_clicked();
void on_comboBoxSoundCard1_currentIndexChanged(int index);
void on_pushButtonConfigureSoundCard2_clicked();
void on_pushButtonConfigureSoundCard1_clicked();
void on_comboBoxSoundCard2_currentIndexChanged(int index);
void on_pushButtonConfigureSoundCard3_clicked();
void on_pushButtonConfigureSoundCard2_clicked();
void on_comboBoxSoundCard3_currentIndexChanged(int index);
void on_pushButtonConfigureSoundCard4_clicked();
void on_pushButtonConfigureSoundCard3_clicked();
void on_comboBoxSoundCard4_currentIndexChanged(int index);
void on_pushButtonConfigureSoundCard4_clicked();
void on_comboBoxMidiOut_currentIndexChanged(int index);
void on_pushButtonConfigureMidiOut_clicked();
void on_comboBoxMidiIn_currentIndexChanged(int index);
void on_pushButtonConfigureMidiIn_clicked();
void on_checkBoxMPU401_stateChanged(int arg1);
void on_pushButtonConfigureMPU401_clicked();
private:
Ui::SettingsSound *ui;

View File

@@ -26,17 +26,23 @@
<property name="bottomMargin">
<number>0</number>
</property>
<item row="5" column="0">
<widget class="QLabel" name="label_3">
<item row="0" column="0">
<widget class="QLabel" name="labelSoundCard1">
<property name="text">
<string>MIDI In Device:</string>
<string>Sound card #1:</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Sound card #1:</string>
<item row="0" column="1">
<widget class="QComboBox" name="comboBoxSoundCard1">
<property name="maxVisibleItems">
<number>30</number>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
@@ -48,12 +54,25 @@
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<widget class="QLabel" name="labelSoundCard2">
<property name="text">
<string>Sound card #2:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="comboBoxSoundCard2">
<property name="maxVisibleItems">
<number>30</number>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QPushButton" name="pushButtonConfigureSoundCard2">
<property name="text">
@@ -62,12 +81,25 @@
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_5">
<widget class="QLabel" name="labelSoundCard3">
<property name="text">
<string>Sound card #3:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="comboBoxSoundCard3">
<property name="maxVisibleItems">
<number>30</number>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QPushButton" name="pushButtonConfigureSoundCard3">
<property name="text">
@@ -75,14 +107,26 @@
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_6">
<widget class="QLabel" name="labelSoundCard4">
<property name="text">
<string>Sound card #4:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="comboBoxSoundCard4">
<property name="maxVisibleItems">
<number>30</number>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="3" column="3">
<widget class="QPushButton" name="pushButtonConfigureSoundCard4">
<property name="text">
@@ -90,49 +134,13 @@
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QComboBox" name="comboBoxMidiIn">
<property name="maxVisibleItems">
<number>30</number>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_2">
<widget class="QLabel" name="labelMidiOut">
<property name="text">
<string>MIDI Out Device:</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QCheckBox" name="checkBoxMPU401">
<property name="text">
<string>Standalone MPU-401</string>
</property>
</widget>
</item>
<item row="6" column="3">
<widget class="QPushButton" name="pushButtonConfigureMPU401">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="5" column="3">
<widget class="QPushButton" name="pushButtonConfigureMidiIn">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="comboBoxMidiOut">
<property name="maxVisibleItems">
@@ -153,6 +161,47 @@
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="labelMidiIn">
<property name="text">
<string>MIDI In Device:</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QComboBox" name="comboBoxMidiIn">
<property name="maxVisibleItems">
<number>30</number>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="5" column="3">
<widget class="QPushButton" name="pushButtonConfigureMidiIn">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QCheckBox" name="checkBoxMPU401">
<property name="text">
<string>Standalone MPU-401</string>
</property>
</widget>
</item>
<item row="6" column="3">
<widget class="QPushButton" name="pushButtonConfigureMPU401">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QCheckBox" name="checkBoxFloat32">
<property name="text">
@@ -171,7 +220,7 @@
<property name="title">
<string>FM synth driver</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_1">
<layout class="QVBoxLayout" name="verticalLayoutFM">
<item>
<widget class="QRadioButton" name="radioButtonNuked">
<property name="text">
@@ -202,58 +251,6 @@
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBoxSoundCard1">
<property name="maxVisibleItems">
<number>30</number>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="comboBoxSoundCard2">
<property name="maxVisibleItems">
<number>30</number>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="comboBoxSoundCard3">
<property name="maxVisibleItems">
<number>30</number>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="comboBoxSoundCard4">
<property name="maxVisibleItems">
<number>30</number>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>

View File

@@ -56,8 +56,8 @@ SettingsStorageControllers::save()
QComboBox *cbox = findChild<QComboBox *>(QString("comboBoxSCSI%1").arg(i + 1));
scsi_card_current[i] = cbox->currentData().toInt();
}
hdc_current[0] = ui->comboBoxHD->currentData().toInt();
fdc_current[0] = ui->comboBoxFD->currentData().toInt();
hdc_current[0] = ui->comboBoxHD->currentData().toInt();
cdrom_interface_current = ui->comboBoxCDInterface->currentData().toInt();
ide_ter_enabled = ui->checkBoxTertiaryIDE->isChecked() ? 1 : 0;
ide_qua_enabled = ui->checkBoxQuaternaryIDE->isChecked() ? 1 : 0;
@@ -84,18 +84,16 @@ SettingsStorageControllers::onCurrentMachineChanged(int machineId)
}
QString name = DeviceConfig::DeviceName(hdc_get_device(c), hdc_get_internal_name(c), 1);
if (name.isEmpty()) {
if (name.isEmpty())
break;
}
if (hdc_available(c)) {
const device_t *hdc_dev = hdc_get_device(c);
if (device_is_valid(hdc_dev, machineId)) {
int row = Models::AddEntry(model, name, c);
if (c == hdc_current[0]) {
if (c == hdc_current[0])
selectedRow = row - removeRows;
}
}
}
c++;
@@ -105,7 +103,7 @@ SettingsStorageControllers::onCurrentMachineChanged(int machineId)
ui->comboBoxHD->setCurrentIndex(-1);
ui->comboBoxHD->setCurrentIndex(selectedRow);
/*FD controller config*/
/* FD controller config */
model = ui->comboBoxFD->model();
removeRows = model->rowCount();
c = 0;
@@ -143,11 +141,11 @@ SettingsStorageControllers::onCurrentMachineChanged(int machineId)
/*CD interface controller config*/
#ifdef USE_CDROM_MITSUMI
ui->label_7->setVisible(true);
ui->labelCDInterface->setVisible(true);
ui->comboBoxCDInterface->setVisible(true);
ui->pushButtonCDInterface->setVisible(true);
#else
ui->label_7->setVisible(false);
ui->labelCDInterface->setVisible(false);
ui->comboBoxCDInterface->setVisible(false);
ui->pushButtonCDInterface->setVisible(false);
#endif
@@ -240,29 +238,29 @@ SettingsStorageControllers::onCurrentMachineChanged(int machineId)
}
void
SettingsStorageControllers::on_comboBoxHD_currentIndexChanged(int index)
SettingsStorageControllers::on_comboBoxFD_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
ui->pushButtonHD->setEnabled(hdc_has_config(ui->comboBoxHD->currentData().toInt()) > 0);
ui->pushButtonFD->setEnabled(hdc_has_config(ui->comboBoxFD->currentData().toInt()) > 0);
}
void
SettingsStorageControllers::on_comboBoxFD_currentIndexChanged(int index)
SettingsStorageControllers::on_comboBoxHD_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
ui->pushButtonFD->setEnabled(hdc_has_config(ui->comboBoxFD->currentData().toInt()) > 0);
ui->pushButtonHD->setEnabled(hdc_has_config(ui->comboBoxHD->currentData().toInt()) > 0);
}
void
SettingsStorageControllers::on_comboBoxCDInterface_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
ui->pushButtonCDInterface->setEnabled(cdrom_interface_has_config(ui->comboBoxCDInterface->currentData().toInt()) > 0);
}
@@ -278,18 +276,18 @@ SettingsStorageControllers::on_checkBoxQuaternaryIDE_stateChanged(int arg1)
ui->pushButtonQuaternaryIDE->setEnabled(arg1 == Qt::Checked);
}
void
SettingsStorageControllers::on_pushButtonHD_clicked()
{
DeviceConfig::ConfigureDevice(hdc_get_device(ui->comboBoxHD->currentData().toInt()));
}
void
SettingsStorageControllers::on_pushButtonFD_clicked()
{
DeviceConfig::ConfigureDevice(fdc_card_getdevice(ui->comboBoxFD->currentData().toInt()));
}
void
SettingsStorageControllers::on_pushButtonHD_clicked()
{
DeviceConfig::ConfigureDevice(hdc_get_device(ui->comboBoxHD->currentData().toInt()));
}
void
SettingsStorageControllers::on_pushButtonCDInterface_clicked()
{
@@ -311,36 +309,36 @@ SettingsStorageControllers::on_pushButtonQuaternaryIDE_clicked()
void
SettingsStorageControllers::on_comboBoxSCSI1_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
ui->pushButtonSCSI1->setEnabled(scsi_card_has_config(ui->comboBoxSCSI1->currentData().toInt()) > 0);
}
void
SettingsStorageControllers::on_comboBoxSCSI2_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
ui->pushButtonSCSI2->setEnabled(scsi_card_has_config(ui->comboBoxSCSI2->currentData().toInt()) > 0);
}
void
SettingsStorageControllers::on_comboBoxSCSI3_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
ui->pushButtonSCSI3->setEnabled(scsi_card_has_config(ui->comboBoxSCSI3->currentData().toInt()) > 0);
}
void
SettingsStorageControllers::on_comboBoxSCSI4_currentIndexChanged(int index)
{
if (index < 0) {
if (index < 0)
return;
}
ui->pushButtonSCSI4->setEnabled(scsi_card_has_config(ui->comboBoxSCSI4->currentData().toInt()) > 0);
}

View File

@@ -20,27 +20,31 @@ public slots:
void onCurrentMachineChanged(int machineId);
private slots:
void on_pushButtonSCSI4_clicked();
void on_pushButtonSCSI3_clicked();
void on_pushButtonSCSI2_clicked();
void on_pushButtonSCSI1_clicked();
void on_comboBoxSCSI4_currentIndexChanged(int index);
void on_comboBoxSCSI3_currentIndexChanged(int index);
void on_comboBoxSCSI2_currentIndexChanged(int index);
void on_comboBoxSCSI1_currentIndexChanged(int index);
void on_pushButtonQuaternaryIDE_clicked();
void on_pushButtonTertiaryIDE_clicked();
void on_pushButtonFD_clicked();
void on_pushButtonHD_clicked();
void on_pushButtonCDInterface_clicked();
void on_checkBoxQuaternaryIDE_stateChanged(int arg1);
void on_checkBoxTertiaryIDE_stateChanged(int arg1);
void on_comboBoxFD_currentIndexChanged(int index);
void on_pushButtonFD_clicked();
void on_comboBoxHD_currentIndexChanged(int index);
void on_pushButtonHD_clicked();
void on_comboBoxCDInterface_currentIndexChanged(int index);
void on_pushButtonCDInterface_clicked();
void on_checkBoxTertiaryIDE_stateChanged(int arg1);
void on_pushButtonTertiaryIDE_clicked();
void on_checkBoxQuaternaryIDE_stateChanged(int arg1);
void on_pushButtonQuaternaryIDE_clicked();
void on_comboBoxSCSI1_currentIndexChanged(int index);
void on_pushButtonSCSI1_clicked();
void on_comboBoxSCSI2_currentIndexChanged(int index);
void on_pushButtonSCSI2_clicked();
void on_comboBoxSCSI3_currentIndexChanged(int index);
void on_pushButtonSCSI3_clicked();
void on_comboBoxSCSI4_currentIndexChanged(int index);
void on_pushButtonSCSI4_clicked();
void on_checkBoxLbaEnhancer_stateChanged(int arg1);
void on_pushButtonConfigureLbaEnhancer_clicked();
private:

View File

@@ -29,13 +29,20 @@
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<widget class="QLabel" name="labelFD">
<property name="text">
<string>HD Controller:</string>
<string>FD Controller:</string>
</property>
</widget>
</item>
<item row="1" column="2">
<item row="0" column="1">
<widget class="QComboBox" name="comboBoxFD">
<property name="maxVisibleItems">
<number>30</number>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="pushButtonFD">
<property name="text">
<string>Configure</string>
@@ -43,14 +50,34 @@
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<widget class="QLabel" name="labelHD">
<property name="text">
<string>FD Controller:</string>
<string>HD Controller:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="comboBoxHD">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maxVisibleItems">
<number>30</number>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="pushButtonHD">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_7">
<widget class="QLabel" name="labelCDInterface">
<property name="text">
<string>CD-ROM Controller:</string>
</property>
@@ -70,33 +97,6 @@
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBoxHD">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maxVisibleItems">
<number>30</number>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="pushButtonHD">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="comboBoxFD">
<property name="maxVisibleItems">
<number>30</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="checkBoxTertiaryIDE">
<property name="text">
@@ -104,13 +104,6 @@
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="checkBoxQuaternaryIDE">
<property name="text">
<string>Quaternary IDE Controller</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QPushButton" name="pushButtonTertiaryIDE">
<property name="enabled">
@@ -121,6 +114,13 @@
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="checkBoxQuaternaryIDE">
<property name="text">
<string>Quaternary IDE Controller</string>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QPushButton" name="pushButtonQuaternaryIDE">
<property name="enabled">
@@ -134,29 +134,15 @@
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<widget class="QGroupBox" name="groupBoxSCSI">
<property name="title">
<string>SCSI</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="3">
<widget class="QPushButton" name="pushButtonSCSI2">
<layout class="QGridLayout" name="gridLayoutSCSI">
<item row="0" column="0">
<widget class="QLabel" name="labelSCSI1">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="3" column="3">
<widget class="QPushButton" name="pushButtonSCSI4">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Controller 3:</string>
<string>Controller 1:</string>
</property>
</widget>
</item>
@@ -180,6 +166,13 @@
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labelSCSI2">
<property name="text">
<string>Controller 2:</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QComboBox" name="comboBoxSCSI2">
<property name="sizePolicy">
@@ -193,6 +186,20 @@
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QPushButton" name="pushButtonSCSI2">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="labelSCSI3">
<property name="text">
<string>Controller 3:</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QComboBox" name="comboBoxSCSI3">
<property name="sizePolicy">
@@ -206,6 +213,20 @@
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QPushButton" name="pushButtonSCSI3">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="labelSCSI4">
<property name="text">
<string>Controller 4:</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QComboBox" name="comboBoxSCSI4">
<property name="sizePolicy">
@@ -219,29 +240,8 @@
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Controller 1:</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Controller 2:</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Controller 4:</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QPushButton" name="pushButtonSCSI3">
<item row="3" column="3">
<widget class="QPushButton" name="pushButtonSCSI4">
<property name="text">
<string>Configure</string>
</property>

View File

@@ -92,6 +92,29 @@ DlgFilter(std::initializer_list<QString> extensions, bool last)
return " (" % temp.join(' ') % ")" % (!last ? ";;" : "");
}
QString
DlgFilter(QStringList extensions, bool last)
{
QStringList temp;
for (auto ext : extensions) {
#ifdef Q_OS_UNIX
if (ext == "*") {
temp.append("*");
continue;
}
temp.append("*." % ext.toUpper());
#endif
temp.append("*." % ext);
}
#ifdef Q_OS_UNIX
temp.removeDuplicates();
#endif
return " (" % temp.join(' ') % ")" % (!last ? ";;" : "");
}
QString currentUuid()
{
auto configPath = QFileInfo(cfg_path).dir().canonicalPath();

View File

@@ -11,6 +11,7 @@ namespace util {
static constexpr auto UUID_MIN_LENGTH = 36;
/* Creates extension list for qt filedialog */
QString DlgFilter(std::initializer_list<QString> extensions, bool last = false);
QString DlgFilter(QStringList extensions, bool last = false);
/* Returns screen the widget is on */
QScreen *screenOfWidget(QWidget *widget);
#ifdef Q_OS_WINDOWS

View File

@@ -161,6 +161,7 @@ fluidsynth_init(UNUSED(const device_t *info))
fluid_settings_setnum(data->settings, "synth.sample-rate", 44100);
fluid_settings_setnum(data->settings, "synth.gain", device_get_config_int("output_gain") / 100.0f);
fluid_settings_setint(data->settings, "synth.dynamic-sample-loading", device_get_config_int("dynamic_sample_loading"));
data->synth = new_fluid_synth(data->settings);
@@ -324,7 +325,7 @@ static const device_config_t fluidsynth_config[] = {
.type = CONFIG_FNAME,
.default_string = NULL,
.default_int = 0,
.file_filter = "SF2 Sound Fonts (*.sf2)|*.sf2",
.file_filter = "SoundFont files (*.sf2 *.sf3)|*.sf2,*.sf3",
.spinner = { 0 },
.selection = { { 0 } },
.bios = { { 0 } }
@@ -509,6 +510,17 @@ static const device_config_t fluidsynth_config[] = {
},
.bios = { { 0 } }
},
{
.name = "dynamic_sample_loading",
.description = "Dynamic Sample Loading",
.type = CONFIG_BINARY,
.default_string = NULL,
.default_int = 0,
.file_filter = NULL,
.spinner = { 0 },
.selection = { { 0 } },
.bios = { { 0 } }
},
{ .name = "", .description = "", .type = CONFIG_END }
// clang-format on
};

View File

@@ -731,9 +731,11 @@ ad1848_poll(void *priv)
if (!(ad1848->status & 0x01)) {
ad1848->status |= 0x01;
ad1848->regs[24] |= 0x10;
if (ad1848->regs[10] & 2)
picint(1 << ad1848->irq);
}
if (ad1848->regs[10] & 2)
picint(1 << ad1848->irq);
else
picintc(1 << ad1848->irq);
}
if (!(ad1848->adpcm_pos & 7)) /* ADPCM counts down every 4 bytes */

View File

@@ -47,7 +47,7 @@ void ega_doblit(int wx, int wy, ega_t *ega);
static video_timings_t timing_ega = { .type = VIDEO_ISA, .write_b = 8, .write_w = 16, .write_l = 32, .read_b = 8, .read_w = 16, .read_l = 32 };
static uint8_t ega_rotate[8][256];
static int active = 0;
static int active = 0;
uint32_t pallook16[256];
uint32_t pallook64[256];
static int ega_type = EGA_TYPE_IBM;
@@ -72,7 +72,7 @@ ega_out(uint16_t addr, uint8_t val, void *priv)
uint8_t gdcmask = (ega_type == EGA_SUPEREGA) ? 0xff : 0x0f;
uint8_t crtcmask = (atype == EGA_SUPEREGA) ? 0xff : 0x1f;
if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(ega->miscout & 1))
if (((((addr & 0xfff0) == 0x3d0) || ((addr & 0xfff0) == 0x2d0)) || (((addr & 0xfff0) == 0x3b0) || ((addr & 0xfff0) == 0x2b0))) && !(ega->miscout & 1))
addr ^= 0x60;
switch (addr) {
@@ -94,7 +94,9 @@ ega_out(uint16_t addr, uint8_t val, void *priv)
}
break;
case 0x2c0:
case 0x3c0:
case 0x2c1:
case 0x3c1:
if (atype == EGA_SUPEREGA)
val &= 0x7f; /* Bit 7 indicates the flipflop status (read only) */
@@ -108,8 +110,9 @@ ega_out(uint16_t addr, uint8_t val, void *priv)
} else {
if ((ega->attraddr == 0x13) && (ega->attrregs[0x13] != val))
ega->fullchange = changeframecount;
o = ega->attrregs[ega->attraddr & 31];
ega->attrregs[ega->attraddr & 31] = val;
uint8_t aidx = ega->attraddr & 31;
o = ega->attrregs[aidx];
ega->attrregs[aidx] = val;
if (ega->attraddr < 16)
ega->fullchange = changeframecount;
int is_attr14 = ega->chipset && (ega->attraddr == 0x14);
@@ -139,6 +142,7 @@ ega_out(uint16_t addr, uint8_t val, void *priv)
}
ega->attrff ^= 1;
break;
case 0x2c2:
case 0x3c2:
o = ega->miscout;
egaswitchread = (val & 0xc) >> 2;
@@ -148,13 +152,19 @@ ega_out(uint16_t addr, uint8_t val, void *priv)
ega->miscout = val;
ega->overscan_color = ega->vres ? pallook16[ega->attrregs[0x11] & 0x0f] :
pallook64[ega->attrregs[0x11] & 0x3f];
io_removehandler(0x03a0, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega);
uint16_t base_addr = 0x03a0;
#ifdef EGA_ALT_ADDR_SUPPORT
if (ega->alt_addr == 1)
base_addr = 0x02a0;
#endif
io_removehandler(base_addr, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega);
if (!(val & 1))
io_sethandler(0x03a0, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega);
io_sethandler(base_addr, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega);
ega_recalctimings(ega);
if ((type == EGA_TYPE_COMPAQ) && !(val & 0x02))
mem_mapping_disable(&ega->mapping);
else switch (ega->gdcreg[6] & 0xc) {
else switch (ega->gdcreg[6] & 0xc) {
case 0x0: /*128k at A0000*/
mem_mapping_set_addr(&ega->mapping, 0xa0000, 0x20000);
break;
@@ -172,9 +182,11 @@ ega_out(uint16_t addr, uint8_t val, void *priv)
break;
}
break;
case 0x2c4:
case 0x3c4:
ega->seqaddr = val;
break;
case 0x2c5:
case 0x3c5:
o = ega->seqregs[ega->seqaddr & 0xf];
ega->seqregs[ega->seqaddr & 0xf] = val;
@@ -201,16 +213,20 @@ ega_out(uint16_t addr, uint8_t val, void *priv)
break;
}
break;
case 0x2c6:
case 0x3c6:
if (type == EGA_TYPE_COMPAQ)
ega->ctl_mode = val;
break;
case 0x2ce:
case 0x3ce:
ega->gdcaddr = val;
break;
case 0x3cf:
ega->gdcreg[ega->gdcaddr & gdcmask] = val;
switch (ega->gdcaddr & gdcmask) {
case 0x2cf:
case 0x3cf: {
uint8_t reg = ega->gdcaddr & gdcmask;
ega->gdcreg[reg] = val;
switch (reg) {
case 2:
ega->colourcompare = val;
break;
@@ -225,7 +241,7 @@ ega_out(uint16_t addr, uint8_t val, void *priv)
case 6:
if ((type == EGA_TYPE_COMPAQ) && !(ega->miscout & 0x02))
mem_mapping_disable(&ega->mapping);
else switch (val & 0xc) {
else switch (val & 0xc) {
case 0x0: /*128k at A0000*/
mem_mapping_set_addr(&ega->mapping, 0xa0000, 0x20000);
break;
@@ -264,32 +280,34 @@ ega_out(uint16_t addr, uint8_t val, void *priv)
break;
}
break;
}
case 0x2d0:
case 0x3d0:
case 0x2d4:
case 0x3d4:
if (ega->chipset)
ega->crtcreg = val & 0x3f;
else
ega->crtcreg = val;
ega->crtcreg = ega->chipset ? (val & 0x3f) : val;
return;
case 0x2d1:
case 0x3d1:
case 0x2d5:
case 0x3d5: {
int idx = ega->crtcreg;
if (ega->chipset) {
if ((ega->crtcreg < 7) && (ega->crtc[0x11] & 0x80) && !(ega->regs[0xb4] & 0x80))
if ((idx < 7) && (ega->crtc[0x11] & 0x80) && !(ega->regs[0xb4] & 0x80))
return;
if ((ega->crtcreg == 7) && (ega->crtc[0x11] & 0x80) && !(ega->regs[0xb4] & 0x80))
if ((idx == 7) && (ega->crtc[0x11] & 0x80) && !(ega->regs[0xb4] & 0x80))
val = (ega->crtc[7] & ~0x10) | (val & 0x10);
} else {
idx &= crtcmask;
if ((idx >= 0x19) & (idx <= 0xf6))
if ((idx >= 0x19) && (idx <= 0xf6))
return;
if ((idx < 7) && (ega->crtc[0x11] & 0x80))
return;
if ((idx == 7) && (ega->crtc[0x11] & 0x80))
val = (ega->crtc[7] & ~0x10) | (val & 0x10);
}
old = ega->crtc[idx];
old = ega->crtc[idx];
ega->crtc[idx] = val;
if (old != val) {
if ((idx < 0xe) || (idx > 0x10)) {
@@ -305,7 +323,9 @@ ega_out(uint16_t addr, uint8_t val, void *priv)
}
break;
} default:
}
default:
break;
}
}
@@ -313,14 +333,14 @@ ega_out(uint16_t addr, uint8_t val, void *priv)
uint8_t
ega_in(uint16_t addr, void *priv)
{
ega_t *ega = (ega_t *) priv;
ega_t *ega = (ega_t *) priv;
uint8_t ret = 0xff;
int type = ega_type;
int atype = ega->actual_type;
uint8_t gdcmask = (atype == EGA_SUPEREGA) ? 0xff : 0x0f;
uint8_t crtcmask = (atype == EGA_SUPEREGA) ? 0xff : 0x1f;
if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(ega->miscout & 1))
if (((((addr & 0xfff0) == 0x3d0) || ((addr & 0xfff0) == 0x2d0)) || (((addr & 0xfff0) == 0x3b0) || ((addr & 0xfff0) == 0x2b0))) && !(ega->miscout & 1))
addr ^= 0x60;
switch (addr) {
@@ -341,7 +361,9 @@ ega_in(uint16_t addr, void *priv)
}
break;
case 0x2c0:
case 0x3c0:
case 0x2c1:
case 0x3c1:
if (type == EGA_TYPE_OTHER) {
int data = (atype == EGA_SUPEREGA) ? (ega->attrff & 1) : (addr & 1);
@@ -354,9 +376,11 @@ ega_in(uint16_t addr, void *priv)
ret = (ret & 0x3f) | (ega->attrff ? 0x80 : 0x00);
}
break;
case 0x2c2:
case 0x3c2:
ret = (egaswitches & (8 >> egaswitchread)) ? 0x10 : 0x00;
break;
case 0x2c4:
case 0x3c4:
if (type == EGA_TYPE_OTHER) {
if (atype == EGA_SUPEREGA)
@@ -365,28 +389,34 @@ ega_in(uint16_t addr, void *priv)
ret = ega->seqaddr;
}
break;
case 0x2c5:
case 0x3c5:
if (type == EGA_TYPE_OTHER) {
if ((ega->seqaddr & 0x0f) > 0x04)
ret = ega->chipset ? ega->seqregs[ega->seqaddr & 0xf] : 0xff;
uint8_t idx = ega->seqaddr & 0xf;
if (idx > 0x04)
ret = ega->chipset ? ega->seqregs[idx] : 0xff;
else
ret = ega->seqregs[ega->seqaddr & 0xf];
ret = ega->seqregs[idx];
}
break;
case 0x2c6:
case 0x3c6:
if (type == EGA_TYPE_COMPAQ)
ret = ega->ctl_mode;
break;
case 0x2c8:
case 0x3c8:
if (type == EGA_TYPE_OTHER)
ret = 2;
break;
case 0x2cc:
case 0x3cc:
if (type == EGA_TYPE_OTHER)
ret = ega->miscout;
break;
case 0x2ce:
case 0x3ce:
if (ega_type == EGA_TYPE_OTHER) {
if (type == EGA_TYPE_OTHER) {
ret = ega->gdcaddr;
if (atype == EGA_SUPEREGA) {
ret = (ret & 0x0f) | 0xe0;
@@ -395,14 +425,16 @@ ega_in(uint16_t addr, void *priv)
}
}
break;
case 0x2cf:
case 0x3cf:
if (type == EGA_TYPE_OTHER) {
switch (ega->gdcaddr & gdcmask) {
uint8_t gidx = ega->gdcaddr & gdcmask;
switch (gidx) {
default:
ret = ega->gdcreg[ega->gdcaddr & gdcmask];
ret = ega->gdcreg[gidx];
break;
case 0x09 ... 0xf7:
ret = ega->chipset ? ega->gdcreg[ega->gdcaddr & gdcmask] : 0xff;
ret = ega->chipset ? ega->gdcreg[gidx] : 0xff;
break;
case 0xf8:
ret = ega->la;
@@ -419,9 +451,11 @@ ega_in(uint16_t addr, void *priv)
}
}
break;
case 0x2d0:
case 0x3d0:
case 0x2d4:
case 0x3d4:
if (ega_type == EGA_TYPE_OTHER) {
if (type == EGA_TYPE_OTHER) {
ret = ega->crtcreg;
if (atype == EGA_SUPEREGA) {
ret = (ret & 0x1f) | 0xc0;
@@ -430,7 +464,9 @@ ega_in(uint16_t addr, void *priv)
}
}
break;
case 0x2d1:
case 0x3d1:
case 0x2d5:
case 0x3d5:
switch (ega->crtcreg & crtcmask) {
case 0xc:
@@ -465,6 +501,7 @@ ega_in(uint16_t addr, void *priv)
break;
}
break;
case 0x2da:
case 0x3da:
ega->attrff = 0;
if (type == EGA_TYPE_COMPAQ) {
@@ -494,7 +531,7 @@ ega_in(uint16_t addr, void *priv)
}
break;
case 0x7c6:
ret = 0xfd; /* EGA mode supported. */
ret = 0xfd; /* EGA mode supported. */
break;
case 0xbc6:
/* 0000 = None;
@@ -525,6 +562,7 @@ ega_recalctimings(ega_t *ega)
double _dispofftime;
double disptime;
double crtcconst;
double mdiv = (ega->seqregs[1] & 1) ? 8.0 : 9.0;
ega->vtotal = ega->crtc[6];
ega->dispend = ega->crtc[0x12];
@@ -578,10 +616,7 @@ ega_recalctimings(ega_t *ega)
else
crtcconst = (cpuclock / 16872000.0 * (double) (1ULL << 32));
}
if (!(ega->seqregs[1] & 1))
crtcconst *= 9.0;
else
crtcconst *= 8.0;
crtcconst *= mdiv;
} else if (ega->eeprom) {
clksel = ((ega->miscout & 0xc) >> 2) | ((ega->regs[0xbe] & 0x10) ? 4 : 0);
@@ -603,20 +638,14 @@ ega_recalctimings(ega_t *ega)
crtcconst = (cpuclock / 36000000.0 * (double) (1ULL << 32));
break;
}
if (!(ega->seqregs[1] & 1))
crtcconst *= 9.0;
else
crtcconst *= 8.0;
crtcconst *= mdiv;
} else {
if (ega->vidclock)
crtcconst = (ega->seqregs[1] & 1) ? MDACONST : (MDACONST * (9.0 / 8.0));
else
crtcconst = (ega->seqregs[1] & 1) ? CGACONST : (CGACONST * (9.0 / 8.0));
}
if (!(ega->seqregs[1] & 1))
ega->dot_clock = crtcconst / 9.0;
else
ega->dot_clock = crtcconst / 8.0;
ega->dot_clock = crtcconst / mdiv;
ega->interlace = 0;
@@ -629,17 +658,16 @@ ega_recalctimings(ega_t *ega)
ega->hdisp *= (ega->seqregs[1] & 1) ? 16 : 18;
else
ega->hdisp *= (ega->seqregs[1] & 1) ? 8 : 9;
ega->render = ega_render_text;
ega->hdisp_old = ega->hdisp;
ega->render = ega_render_text;
} else {
ega->hdisp *= (ega->seqregs[1] & 8) ? 16 : 8;
ega->render = ega_render_graphics;
ega->hdisp_old = ega->hdisp;
ega->render = ega_render_graphics;
}
ega->hdisp_old = ega->hdisp;
}
if (ega->chipset) {
if (ega->hdisp > 640) {
if (ega->hdisp >= 800) {
ega->dispend <<= 1;
ega->vtotal <<= 1;
ega->split <<= 1;
@@ -696,7 +724,7 @@ ega_recalctimings(ega_t *ega)
timer_disable(&ega->dot_timer);
timer_set_delay_u64(&ega->dot_timer, ega->dot_time);
ega->cca = 0;
active = 1;
active = 1;
ega->dot = 0;
}
@@ -708,30 +736,30 @@ ega_recalctimings(ega_t *ega)
void
ega_dot_poll(void *priv)
{
ega_t *ega = (ega_t *) priv;
static uint8_t chr;
static uint8_t attr;
const bool doublewidth = ((ega->seqregs[1] & 8) != 0);
const bool attrblink = ((ega->attrregs[0x10] & 8) != 0);
const bool attrlinechars = (ega->attrregs[0x10] & 4);
const bool crtcreset = ((ega->crtc[0x17] & 0x80) == 0);
const bool seq9dot = ((ega->seqregs[1] & 1) == 0);
const bool blinked = ega->blink & 0x10;
const int dwshift = doublewidth ? 1 : 0;
const int dotwidth = 1 << dwshift;
const int charwidth = dotwidth * (seq9dot ? 9 : 8);
const int cursoron = (ega->sc == (ega->crtc[10] & 31));
const int cursoraddr = (ega->crtc[0xe] << 8) | ega->crtc[0xf];
uint32_t addr;
int drawcursor;
uint32_t charaddr;
static int fg = 0;
static int bg = 0;
static uint32_t dat = 0x00000000;
static int cclock = 0;
static int disptime;
static int _dispontime;
static int _dispofftime;
ega_t *ega = (ega_t *) priv;
static uint8_t chr;
static uint8_t attr;
const bool doublewidth = ((ega->seqregs[1] & 8) != 0);
const bool attrblink = ((ega->attrregs[0x10] & 8) != 0);
const bool attrlinechars = (ega->attrregs[0x10] & 4);
const bool crtcreset = ((ega->crtc[0x17] & 0x80) == 0);
const bool seq9dot = ((ega->seqregs[1] & 1) == 0);
const bool blinked = ega->blink & 0x10;
const int dwshift = doublewidth ? 1 : 0;
const int dotwidth = 1 << dwshift;
const int charwidth = dotwidth * (seq9dot ? 9 : 8);
const int cursoron = (ega->sc == (ega->crtc[10] & 31));
const int cursoraddr = (ega->crtc[0xe] << 8) | ega->crtc[0xf];
uint32_t addr;
int drawcursor;
uint32_t charaddr;
static int fg = 0;
static int bg = 0;
static uint32_t dat = 0x00000000;
static int cclock = 0;
static int disptime;
static int _dispontime;
static int _dispofftime;
if (ega->seqregs[1] & 8) {
disptime = ((ega->crtc[0] + 2) << 1);
@@ -803,11 +831,9 @@ void
ega_poll(void *priv)
{
ega_t *ega = (ega_t *) priv;
int x, y;
int old_ma;
int wx = 640;
int wy = 350;
uint32_t blink_delay;
if (!ega->linepos) {
timer_advance_u64(&ega->timer, ega->dispofftime);
@@ -826,7 +852,7 @@ ega_poll(void *priv)
old_ma = ega->ma;
ega->displine *= ega->vres + 1;
ega->y_add *= ega->vres + 1;
for (y = 0; y <= ega->vres; y++) {
for (int y = 0; y <= ega->vres; y++) {
/* Render scanline */
ega->render(ega);
@@ -855,7 +881,7 @@ ega_poll(void *priv)
ega->stat &= ~8;
ega->vslines++;
if (ega->chipset) {
if (ega->hdisp > 640) {
if (ega->hdisp >= 800) {
if (ega->displine > 2000)
ega->displine = 0;
} else {
@@ -906,7 +932,7 @@ ega_poll(void *priv)
!(ega->real_vc & 1))
ega->vc++;
if (ega->chipset) {
if (ega->hdisp > 640)
if (ega->hdisp >= 800)
ega->vc &= 1023;
else
ega->vc &= 511;
@@ -925,7 +951,7 @@ ega_poll(void *priv)
}
if (ega->vc == ega->dispend) {
ega->dispon = 0;
blink_delay = (ega->crtc[11] & 0x60) >> 5;
uint32_t blink_delay = (ega->crtc[11] & 0x60) >> 5;
if (ega->crtc[10] & 0x20)
ega->cursoron = 0;
else if (blink_delay == 2)
@@ -946,14 +972,14 @@ ega_poll(void *priv)
#if 0
picint(1 << 2);
#endif
x = ega->hdisp;
// x = ega->hdisp;
if (ega->interlace && !ega->oddeven)
ega->lastline++;
if (ega->interlace && ega->oddeven)
ega->firstline--;
wx = x;
wx = ega->hdisp;
if (ega->vres) {
wy = (ega->lastline - ega->firstline) << 1;
@@ -1024,9 +1050,6 @@ ega_doblit(int wx, int wy, ega_t *ega)
int y_start = enable_overscan ? 0 : (unscaled_overscan_y >> 1);
int x_start = enable_overscan ? 0 : (overscan_x >> 1);
int bottom = (unscaled_overscan_y >> 1);
uint32_t *p;
int i;
int j;
int xs_temp;
int ys_temp;
@@ -1073,17 +1096,17 @@ ega_doblit(int wx, int wy, ega_t *ega)
if ((wx >= 160) && ((wy + 1) >= 120)) {
/* Draw (overscan_size - scroll size) lines of overscan on top and bottom. */
for (i = 0; i < ega->y_add; i++) {
p = &buffer32->line[i & 0x7ff][0];
for (int i = 0; i < ega->y_add; i++) {
uint32_t *p = &buffer32->line[i & 0x7ff][0];
for (j = 0; j < (xsize + x_add); j++)
for (int j = 0; j < (xsize + x_add); j++)
p[j] = ega->overscan_color;
}
for (i = 0; i < bottom; i++) {
p = &buffer32->line[(ysize + ega->y_add + i) & 0x7ff][0];
for (int i = 0; i < bottom; i++) {
uint32_t *p = &buffer32->line[(ysize + ega->y_add + i) & 0x7ff][0];
for (j = 0; j < (xsize + x_add); j++)
for (int j = 0; j < (xsize + x_add); j++)
p[j] = ega->overscan_color;
}
}
@@ -1107,12 +1130,11 @@ ega_remap_cpu_addr(uint32_t inaddr, ega_t *ega)
// bit 2: 1 = 128K mapping, 0 = other mapping (from memory decode PROM)
a0mux = 0;
if (ega->gdcreg[6] & 2) {
if (ega->gdcreg[6] & 2)
a0mux |= 2;
}
if (ega->vram_limit <= 64 * 1024) {
if (ega->vram_limit <= 64 * 1024)
a0mux |= 1;
}
switch (ega->gdcreg[6] & 0xC) {
case 0x0: // 128K A000
@@ -1179,9 +1201,8 @@ ega_write(uint32_t addr, uint8_t val, void *priv)
cycles -= video_timing_write_b;
if (ega->chain2_write) {
if (ega->chain2_write)
writemask2 &= 0x5 << (addr & 1);
}
addr = ega_remap_cpu_addr(addr, ega);
@@ -1361,9 +1382,8 @@ ega_read(uint32_t addr, void *priv)
cycles -= video_timing_read_b;
if (ega->chain2_read) {
if (ega->chain2_read)
readplane = (readplane & 2) | (addr & 1);
}
addr = ega_remap_cpu_addr(addr, ega);
@@ -1401,23 +1421,19 @@ ega_read(uint32_t addr, void *priv)
void
ega_init(ega_t *ega, int monitor_type, int is_mono)
{
int c;
int d;
int e;
ega->vram = malloc(0x40000);
ega->vrammask = 0x3ffff;
for (c = 0; c < 256; c++) {
e = c;
for (d = 0; d < 8; d++) {
for (uint16_t c = 0; c < 256; c++) {
int e = c;
for (uint8_t d = 0; d < 8; d++) {
ega_rotate[d][c] = e;
e = (e >> 1) | ((e & 1) ? 0x80 : 0);
}
}
if (is_mono) {
for (c = 0; c < 256; c++) {
for (uint16_t c = 0; c < 256; c++) {
if (((c >> 3) & 3) == 0)
pallook64[c] = pallook16[c] = makecol32(0, 0, 0);
else
@@ -1474,9 +1490,14 @@ ega_init(ega_t *ega, int monitor_type, int is_mono)
}
}
io_sethandler(0x03a0, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega);
uint16_t base_addr = 0x03a0;
#ifdef EGA_ALT_ADDR_SUPPORT
if (ega->alt_addr == 1)
base_addr = 0x02a0;
#endif
io_sethandler(base_addr, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega);
} else {
for (c = 0; c < 256; c++) {
for (uint16_t c = 0; c < 256; c++) {
pallook64[c] = makecol32(((c >> 2) & 1) * 0xaa, ((c >> 1) & 1) * 0xaa, (c & 1) * 0xaa);
pallook64[c] += makecol32(((c >> 5) & 1) * 0x55, ((c >> 4) & 1) * 0x55, ((c >> 3) & 1) * 0x55);
pallook16[c] = makecol32(((c >> 2) & 1) * 0xaa, ((c >> 1) & 1) * 0xaa, (c & 1) * 0xaa);
@@ -1562,11 +1583,9 @@ ega_set_type(void *priv, uint32_t local)
static void *
ega_standalone_init(const device_t *info)
{
ega_t *ega = malloc(sizeof(ega_t));
ega_t *ega = calloc(1, sizeof(ega_t));
int monitor_type;
memset(ega, 0x00, sizeof(ega_t));
video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_ega);
overscan_x = 16;
@@ -1622,7 +1641,7 @@ ega_standalone_init(const device_t *info)
}
}
monitor_type = device_get_config_int("monitor_type");
monitor_type = ega->chipset ? 0x09 : device_get_config_int("monitor_type");
ega_init(ega, monitor_type, (monitor_type & 0x0F) == 0x0B);
ega->vram_limit = device_get_config_int("memory") * 1024;
@@ -1631,12 +1650,19 @@ ega_standalone_init(const device_t *info)
mem_mapping_add(&ega->mapping, 0xa0000, 0x20000, ega_read, NULL, NULL, ega_write, NULL, NULL, NULL, MEM_MAPPING_EXTERNAL, ega);
if (ega_type == EGA_TYPE_COMPAQ)
mem_mapping_disable(&ega->mapping);
io_sethandler(0x03c0, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega);
uint16_t addr = 0x03c0;
#ifdef EGA_ALT_ADDR_SUPPORT
if (ega_type == EGA_TYPE_IBM) {
addr = device_get_config_hex16("base");
if (addr == 0x02c0)
ega->alt_addr = 1;
}
#endif
io_sethandler(addr, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega);
if (ega->chipset) {
io_sethandler(0x01ce, 0x0002, ega_in, NULL, NULL, ega_out, NULL, NULL, ega);
ega->eeprom = malloc(sizeof(ati_eeprom_t));
memset(ega->eeprom, 0, sizeof(ati_eeprom_t));
ega->eeprom = calloc(1, sizeof(ati_eeprom_t));
ati_eeprom_load((ati_eeprom_t *) ega->eeprom, "egawonder800p.nvr", 0);
} else if (info->local == EGA_COMPAQ) {
io_sethandler(0x0084, 0x0001, ega_in, NULL, NULL, ega_out, NULL, NULL, ega);
@@ -1712,6 +1738,66 @@ ega_speed_changed(void *priv)
0 = Switch closed (ON);
1 = Switch open (OFF). */
static const device_config_t ega_ibm_config[] = {
// clang-format off
{
.name = "memory",
.description = "Memory size",
.type = CONFIG_SELECTION,
.default_string = NULL,
.default_int = 256,
.file_filter = NULL,
.spinner = { 0 },
.selection = {
{ .description = "32 KB", .value = 32 },
{ .description = "64 KB", .value = 64 },
{ .description = "128 KB", .value = 128 },
{ .description = "256 KB", .value = 256 },
{ .description = "" }
},
.bios = { { 0 } }
},
{
.name = "monitor_type",
.description = "Monitor type",
.type = CONFIG_SELECTION,
.default_string = NULL,
.default_int = 9,
.file_filter = NULL,
.spinner = { 0 },
.selection = {
{ .description = "Monochrome (5151/MDA) (white)", .value = 0x0B | (DISPLAY_WHITE << 4) },
{ .description = "Monochrome (5151/MDA) (green)", .value = 0x0B | (DISPLAY_GREEN << 4) },
{ .description = "Monochrome (5151/MDA) (amber)", .value = 0x0B | (DISPLAY_AMBER << 4) },
{ .description = "Color 40x25 (5153/CGA)", .value = 0x06 },
{ .description = "Color 80x25 (5153/CGA)", .value = 0x07 },
{ .description = "Enhanced Color - Normal Mode (5154/ECD)", .value = 0x08 },
{ .description = "Enhanced Color - Enhanced Mode (5154/ECD)", .value = 0x09 },
{ .description = "" }
},
.bios = { { 0 } }
},
#ifdef EGA_ALT_ADDR_SUPPORT
{
.name = "base",
.description = "Address",
.type = CONFIG_HEX16,
.default_string = NULL,
.default_int = 0x03c0,
.file_filter = NULL,
.spinner = { 0 },
.selection = {
{ .description = "0x3C0", .value = 0x03c0 },
{ .description = "0x2C0", .value = 0x02c0 },
{ .description = "" }
},
.bios = { { 0 } }
},
#endif
{ .name = "", .description = "", .type = CONFIG_END }
// clang-format on
};
static const device_config_t ega_config[] = {
// clang-format off
{
@@ -1755,6 +1841,29 @@ static const device_config_t ega_config[] = {
// clang-format on
};
static const device_config_t atiega800p_config[] = {
// clang-format off
{
.name = "memory",
.description = "Memory size",
.type = CONFIG_SELECTION,
.default_string = NULL,
.default_int = 256,
.file_filter = NULL,
.spinner = { 0 },
.selection = {
{ .description = "32 KB", .value = 32 },
{ .description = "64 KB", .value = 64 },
{ .description = "128 KB", .value = 128 },
{ .description = "256 KB", .value = 256 },
{ .description = "" }
},
.bios = { { 0 } }
},
{ .name = "", .description = "", .type = CONFIG_END }
// clang-format on
};
const device_t ega_device = {
.name = "IBM EGA",
.internal_name = "ega",
@@ -1766,7 +1875,7 @@ const device_t ega_device = {
.available = ega_standalone_available,
.speed_changed = ega_speed_changed,
.force_redraw = NULL,
.config = ega_config
.config = ega_ibm_config
};
const device_t cpqega_device = {
@@ -1808,7 +1917,7 @@ const device_t atiega800p_device = {
.available = atiega800p_standalone_available,
.speed_changed = ega_speed_changed,
.force_redraw = NULL,
.config = ega_config
.config = atiega800p_config
};
const device_t iskra_ega_device = {

View File

@@ -310,16 +310,16 @@ typedef struct da2_t {
uint8_t fctl[32];
uint16_t crtc[32];
uint16_t crtc_vpreg[128];
uint8_t crtc_vpsel;
uint8_t crtc_vpsel;
uint8_t gdcreg[64];
uint8_t reg3ee[16];
int gdcaddr;
uint8_t attrc[0x40];
int attraddr, attrff;
int attr_palette_enable;
int outflipflop;
int inflipflop;
int iolatch;
int outflipflop;
int inflipflop;
int iolatch;
int ioctladdr;
int fctladdr;
@@ -385,8 +385,7 @@ typedef struct da2_t {
card should not attempt to display anything */
int override;
struct
{
struct {
int enable;
mem_mapping_t mapping;
uint8_t ram[DA2_SIZE_GAIJIRAM];
@@ -435,9 +434,9 @@ typedef struct da2_t {
uint32_t mmrdbg_vidaddr;
#endif
uint8_t pos_regs[8];
svga_t *mb_vga;
uint8_t monitorid;
uint8_t pos_regs[8];
svga_t *mb_vga;
uint8_t monitorid;
pc_timer_t timer_vidupd;
int old_pos2;
@@ -520,7 +519,7 @@ da2_WritePlaneDataWithBitmask(uint32_t destaddr, const uint16_t mask, pixel32 *s
da2->changedvram[(DA2_MASK_VRAMPLANE & destaddr) >> 9] = changeframecount;
destaddr <<= 3;
/* read destination data with big endian order */
for (int i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
writepx[i] = da2_vram_r((destaddr + 24) | i, da2)
| (da2_vram_r((destaddr + 16) | i, da2) << 8)
| (da2_vram_r((destaddr + 8) | i, da2) << 16)
@@ -532,7 +531,7 @@ da2_WritePlaneDataWithBitmask(uint32_t destaddr, const uint16_t mask, pixel32 *s
mask32.b[3] = mask32in.b[0];
mask32.b[2] = mask32in.b[1];
mask32.d &= 0xffff0000;
for (int i = 0; i < 8; i++) {
for (uint8_t i = 0; i < 8; i++) {
if (da2->bitblt.bitshift_destr > 0)
srcpx->p8[i] <<= 16 - da2->bitblt.bitshift_destr;
// #ifdef ENABLE_DA2_DEBUGBLT
@@ -560,7 +559,7 @@ da2_WritePlaneDataWithBitmask(uint32_t destaddr, const uint16_t mask, pixel32 *s
break;
}
}
for (int i = 0; i < 8; i++) {
for (uint8_t i = 0; i < 8; i++) {
da2_vram_w(destaddr | i, (writepx[i] >> 24) & 0xff, da2);
da2_vram_w((destaddr + 8) | i, (writepx[i] >> 16) & 0xff, da2);
}
@@ -571,7 +570,7 @@ da2_DrawColorWithBitmask(uint32_t destaddr, uint8_t color, uint16_t mask, da2_t
{
pixel32 srcpx;
/* fill data with input color */
for (int i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
srcpx.p8[i] = (color & (1 << i)) ? 0xffffffff : 0; /* read in word */
da2_WritePlaneDataWithBitmask(destaddr, mask, &srcpx, da2);
@@ -582,7 +581,7 @@ da2_CopyPlaneDataWithBitmask(uint32_t srcaddr, uint32_t destaddr, uint16_t mask,
pixel32 srcpx;
srcaddr &= 0xfffffffe;
srcaddr <<= 3;
for (int i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
srcpx.p8[i] = da2_vram_r((srcaddr + 24) | i, da2)
| (da2_vram_r((srcaddr + 16) | i, da2) << 8)
| (da2_vram_r((srcaddr + 8) | i, da2) << 16)
@@ -592,9 +591,9 @@ da2_CopyPlaneDataWithBitmask(uint32_t srcaddr, uint32_t destaddr, uint16_t mask,
}
/* get font data for bitblt operation */
static uint32_t
getRAMFont(int32_t code, int line, int x, void *p)
getRAMFont(int32_t code, int line, int x, void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
uint32_t font = 0;
#ifdef RESERVED_FOR_FUTURE_USE
int fline = line - 2; /* Start line of drawing character (line >= 1 AND line < 24 + 1 ) */
@@ -617,8 +616,7 @@ getRAMFont(int32_t code, int line, int x, void *p)
font |= da2->mmio.ram[code + 2];
font <<= 8;
font |= da2->mmio.ram[code + 3];
}
else
} else
font = 0;
return font;
}
@@ -641,12 +639,12 @@ da2_PutcharWithBitmask(uint32_t codeIBMJ, int width, uint16_t attr, int line, ui
uint32_t fontinv;
if (width <= 2) {
fontinv = ~font;
for (int i = 0; i < 8; i++) {
for (uint8_t i = 0; i < 8; i++) {
srcpx.p8[i] = (fg & (1 << i)) ? font >> 16 : 0;
srcpx.p8[i] |= (bg & (1 << i)) ? fontinv >> 16 : 0;
}
da2_WritePlaneDataWithBitmask(destaddr, maskl, &srcpx, da2);
for (int i = 0; i < 8; i++) {
for (uint8_t i = 0; i < 8; i++) {
srcpx.p8[i] = (fg & (1 << i)) ? font : 0;
srcpx.p8[i] |= (bg & (1 << i)) ? fontinv : 0;
}
@@ -654,12 +652,12 @@ da2_PutcharWithBitmask(uint32_t codeIBMJ, int width, uint16_t attr, int line, ui
} else {
font = (font & 0xfff80000) | ((font & 0x0000ffff) << 3);
fontinv = ~font;
for (int i = 0; i < 8; i++) {
for (uint8_t i = 0; i < 8; i++) {
srcpx.p8[i] = (fg & (1 << i)) ? font >> 16 : 0;
srcpx.p8[i] |= (bg & (1 << i)) ? fontinv >> 16 : 0;
}
da2_WritePlaneDataWithBitmask(destaddr, maskl, &srcpx, da2);
for (int i = 0; i < 8; i++) {
for (uint8_t i = 0; i < 8; i++) {
srcpx.p8[i] = (fg & (1 << i)) ? font : 0;
srcpx.p8[i] |= (bg & (1 << i)) ? fontinv : 0;
}
@@ -667,7 +665,7 @@ da2_PutcharWithBitmask(uint32_t codeIBMJ, int width, uint16_t attr, int line, ui
da2_WritePlaneDataWithBitmask(destaddr + 2, maskr, &srcpx, da2);
} else {
da2_WritePlaneDataWithBitmask(destaddr + 2, 0xffff, &srcpx, da2);
for (int i = 0; i < 8; i++) {
for (uint8_t i = 0; i < 8; i++) {
srcpx.p8[i] = (fg & (1 << i)) ? font << 16 : 0;
srcpx.p8[i] |= (bg & (1 << i)) ? fontinv << 16 : 0;
}
@@ -680,8 +678,8 @@ static uint8_t
pixel1tohex(uint32_t addr, int index, da2_t *da2)
{
uint8_t pixeldata = 0;
for (int j = 0; j < 8; j++) {
if (da2_vram_r(((addr << 3) | j) & (1 << (7 - index)), da2))
for (uint8_t i = 0; i < 8; j++) {
if (da2_vram_r(((addr << 3) | i) & (1 << (7 - index)), da2))
pixeldata++;
}
return pixeldata;
@@ -689,14 +687,14 @@ pixel1tohex(uint32_t addr, int index, da2_t *da2)
static void
print_pixelbyte(uint32_t addr, da2_t *da2)
{
for (int i = 0; i < 8; i++) {
for (uint8_t i = 0; i < 8; i++) {
pclog("%X", pixel1tohex(addr, i, da2));
}
}
static void
print_bytetobin(uint8_t b)
{
for (int i = 0; i < 8; i++) {
for (uint8_t i = 0; i < 8; i++) {
if (b & 0x80)
pclog("1");
else
@@ -723,13 +721,13 @@ IBMJtoSJIS(uint16_t knj)
knj -= 0x100;
if (knj <= 0x1f7d)
; /* do nothing */
else if (knj >= 0xb700 && knj <= 0xb75f) {
else if (knj >= 0xb700 && knj <= 0xb75f)
knj -= 0x90ec;
} else if (knj >= 0xb3f0 && knj <= 0xb67f) {
else if (knj >= 0xb3f0 && knj <= 0xb67f)
knj -= 0x906c;
} else if (knj >= 0x8000 && knj <= 0x8183) {
else if (knj >= 0x8000 && knj <= 0x8183)
knj -= 0x5524;
} else
else
return 0xffff;
uint32_t knj1 = knj / 0xBC;
uint32_t knj2 = knj - (knj1 * 0xBC);
@@ -850,8 +848,7 @@ da2_bitblt_load(da2_t *da2)
DOS/V Extension 1040x725 some DBCS uses 0xB0 others 0x90
*/
da2->bitblt.destoption = da2->bitblt.reg[0x2F];
if (da2->bitblt.destoption & 0x10) /* destaddr -= 2, length += 1; */
{
if (da2->bitblt.destoption & 0x10) { /* destaddr -= 2, length += 1; */
da2->bitblt.destaddr -= 2;
da2->bitblt.size_x += 1;
da2->bitblt.destpitch -= 2;
@@ -892,9 +889,9 @@ da2_bitblt_load(da2_t *da2)
da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2),
da2->bitblt.size_x, da2->bitblt.size_y);
#endif
}
/* Draw a line */
else if (da2->bitblt.reg[0x5] == 0x43) {
} else if (da2->bitblt.reg[0x5] == 0x43) {
da2->bitblt.exec = DA2_BLT_CLINE;
da2->bitblt.dest_x = (da2->bitblt.reg[0x32] & 0xffff);
da2->bitblt.dest_y = (da2->bitblt.reg[0x34] & 0xffff);
@@ -922,17 +919,17 @@ da2_bitblt_load(da2_t *da2)
da2_log(" ux1=%d,ux2=%d,uy1=%d,uy2=%d\n",
(da2->bitblt.reg[0x32] >> 16) & 0x7ff, (da2->bitblt.reg[0x33] >> 16) & 0x7ff,
(da2->bitblt.reg[0x34] >> 16) & 0x7ff, (da2->bitblt.reg[0x35] >> 16) & 0x7ff);
}
/* Fill a rectangle (or draw a horizontal / vertical line) */
else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x40 && da2->bitblt.reg[0x3D] == 0) {
} else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x40 && da2->bitblt.reg[0x3D] == 0) {
da2_log("fillrect x=%d, y=%d, w=%d, h=%d, c=%d, 2f=%x, rowcount=%x\n",
da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2),
da2->bitblt.size_x, da2->bitblt.size_y, da2->bitblt.reg[0x0], da2->bitblt.reg[0x2F], da2->rowoffset * 2);
da2->bitblt.exec = DA2_BLT_CFILLRECT;
da2->bitblt.destaddr += 2;
}
/* Tiling a rectangle ??(transfer tile data multiple times) os/2 only */
else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x0040 && da2->bitblt.reg[0x3D] == 0x40) {
} else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x0040 && da2->bitblt.reg[0x3D] == 0x40) {
da2->bitblt.exec = DA2_BLT_CFILLTILE;
da2->bitblt.destaddr += 2;
da2->bitblt.srcaddr = da2->bitblt.reg[0x2B];
@@ -942,9 +939,9 @@ da2_bitblt_load(da2_t *da2)
da2->bitblt.reg[0x2B] % (da2->rowoffset * 2), da2->bitblt.reg[0x2B] / (da2->rowoffset * 2),
da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2),
da2->bitblt.size_x, da2->bitblt.size_y);
}
/* Tiling a rectangle (transfer tile data multiple times) */
else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x1040 && da2->bitblt.reg[0x3D] == 0x40) {
} else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x1040 && da2->bitblt.reg[0x3D] == 0x40) {
da2->bitblt.exec = DA2_BLT_CFILLTILE;
da2->bitblt.destaddr += 2;
da2->bitblt.srcaddr = da2->bitblt.reg[0x2B];
@@ -954,9 +951,9 @@ da2_bitblt_load(da2_t *da2)
da2->bitblt.reg[0x2B] % (da2->rowoffset * 2), da2->bitblt.reg[0x2B] / (da2->rowoffset * 2),
da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2),
da2->bitblt.size_x, da2->bitblt.size_y);
}
/* Block copy */
else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x1040 && da2->bitblt.reg[0x3D] == 0x00) {
} else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x1040 && da2->bitblt.reg[0x3D] == 0x00) {
da2->bitblt.exec = DA2_BLT_CCOPYF;
da2->bitblt.srcaddr = da2->bitblt.reg[0x2A];
da2->bitblt.destaddr += 2;
@@ -965,9 +962,9 @@ da2_bitblt_load(da2_t *da2)
da2->bitblt.reg[0x2A] % (da2->rowoffset * 2), da2->bitblt.reg[0x2A] / (da2->rowoffset * 2),
da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2),
da2->bitblt.size_x, da2->bitblt.size_y);
}
/* Block copy but reversed direction */
else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x1140 && da2->bitblt.reg[0x3D] == 0x00) {
} else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x1140 && da2->bitblt.reg[0x3D] == 0x00) {
da2->bitblt.exec = DA2_BLT_CCOPYR;
da2->bitblt.srcaddr = da2->bitblt.reg[0x2A];
da2->bitblt.destaddr -= 2;
@@ -980,9 +977,9 @@ da2_bitblt_load(da2_t *da2)
}
}
static void
da2_bitblt_exec(void *p)
da2_bitblt_exec(void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
// timer_set_delay_u64(&da2->bitblt.timer, da2->bitblt.timerspeed);
#ifdef ENABLE_DA2_DEBUGBLT_DETAIL
if (!(da2->bitblt.debug_exesteps & 0xff))
@@ -1180,9 +1177,9 @@ da2_bitblt_dopayload(void *priv)
}
}
static void
da2_bitblt_addpayload(uint8_t val, void *p)
da2_bitblt_addpayload(uint8_t val, void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
da2->bitblt.indata = 1;
if (da2->bitblt.payload_addr >= DA2_BLT_MEMSIZE)
da2_log("da2_mmio_write payload overflow! addr %x, val %x\n", da2->bitblt.payload_addr, val);
@@ -1222,9 +1219,9 @@ da2_bitblt_addpayload(uint8_t val, void *p)
}
static void
da2_out(uint16_t addr, uint16_t val, void *p)
da2_out(uint16_t addr, uint16_t val, void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
int oldval;
/*
3E0 3E1 Sequencer Registers (undoc)
@@ -1403,7 +1400,7 @@ da2_out(uint16_t addr, uint16_t val, void *p)
if (da2->attraddr < 16)
da2->fullchange = changeframecount;
if (da2->attraddr == LV_MODE_CONTROL || da2->attraddr < 0x10) {
for (int c = 0; c < 16; c++) {
for (uint8_t c = 0; c < 16; c++) {
// if (da2->attrc[LV_MODE_CONTROL] & 0x80) da2->egapal[c] = (da2->attrc[c] & 0xf) | ((da2->attrc[0x14] & 0xf) << 4);
// else da2->egapal[c] = (da2->attrc[c] & 0x3f) | ((da2->attrc[0x14] & 0xc) << 4);
if (da2->attrc[LV_MODE_CONTROL] & 0x80)
@@ -1486,9 +1483,9 @@ da2_out(uint16_t addr, uint16_t val, void *p)
}
static uint16_t
da2_in(uint16_t addr, void *p)
da2_in(uint16_t addr, void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
uint16_t temp = 0xff;
switch (addr) {
@@ -1620,9 +1617,9 @@ da2_in(uint16_t addr, void *p)
* out b(idx), in w(data)
*/
static void
da2_outb(uint16_t addr, uint8_t val, void *p)
da2_outb(uint16_t addr, uint8_t val, void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
da2_iolog("DA2 Outb addr %03X val %02X %04X:%04X es:di=%x:%x ds:si=%x:%x\n", addr, val, cs >> 4, cpu_state.pc, ES, DI, DS, SI);
da2->inflipflop = 0;
switch (addr) {
@@ -1651,10 +1648,10 @@ da2_outb(uint16_t addr, uint8_t val, void *p)
da2_out(addr, da2->iolatch, da2);
}
void
da2_outw(uint16_t addr, uint16_t val, void *p)
da2_outw(uint16_t addr, uint16_t val, void *priv)
{
da2_iolog("DA2 Outw addr %03X val %04X\n", addr, val);
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
da2->inflipflop = 0;
switch (addr) {
case LS_INDEX:
@@ -1703,10 +1700,10 @@ da2_outw(uint16_t addr, uint16_t val, void *p)
}
}
static uint8_t
da2_inb(uint16_t addr, void *p)
da2_inb(uint16_t addr, void *priv)
{
uint8_t temp;
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
da2->outflipflop = 0;
switch (addr) {
case LC_DATA:
@@ -1736,10 +1733,10 @@ da2_inb(uint16_t addr, void *p)
return temp;
}
static uint16_t
da2_inw(uint16_t addr, void *p)
da2_inw(uint16_t addr, void *priv)
{
uint16_t temp;
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
da2->inflipflop = 0;
da2->outflipflop = 0;
temp = da2_in(addr, da2);
@@ -1748,9 +1745,9 @@ da2_inw(uint16_t addr, void *p)
}
/* IO 03DAh : Input Status Register 2 for DOSSHELL used by DOS J4.0 */
static uint8_t
da2_in_ISR(uint16_t addr, void *p)
da2_in_ISR(uint16_t addr, void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
uint8_t temp = 0;
if (addr == 0x3da) {
if (da2->cgastat & 0x01)
@@ -1764,9 +1761,9 @@ da2_in_ISR(uint16_t addr, void *p)
}
static void
da2_out_ISR(uint16_t addr, uint8_t val, void *p)
da2_out_ISR(uint16_t addr, uint8_t val, void *priv)
{
// da2_t* da2 = (da2_t*)p;
// da2_t* da2 = (da2_t*) priv;
da2_iolog("DA2D Out %04X %04X %04X:%04X\n", addr, val, cs >> 4, cpu_state.pc);
}
@@ -1872,9 +1869,9 @@ The Font ROM can be accessed via 128 KB memory window located at A0000-BFFFFh.
/* Get character line pattern from jfont rom or gaiji volatile memory */
static uint32_t
getfont_ps55dbcs(int32_t code, int32_t line, void *p)
getfont_ps55dbcs(int32_t code, int32_t line, void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
uint32_t font = 0;
int32_t fline = line - 2; /* Start line of drawing character (line >= 1 AND line < 24 + 1 ) */
if (code >= 0x8000 && code <= 0x8183)
@@ -2424,7 +2421,7 @@ da2_mapping_update(da2_t *da2)
// da2_recalc_mapping(da2);
if (da2->pos_regs[2] & 0x01) {
da2_log("DA2 enable registers\n");
for (int i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
da2_log("DA2 POS[%d]: %x\n", i, da2->pos_regs[i]);
io_sethandler(0x03c0, 0x000a, da2_inb, da2_inw, NULL, da2_outb, da2_outw, NULL, da2);
io_sethandler(0x03e0, 0x0010, da2_inb, da2_inw, NULL, da2_outb, da2_outw, NULL, da2);
@@ -2444,16 +2441,16 @@ da2_mapping_update(da2_t *da2)
}
static uint8_t
da2_mca_read(int port, void *p)
da2_mca_read(int port, void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
return da2->pos_regs[port & 7];
}
static void
da2_mca_write(int port, uint8_t val, void *p)
da2_mca_write(int port, uint8_t val, void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
da2_log("da2_mca_write: port=%04x val=%02x\n", port, val);
@@ -2473,9 +2470,9 @@ da2_mca_feedb(void *priv)
}
static void
da2_mca_reset(void *p)
da2_mca_reset(void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
da2_log("da2_mca_reset called.\n");
da2_reset(da2);
da2_mca_write(0x102, 0, da2);
@@ -2485,7 +2482,7 @@ da2_mca_reset(void *p)
static void
da2_gdcropB(uint32_t addr,uint8_t bitmask, da2_t *da2)
{
for (int i = 0; i < 8; i++) {
for (uint8_t i = 0; i < 8; i++) {
if (da2->planemask & (1 << i)) {
// da2_log("da2_gdcropB o%x a%x d%x p%d m%x\n", da2->gdcreg[LG_COMMAND] & 0x03, addr, da2->gdcinput[i], i, bitmask);
switch (da2->gdcreg[LG_COMMAND] & 0x03) {
@@ -2518,7 +2515,7 @@ da2_gdcropW(uint32_t addr, uint16_t bitmask, da2_t *da2)
// if((addr & 8)) bitmask = da2_rightrotate(bitmask, 8);
uint8_t bitmask_l = bitmask & 0xff;
uint8_t bitmask_h = bitmask >> 8;
for (int i = 0; i < 8; i++) {
for (uint8_t i = 0; i < 8; i++) {
if (da2->planemask & (1 << i)) {
// da2_log("da2_gdcropW m%x a%x d%x i%d ml%x mh%x\n", da2->gdcreg[LG_COMMAND] & 0x03, addr, da2->gdcinput[i], i, da2->gdcreg[LG_BIT_MASK_LOW], da2->gdcreg[LG_BIT_MASK_HIGH]);
switch (da2->gdcreg[LG_COMMAND] & 0x03) {
@@ -2556,9 +2553,9 @@ da2_gdcropW(uint32_t addr, uint16_t bitmask, da2_t *da2)
}
static uint8_t
da2_mmio_read(uint32_t addr, void *p)
da2_mmio_read(uint32_t addr, void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
uint32_t index = 0;
addr &= DA2_MASK_MMIO;
if (da2->ioctl[LS_MMIO] & 0x10) {
@@ -2604,14 +2601,14 @@ da2_mmio_read(uint32_t addr, void *p)
}
} else if (!(da2->ioctl[LS_MODE] & 1)) { /* 16 or 256 color mode */
cycles -= video_timing_read_b;
for (int i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
da2->gdcla[i] = da2->vram[(addr << 3) | i]; /* read in byte */
#ifdef ENABLE_DA2_DEBUGVRAM
da2_log("da2_Rb: %05x=%02x\n", addr, da2->gdcla[da2->readplane]);
#endif
if (da2->gdcreg[LG_MODE] & 0x08) { /* compare data across planes if the read mode bit (3EB 05, bit 3) is 1 */
uint8_t ret = 0;
for (int i = 0; i < 8; i++) {
for (uint8_t i = 0; i < 8; i++) {
if (~da2->gdcreg[LG_COLOR_DONT_CARE] & (1 << i)) /* color don't care register */
ret |= da2->gdcla[i] ^ ((da2->gdcreg[LG_COLOR_COMPAREJ] & (1 << i)) ? 0xff : 0);
}
@@ -2624,9 +2621,9 @@ da2_mmio_read(uint32_t addr, void *p)
}
}
static uint16_t
da2_mmio_readw(uint32_t addr, void *p)
da2_mmio_readw(uint32_t addr, void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
// da2_log("da2_readW: %x %x %x %x %x\n", da2->ioctl[LS_MMIO], da2->fctl[LF_MMIO_SEL], da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr);
// da2_log("da2_readW: %x %x %x %x %x CS:PC=%4x:%4x\n", da2->ioctl[LS_MMIO], da2->fctl[LF_MMIO_SEL], da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr, CS, cpu_state.pc);
@@ -2635,7 +2632,7 @@ da2_mmio_readw(uint32_t addr, void *p)
} else if (!(da2->ioctl[LS_MODE] & 1)) {/* 16 color or 256 color mode */
cycles -= video_timing_read_w;
addr &= DA2_MASK_MMIO;
for (int i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
da2->gdcla[i] = (uint16_t) (da2->vram[(addr << 3) | i]) | ((uint16_t) (da2->vram[((addr << 3) + 8) | i]) << 8); /* read vram into latch */
#ifdef ENABLE_DA2_DEBUGVRAM
@@ -2643,10 +2640,10 @@ da2_mmio_readw(uint32_t addr, void *p)
// if (((int)addr - (int)da2->mmrdbg_vidaddr) > 2 || (((int)da2->mmrdbg_vidaddr - (int)addr) > 2) || da2->mmrdbg_vidaddr == addr)
//{
// fprintf(da2->mmrdbg_fp, "\nR %x ", addr);
// for (int i = 0; i <= 0xb; i++)
// for (uint8_t i = 0; i <= 0xb; i++)
// fprintf(da2->mmrdbg_fp, "%02x ", da2->gdcreg[i]);
// }
// for (int i = 0; i < 16; i++)
// for (uint8_t i = 0; i < 16; i++)
//{
// int pixeldata = 0;
// if (da2->gdcla[da2->readplane] & (1 << (15 - i))) pixeldata = 1;
@@ -2658,7 +2655,7 @@ da2_mmio_readw(uint32_t addr, void *p)
if (da2->gdcreg[LG_MODE] & 0x08) { /* compare data across planes if the read mode bit (3EB 05, bit 3) is 1 */
uint16_t ret = 0;
for (int i = 0; i < 8; i++) {
for (uint8_t i = 0; i < 8; i++) {
if (~da2->gdcreg[LG_COLOR_DONT_CARE] & (1 << i)) /* color don't care register */
ret |= da2->gdcla[i] ^ ((da2->gdcreg[LG_COLOR_COMPAREJ] & (1 << i)) ? 0xffff : 0);
}
@@ -2674,9 +2671,9 @@ da2_mmio_readw(uint32_t addr, void *p)
}
}
static void
da2_mmio_write(uint32_t addr, uint8_t val, void *p)
da2_mmio_write(uint32_t addr, uint8_t val, void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
uint32_t index = 0;
// da2_log("da2_mmio_write %x %x\n", addr, val);
// if ((addr & ~DA2_MASK_MMIO) != 0xA0000)
@@ -2735,10 +2732,10 @@ da2_mmio_write(uint32_t addr, uint8_t val, void *p)
//{
if (((int) addr - (int) da2->mmdbg_vidaddr) > 2 || (((int) da2->mmdbg_vidaddr - (int) addr) > 2) || da2->mmdbg_vidaddr == addr) {
fprintf(da2->mmdbg_fp, "\nB %x %02x ", addr, val);
for (int i = 0; i <= 0xb; i++)
for (uint8_t i = 0; i <= 0xb; i++)
fprintf(da2->mmdbg_fp, "%02x ", da2->gdcreg[i]);
}
for (int i = 0; i < 8; i++) {
for (uint8_t i = 0; i < 8; i++) {
int pixeldata = 0;
if (val & (1 << (7 - i)))
pixeldata = (da2->planemask & 0xf);
@@ -2751,14 +2748,14 @@ da2_mmio_write(uint32_t addr, uint8_t val, void *p)
da2->changedvram[addr >> 9] = changeframecount;/* 0x1FFFF -> 0x1F */
addr <<= 3;
for (int i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
da2->gdcsrc[i] = da2->gdcla[i]; /* use latch */
// da2_log("da2_Wb m%02x r%02x %05x:%02x %x:%x\n", da2->gdcreg[0x5], da2->gdcreg[LG_COMMAND], addr >> 3, val, cs >> 4, cpu_state.pc);
// da2_log("da2_Wb m%02x r%02x %05x:%02x=%02x%02x%02x%02x->", da2->gdcreg[0x5], da2->gdcreg[LG_COMMAND], addr >> 3, val, da2->vram[addr + 0], da2->vram[addr + 1], da2->vram[addr + 2], da2->vram[addr + 3]);
if (!(da2->gdcreg[LG_COMMAND] & 0x08)) {
for (int i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
if (da2->gdcreg[LG_ENABLE_SRJ] & (1 << i))
da2->gdcinput[i] = (da2->gdcreg[LG_SET_RESETJ] & (1 << i)) ? 0xff : 0;
else if (da2->gdcreg[LG_SET_RESETJ] & (1 << i))
@@ -2771,7 +2768,7 @@ da2_mmio_write(uint32_t addr, uint8_t val, void *p)
switch (da2->writemode) {
case 2: /* equiv to vga write mode 1 */
for (int i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
if (da2->planemask & (1 << i))
da2_vram_w(addr | i, da2->gdcsrc[i], da2);
break;
@@ -2779,11 +2776,11 @@ da2_mmio_write(uint32_t addr, uint8_t val, void *p)
if (da2->gdcreg[LG_DATA_ROTATION] & 7)
val = svga_rotate[da2->gdcreg[LG_DATA_ROTATION] & 7][val];
if (bitmask == 0xff && !(da2->gdcreg[LG_COMMAND] & 0x03) && (!da2->gdcreg[LG_ENABLE_SRJ])) {
for (int i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
if (da2->planemask & (1 << i))
da2_vram_w(addr | i, val, da2);
} else {
for (int i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
if (da2->gdcreg[LG_ENABLE_SRJ] & (1 << i))
da2->gdcinput[i] = (da2->gdcreg[LG_SET_RESETJ] & (1 << i)) ? 0xff : 0;
else
@@ -2792,7 +2789,7 @@ da2_mmio_write(uint32_t addr, uint8_t val, void *p)
}
break;
case 1:/* equiv to vga write mode 2 */
for (int i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
da2->gdcinput[i] = ((val & (1 << i)) ? 0xff : 0);
da2_gdcropB(addr, bitmask, da2);
break;
@@ -2801,7 +2798,7 @@ da2_mmio_write(uint32_t addr, uint8_t val, void *p)
val = svga_rotate[da2->gdcreg[LG_DATA_ROTATION] & 7][val];
bitmask &= val;
for (int i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
da2->gdcinput[i] = (da2->gdcreg[LG_SET_RESETJ] & (1 << i)) ? 0xff : 0;
da2_gdcropB(addr, bitmask, da2);
break;
@@ -2818,9 +2815,9 @@ da2_rightrotate(uint16_t data, uint8_t count)
return (data >> count) | (data << (sizeof(data) * 8 - count));
}
static void
da2_mmio_gc_writeW(uint32_t addr, uint16_t val, void *p)
da2_mmio_gc_writeW(uint32_t addr, uint16_t val, void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
uint16_t bitmask;
addr &= DA2_MASK_MMIO;
bitmask = da2->gdcreg[LG_BIT_MASK_HIGH];
@@ -2832,10 +2829,10 @@ da2_mmio_gc_writeW(uint32_t addr, uint16_t val, void *p)
if (((int) addr - (int) da2->mmdbg_vidaddr) > 2 || (((int) da2->mmdbg_vidaddr - (int) addr) > 2) || da2->mmdbg_vidaddr == addr) {
fprintf(da2->mmdbg_fp, "\nW %x %x ", addr, val);
for (int i = 0; i <= 0xb; i++)
for (uint8_t i = 0; i <= 0xb; i++)
fprintf(da2->mmdbg_fp, "%02x ", da2->gdcreg[i]);
}
for (int i = 0; i < 16; i++) {
for (uint8_t i = 0; i < 16; i++) {
int pixeldata = 0;
if (val & (1 << (15 - i)))
pixeldata = (da2->planemask & 0xf);
@@ -2851,11 +2848,11 @@ da2_mmio_gc_writeW(uint32_t addr, uint16_t val, void *p)
da2->changedvram[addr >> 9] = changeframecount;
addr <<= 3;
for (int i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
da2->gdcsrc[i] = da2->gdcla[i]; /* use latch */
if (!(da2->gdcreg[LG_COMMAND] & 0x08)) {
for (int i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
if (da2->gdcreg[LG_ENABLE_SRJ] & (1 << i))
da2->gdcinput[i] = (da2->gdcreg[LG_SET_RESETJ] & (1 << i)) ? 0xffff : 0;
else if (da2->gdcreg[LG_SET_RESETJ] & (1 << i))
@@ -2869,7 +2866,7 @@ da2_mmio_gc_writeW(uint32_t addr, uint16_t val, void *p)
// , da2->vram[addr + 8], da2->vram[addr + 9], da2->vram[addr + 10], da2->vram[addr + 11]);
switch (da2->writemode) {
case 2:
for (int i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
if (da2->planemask & (1 << i)) {
da2_vram_w(addr | i, da2->gdcsrc[i] & 0xff, da2);
da2_vram_w((addr + 8) | i, da2->gdcsrc[i] >> 8, da2);
@@ -2879,13 +2876,13 @@ da2_mmio_gc_writeW(uint32_t addr, uint16_t val, void *p)
if (da2->gdcreg[LG_DATA_ROTATION] & 15)
val = da2_rightrotate(val, da2->gdcreg[LG_DATA_ROTATION] & 15);
if (bitmask == 0xffff && !(da2->gdcreg[LG_COMMAND] & 0x03) && (!da2->gdcreg[LG_ENABLE_SRJ])) {
for (int i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
if (da2->planemask & (1 << i)) {
da2_vram_w(addr | i, val & 0xff, da2);
da2_vram_w((addr + 8) | i, val >> 8, da2);
}
} else {
for (int i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
if (da2->gdcreg[LG_ENABLE_SRJ] & (1 << i))
da2->gdcinput[i] = (da2->gdcreg[LG_SET_RESETJ] & (1 << i)) ? 0xffff : 0;
else
@@ -2895,7 +2892,7 @@ da2_mmio_gc_writeW(uint32_t addr, uint16_t val, void *p)
}
break;
case 1:
for (int i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
da2->gdcinput[i] = ((val & (1 << i)) ? 0xffff : 0);
da2_gdcropW(addr, bitmask, da2);
break;
@@ -2904,7 +2901,7 @@ da2_mmio_gc_writeW(uint32_t addr, uint16_t val, void *p)
val = da2_rightrotate(val, da2->gdcreg[LG_DATA_ROTATION] & 15);
bitmask &= val;
for (int i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
da2->gdcinput[i] = (da2->gdcreg[LG_SET_RESETJ] & (1 << i)) ? 0xffff : 0;
da2_gdcropW(addr, bitmask, da2);
break;
@@ -2913,9 +2910,9 @@ da2_mmio_gc_writeW(uint32_t addr, uint16_t val, void *p)
// , da2->vram[addr + 8], da2->vram[addr + 9], da2->vram[addr + 10], da2->vram[addr + 11]);
}
static void
da2_mmio_writew(uint32_t addr, uint16_t val, void *p)
da2_mmio_writew(uint32_t addr, uint16_t val, void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
// if (da2->bitblt.exec != DA2_BLT_CIDLE) /* Bitblt is in operation. */
// return;
// if ((addr & ~0x1ffff) != 0xA0000) return;
@@ -2941,52 +2938,52 @@ da2_mmio_writew(uint32_t addr, uint16_t val, void *p)
}
static void
da2_code_write(uint32_t addr, uint8_t val, void *p)
da2_code_write(uint32_t addr, uint8_t val, void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
// if ((addr & ~0xfff) != 0xE0000) return;
addr &= DA2_MASK_CRAM;
da2->cram[addr] = val;
da2->fullchange = 2;
}
static void
da2_code_writeb(uint32_t addr, uint8_t val, void *p)
da2_code_writeb(uint32_t addr, uint8_t val, void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
// da2_log("DA2_code_writeb: Write to %x, val %x\n", addr, val);
cycles -= video_timing_write_b;
da2_code_write(addr, val, da2);
}
static void
da2_code_writew(uint32_t addr, uint16_t val, void *p)
da2_code_writew(uint32_t addr, uint16_t val, void *priv)
{
// da2_log("DA2_code_writ ew: Write to %x, val %x\n", addr, val);
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
cycles -= video_timing_write_w;
da2_code_write(addr, val & 0xff, da2);
da2_code_write(addr + 1, val >> 8, da2);
}
static uint8_t
da2_code_read(uint32_t addr, void *p)
da2_code_read(uint32_t addr, void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
// if ((addr & ~DA2_MASK_CRAM) != 0xE0000)
// return DA2_INVALIDACCESS8;
addr &= DA2_MASK_CRAM;
return da2->cram[addr];
}
static uint8_t
da2_code_readb(uint32_t addr, void *p)
da2_code_readb(uint32_t addr, void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
cycles -= video_timing_read_b;
return da2_code_read(addr, da2);
}
static uint16_t
da2_code_readw(uint32_t addr, void *p)
da2_code_readw(uint32_t addr, void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
cycles -= video_timing_read_w;
return da2_code_read(addr, da2) | (da2_code_read(addr + 1, da2) << 8);
}
@@ -3153,9 +3150,9 @@ da2_poll(void *priv)
}
static void
da2_loadfont(char *fname, void *p)
da2_loadfont(char *fname, void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
uint8_t buf;
uint64_t fsize;
if (!fname)
@@ -3239,7 +3236,7 @@ da2_reset(void *priv)
da2->attr_palette_enable = 0; /* disable attribute generator */
/* Set default color palette (Windows 3.1 display driver won't reset palette) */
for (int i = 0; i < 256; i++) {
for (uint16_t i = 0; i < 256; i++) {
da2->vgapal[i].r = ps55_palette_color[i & 0x3F][0];
da2->vgapal[i].g = ps55_palette_color[i & 0x3F][1];
da2->vgapal[i].b = ps55_palette_color[i & 0x3F][2];
@@ -3320,95 +3317,95 @@ da2_available(void)
}
static void
da2_close(void *p)
da2_close(void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
/* dump mem for debug */
#ifdef ENABLE_DA2_LOG
FILE *f;
f = fopen("da2_cram.dmp", "wb");
if (f != NULL) {
fwrite(da2->cram, DA2_SIZE_CRAM, 1, f);
fclose(f);
FILE *fp;
fp = fopen("da2_cram.dmp", "wb");
if (fp != NULL) {
fwrite(da2->cram, DA2_SIZE_CRAM, 1, fp);
fclose(fp);
}
f = fopen("da2_vram.dmp", "wb");
if (f != NULL) {
fwrite(da2->vram, DA2_SIZE_VRAM, 1, f);
fclose(f);
fp = fopen("da2_vram.dmp", "wb");
if (fp != NULL) {
fwrite(da2->vram, DA2_SIZE_VRAM, 1, fp);
fclose(fp);
}
f = fopen("da2_gram.dmp", "wb");
if (f != NULL) {
fwrite(da2->mmio.ram, DA2_SIZE_GAIJIRAM, 1, f);
fclose(f);
fp = fopen("da2_gram.dmp", "wb");
if (fp != NULL) {
fwrite(da2->mmio.ram, DA2_SIZE_GAIJIRAM, 1, fp);
fclose(fp);
}
f = fopen("da2_attrpal.dmp", "wb");
if (f != NULL) {
fwrite(da2->attrc, 32, 1, f);
fclose(f);
fp = fopen("da2_attrpal.dmp", "wb");
if (fp != NULL) {
fwrite(da2->attrc, 32, 1, fp);
fclose(fp);
}
f = fopen("da2_dacrgb.dmp", "wb");
if (f != NULL) {
fwrite(da2->vgapal, 3 * 256, 1, f);
fclose(f);
fp = fopen("da2_dacrgb.dmp", "wb");
if (fp != NULL) {
fwrite(da2->vgapal, 3 * 256, 1, fp);
fclose(fp);
}
f = fopen("da2_daregs.txt", "w");
if (f != NULL) {
for (int i = 0; i < 0x10; i++)
fprintf(f, "3e1(ioctl) %02X: %4X\n", i, da2->ioctl[i]);
for (int i = 0; i < 0x20; i++)
fprintf(f, "3e3(fctl) %02X: %4X\n", i, da2->fctl[i]);
for (int i = 0; i < 0x20; i++)
fprintf(f, "3e5(crtc) %02X: %4X\n", i, da2->crtc[i]);
for (int i = 0; i < 0x40; i++)
fprintf(f, "3e8(attr) %02X: %4X\n", i, da2->attrc[i]);
for (int i = 0; i < 0x10; i++)
fprintf(f, "3eb(gcr) %02X: %4X\n", i, da2->gdcreg[i]);
for (int i = 0; i < 0x10; i++)
fprintf(f, "3ee(?) %02X: %4X\n", i, da2->reg3ee[i]);
for (int i = 0; i < 0x20; i++) {
fprintf(f, "vp %02X: %4X %4X %4X %4X\n", i,
fp = fopen("da2_daregs.txt", "w");
if (fp != NULL) {
for (uint8_t i = 0; i < 0x10; i++)
fprintf(fp, "3e1(ioctl) %02X: %4X\n", i, da2->ioctl[i]);
for (uint8_t i = 0; i < 0x20; i++)
fprintf(fp, "3e3(fctl) %02X: %4X\n", i, da2->fctl[i]);
for (uint8_t i = 0; i < 0x20; i++)
fprintf(fp, "3e5(crtc) %02X: %4X\n", i, da2->crtc[i]);
for (uint8_t i = 0; i < 0x40; i++)
fprintf(fp, "3e8(attr) %02X: %4X\n", i, da2->attrc[i]);
for (uint8_t i = 0; i < 0x10; i++)
fprintf(fp, "3eb(gcr) %02X: %4X\n", i, da2->gdcreg[i]);
for (uint8_t i = 0; i < 0x10; i++)
fprintf(fp, "3ee(?) %02X: %4X\n", i, da2->reg3ee[i]);
for (uint8_t i = 0; i < 0x20; i++) {
fprintf(fp, "vp %02X: %4X %4X %4X %4X\n", i,
da2->crtc_vpreg[0 + i], da2->crtc_vpreg[0x20 + i], da2->crtc_vpreg[0x40 + i], da2->crtc_vpreg[0x60 + i]);
}
fclose(f);
fclose(fp);
}
f = fopen("ram_low.dmp", "wb");
if (f != NULL) {
fwrite(&ram[0x0], 0x100000, 1, f);
fclose(f);
fp = fopen("ram_low.dmp", "wb");
if (fp != NULL) {
fwrite(&ram[0x0], 0x100000, 1, fp);
fclose(fp);
}
pclog("closed %04X:%04X DS %04X\n", cs >> 4, cpu_state.pc, DS);
#endif
#ifdef ENABLE_DA2_DEBUGBLT
f = fopen("da2_bltdump.csv", "w");
if (f != NULL && da2->bitblt.debug_reg_ip > 0) {
fp = fopen("da2_bltdump.csv", "w");
if (fp != NULL && da2->bitblt.debug_reg_ip > 0) {
/* print header */
for (int y = 0; y < DA2_DEBUG_BLTLOG_SIZE; y++) {
if (da2->bitblt.debug_reg[(da2->bitblt.debug_reg_ip - 1) * DA2_DEBUG_BLTLOG_SIZE + y] != DA2_DEBUG_BLT_NEVERUSED)
fprintf(f, "\"%02X\"\t", y);
fprintf(fp, "\"%02X\"\t", y);
}
fprintf(f, "\n");
fprintf(fp, "\n");
/* print data */
for (int x = 0; x < da2->bitblt.debug_reg_ip; x++) {
for (int y = 0; y < DA2_DEBUG_BLTLOG_SIZE; y++) {
if (da2->bitblt.debug_reg[x * DA2_DEBUG_BLTLOG_SIZE + y] == DA2_DEBUG_BLT_NEVERUSED)
;
else if (da2->bitblt.debug_reg[x * DA2_DEBUG_BLTLOG_SIZE + y] == DA2_DEBUG_BLT_USEDRESET)
fprintf(f, "\"\"\t");
fprintf(fp, "\"\"\t");
else {
fprintf(f, "\"%X\"\t", da2->bitblt.debug_reg[x * DA2_DEBUG_BLTLOG_SIZE + y]);
fprintf(fp, "\"%X\"\t", da2->bitblt.debug_reg[x * DA2_DEBUG_BLTLOG_SIZE + y]);
if (y == 0x12) {
int chr = da2->bitblt.debug_reg[x * DA2_DEBUG_BLTLOG_SIZE + 0x12];
if ((chr >= 0x20) && (chr < 0x7f))
fprintf(f, "\"%c\"\t", chr);
fprintf(fp, "\"%c\"\t", chr);
else
fprintf(f, "\"\"\t");
fprintf(fp, "\"\"\t");
}
}
}
fprintf(f, "\n");
fprintf(fp, "\n");
}
fclose(f);
fclose(fp);
}
free(da2->bitblt.debug_reg);
#endif
@@ -3426,28 +3423,28 @@ da2_close(void *p)
}
static void
da2_speed_changed(void *p)
da2_speed_changed(void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
da2->da2const = (uint64_t) ((cpuclock / DA2_PIXELCLOCK) * (double) (1ull << 32));
da2_recalctimings(da2);
}
static void
da2_force_redraw(void *p)
da2_force_redraw(void *priv)
{
da2_t *da2 = (da2_t *) p;
da2_t *da2 = (da2_t *) priv;
da2->fullchange = changeframecount;
}
static const device_config_t da2_configuration[] = {
// clang-format off
{
.name = "charset",
.name = "charset",
.description = "Charset",
.type = CONFIG_SELECTION,
.type = CONFIG_SELECTION,
.default_int = DA2_DCONFIG_CHARSET_JPAN,
.selection = {
.selection = {
{
.description = "932 (Japanese)",
.value = DA2_DCONFIG_CHARSET_JPAN
@@ -3460,11 +3457,11 @@ static const device_config_t da2_configuration[] = {
}
},
{
.name = "montype",
.name = "montype",
.description = "Monitor type",
.type = CONFIG_SELECTION,
.type = CONFIG_SELECTION,
.default_int = DA2_DCONFIG_MONTYPE_COLOR,
.selection = {
.selection = {
{
.description = "Color",
.value = DA2_DCONFIG_MONTYPE_COLOR

View File

@@ -691,11 +691,11 @@ svga_recalctimings(svga_t *svga)
double _dispontime_xga = 0.0;
double _dispofftime_xga = 0.0;
double disptime_xga = 0.0;
int vblankend;
#ifdef ENABLE_SVGA_LOG
int vsyncend;
int vblankend;
int hdispstart;
int hdispend;
int hdispstart;
int hsyncstart;
int hsyncend;
#endif
@@ -911,7 +911,17 @@ svga_recalctimings(svga_t *svga)
if (xga_active && (svga->xga != NULL))
xga_recalctimings(svga);
if (!svga->hoverride) {
vblankend = (svga->vblankstart & 0xffffff80) | (svga->crtc[0x16] & 0x7f);
if (vblankend <= svga->vblankstart)
vblankend += 0x00000080;
if (svga->hoverride) {
if (svga->hdisp >= 2048)
svga->monitor->mon_overscan_x = 0;
svga->y_add = (svga->monitor->mon_overscan_y >> 1);
svga->left_overscan = svga->x_add = (svga->monitor->mon_overscan_x >> 1);
} else {
uint32_t dot = svga->hblankstart;
uint32_t adj_dot = svga->hblankstart;
/* Verified with both the Voodoo 3 and the S3 cards: compare 7 bits if bit 7 is set,
@@ -919,7 +929,9 @@ svga_recalctimings(svga_t *svga)
uint32_t eff_mask = (svga->hblank_end_val & ~0x0000003f) ? svga->hblank_end_mask : 0x0000003f;
svga->hblank_sub = 0;
svga_log("HDISP=%d, CRTC1+1=%d, Blank: %04i-%04i, Total: %04i, Mask: %02X, ADJ_DOT=%04i.\n", svga->hdisp, svga->crtc[1] + 1, svga->hblankstart, svga->hblank_end_val,
svga_log("HDISP=%d, CRTC1+1=%d, Blank: %04i-%04i, Total: %04i, "
"Mask: %02X, ADJ_DOT=%04i.\n", svga->hdisp, svga->crtc[1] + 1,
svga->hblankstart, svga->hblank_end_val,
svga->htotal, eff_mask, adj_dot);
while (adj_dot < (svga->htotal << 1)) {
@@ -929,7 +941,10 @@ svga_recalctimings(svga_t *svga)
if (adj_dot >= svga->htotal)
svga->hblank_sub++;
svga_log("Loop: adjdot=%d, htotal=%d, dotmask=%02x, hblankendvalmask=%02x, blankendval=%02x.\n", adj_dot, svga->htotal, dot & eff_mask, svga->hblank_end_val & eff_mask, svga->hblank_end_val);
svga_log("Loop: adjdot=%d, htotal=%d, dotmask=%02x, "
"hblankendvalmask=%02x, blankendval=%02x.\n", adj_dot,
svga->htotal, dot & eff_mask, svga->hblank_end_val & eff_mask,
svga->hblank_end_val);
if ((dot & eff_mask) == (svga->hblank_end_val & eff_mask))
break;
@@ -937,7 +952,24 @@ svga_recalctimings(svga_t *svga)
adj_dot++;
}
uint32_t hd = svga->hdisp;
svga->hdisp -= (svga->hblank_sub * svga->dots_per_clock);
svga->left_overscan = svga->x_add = (svga->htotal - adj_dot - 1) * svga->dots_per_clock;
svga->monitor->mon_overscan_x = svga->x_add + (svga->hblankstart * svga->dots_per_clock) - hd;
if ((svga->hdisp >= 2048) || (svga->left_overscan < 0)) {
svga->left_overscan = svga->x_add = 0;
svga->monitor->mon_overscan_x = 0;
}
svga->y_add = svga->vtotal - vblankend + 1;
svga->monitor->mon_overscan_y = svga->y_add + abs(svga->vblankstart - svga->dispend);
if ((svga->dispend >= 2048) || (svga->y_add < 0)) {
svga->y_add = 0;
svga->monitor->mon_overscan_y = 0;
}
}
#ifdef TBD
@@ -967,12 +999,6 @@ svga_recalctimings(svga_t *svga)
}
#endif
if (svga->hdisp >= 2048)
svga->monitor->mon_overscan_x = 0;
svga->y_add = (svga->monitor->mon_overscan_y >> 1);
svga->x_add = (svga->monitor->mon_overscan_x >> 1);
if (svga->vblankstart < svga->dispend) {
svga_log("DISPEND > VBLANKSTART.\n");
svga->dispend = svga->vblankstart;
@@ -992,12 +1018,9 @@ svga_recalctimings(svga_t *svga)
vsyncend = (svga->vsyncstart & 0xfffffff0) | (svga->crtc[0x11] & 0x0f);
if (vsyncend <= svga->vsyncstart)
vsyncend += 0x00000010;
vblankend = (svga->vblankstart & 0xffffff80) | (svga->crtc[0x16] & 0x7f);
if (vblankend <= svga->vblankstart)
vblankend += 0x00000080;
hdispstart = ((svga->crtc[3] >> 5) & 3);
hdispend = svga->crtc[1] + 1;
hdispstart = ((svga->crtc[3] >> 5) & 3);
hsyncstart = svga->crtc[4] + ((svga->crtc[5] >> 5) & 3) + 1;
hsyncend = (hsyncstart & 0xffffffe0) | (svga->crtc[5] & 0x1f);
if (hsyncend <= hsyncstart)
@@ -1178,10 +1201,10 @@ svga_do_render(svga_t *svga)
if (!svga->override) {
svga->render(svga);
svga->x_add = (svga->monitor->mon_overscan_x >> 1);
svga->x_add = svga->left_overscan;
svga_render_overscan_left(svga);
svga_render_overscan_right(svga);
svga->x_add = (svga->monitor->mon_overscan_x >> 1) - svga->scrollcache;
svga->x_add = svga->left_overscan - svga->scrollcache;
}
if (svga->overlay_on) {
@@ -1360,7 +1383,7 @@ svga_poll(void *priv)
svga->sc = 0;
if (svga->attrregs[0x10] & 0x20) {
svga->scrollcache = 0;
svga->x_add = (svga->monitor->mon_overscan_x >> 1);
svga->x_add = svga->left_overscan;
}
}
}
@@ -1466,7 +1489,7 @@ svga_poll(void *priv)
if ((svga->seqregs[1] & 8) || (svga->render == svga_render_8bpp_lowres))
svga->scrollcache <<= 1;
svga->x_add = (svga->monitor->mon_overscan_x >> 1) - svga->scrollcache;
svga->x_add = svga->left_overscan - svga->scrollcache;
svga->linecountff = 0;
@@ -1516,6 +1539,7 @@ svga_init(const device_t *info, svga_t *svga, void *priv, int memsize,
svga->attrregs[0x11] = 0;
svga->overscan_color = 0x000000;
svga->left_overscan = 8;
svga->monitor->mon_overscan_x = 16;
svga->monitor->mon_overscan_y = 32;
svga->x_add = 8;
@@ -1973,9 +1997,15 @@ svga_doblit(int wx, int wy, svga_t *svga)
y_add = enable_overscan ? svga->monitor->mon_overscan_y : 0;
x_add = enable_overscan ? svga->monitor->mon_overscan_x : 0;
#ifdef USE_OLD_CALCULATION
y_start = enable_overscan ? 0 : (svga->monitor->mon_overscan_y >> 1);
x_start = enable_overscan ? 0 : (svga->monitor->mon_overscan_x >> 1);
bottom = (svga->monitor->mon_overscan_y >> 1);
#else
y_start = enable_overscan ? 0 : svga->y_add;
x_start = enable_overscan ? 0 : svga->left_overscan;
bottom = svga->monitor->mon_overscan_y - svga->y_add;
#endif
if (svga->vertical_linedbl) {
y_add <<= 1;

View File

@@ -1017,8 +1017,8 @@ loadfont_common(FILE *fp, int format)
for (uint8_t d = 0; d < 8; d++)
fontdatm[c][d + 8] = fgetc(fp) & 0xff;
(void) fseek(fp, 4096 + 2048, SEEK_SET);
for (uint16_t c = 0; c < 256; c++)
for (uint8_t d = 0; d < 8; d++) /* 8x8 CGA (thick, primary) */
for (uint16_t c = 0; c < 256; c++) /* 8x8 CGA (thick, primary) */
for (uint8_t d = 0; d < 8; d++)
fontdat[c][d] = fgetc(fp) & 0xff;
break;