Merge pull request #3541 from pankozacorp/master

Add Dell Dimension XPS Pxxx (OEM version of Intel Premiere PCI/II)
This commit is contained in:
Miran Grča
2023-08-11 22:11:19 +02:00
committed by GitHub
30 changed files with 487 additions and 328 deletions

View File

@@ -540,12 +540,25 @@ then
# Attempt to install dependencies.
sudo "$macports/bin/port" install $(cat .ci/dependencies_macports.txt) 2>&1 | tee macports.log
# Stop if no port version activation errors were found.
# Check for port activation errors.
stuck_dep=$(grep " cannot be built while another version of " macports.log | cut -d" " -f10)
[ -z $stuck_dep ] && break
if [ -n "$stuck_dep" ]
then
# Deactivate the stuck dependency and try again.
sudo "$macports/bin/port" -f deactivate "$stuck_dep"
continue
fi
# Deactivate the stuck dependency and try again.
sudo "$macports/bin/port" -f deactivate $stuck_dep
stuck_dep=$(grep " Please deactivate this port first, or " macports.log | cut -d" " -f5 | tr -d :)
if [ -n "$stuck_dep" ]
then
# Activate the stuck dependency and try again.
sudo "$macports/bin/port" -f activate "$stuck_dep"
continue
fi
# Stop if no errors were found.
break
done
# Remove MacPorts error detection log.

View File

@@ -141,12 +141,12 @@ acpi_update_irq(acpi_t *dev)
acpi_timer_update(dev, (dev->regs.pmen & TMROF_EN) && !(dev->regs.pmsts & TMROF_STS));
}
static void
acpi_do_raise_smi(void *priv, int do_smi, int is_apm)
void
acpi_raise_smi(void *priv, int do_smi)
{
acpi_t *dev = (acpi_t *) priv;
if (is_apm || (dev->regs.glbctl & 0x01)) {
if (dev->regs.glbctl & 0x01) {
if ((dev->vendor == VEN_VIA) || (dev->vendor == VEN_VIA_596B)) {
if (!dev->regs.smi_lock || !dev->regs.smi_active) {
if (do_smi)
@@ -168,12 +168,6 @@ acpi_do_raise_smi(void *priv, int do_smi, int is_apm)
}
}
void
acpi_raise_smi(void *priv, int do_smi)
{
acpi_do_raise_smi(priv, do_smi, 0);
}
static uint32_t
acpi_reg_read_common_regs(UNUSED(int size), uint16_t addr, void *priv)
{
@@ -1588,7 +1582,7 @@ acpi_apm_out(uint16_t port, uint8_t val, void *priv)
dev->apm->cmd = val;
if (dev->vendor == VEN_INTEL)
dev->regs.glbsts |= 0x20;
acpi_do_raise_smi(dev, dev->apm->do_smi, 1);
acpi_raise_smi(dev, dev->apm->do_smi);
} else
dev->apm->stat = val;
}

View File

@@ -32,6 +32,8 @@
#include <86box/timer.h>
#include <86box/gdbstub.h>
#include <86box/mouse.h>
#include <86box/video.h>
#include <86box/plat.h>
#include <86box/plat_unused.h>
typedef struct mouse_t {
@@ -43,6 +45,8 @@ atomic_int mouse_x;
atomic_int mouse_y;
atomic_int mouse_z;
atomic_int mouse_buttons;
atomic_int old_mouse_x;
atomic_int old_mouse_y;
int mouse_mode;
int mouse_timed = 1;
int mouse_tablet_in_proximity = 0;
@@ -52,8 +56,10 @@ double mouse_x_abs;
double mouse_y_abs;
double mouse_sensitivity = 1.0;
double mouse_x_error = 0.0;
double mouse_y_error = 0.0;
_Atomic double mouse_x_error = 0.0;
_Atomic double mouse_y_error = 0.0;
_Atomic double mouse_x_raw = 0.0;
_Atomic double mouse_y_raw = 0.0;
pc_timer_t mouse_timer; /* mouse event timer */
@@ -130,12 +136,21 @@ mouse_log(const char *fmt, ...)
# define mouse_log(fmt, ...)
#endif
void
mouse_clear_coords(void)
{
mouse_x = mouse_y = mouse_z = 0;
old_mouse_x = old_mouse_y = 0;
mouse_x_error = mouse_y_error = 0.0;
mouse_x_raw = mouse_y_raw = 0.0;
}
/* Initialize the mouse module. */
void
mouse_init(void)
{
/* Initialize local data. */
mouse_x = mouse_y = mouse_z = 0;
mouse_clear_coords();
mouse_buttons = 0x00;
mouse_type = MOUSE_TYPE_NONE;
@@ -159,6 +174,132 @@ mouse_close(void)
timer_stop(&mouse_timer);
}
static int
mouse_scale_coord_x(int x, int mul)
{
double temp_x = (double) x;
double ratio = (double) monitors[0].mon_unscaled_size_x / (double) monitors[0].mon_res_x;
if (mul)
temp_x *= ratio;
else
temp_x /= ratio;
return (int) temp_x;
}
static int
mouse_scale_coord_y(int y, int mul)
{
double temp_y = (double) y;
double ratio = (double) monitors[0].mon_efscrnsz_y / (double) monitors[0].mon_res_y;
if (mul)
temp_y *= ratio;
else
temp_y /= ratio;
return (int) temp_y;
}
/* It appears all host platforms give us y in the Microsoft format
(positive to the south), so for all non-Microsoft report formsts,
we have to invenrt that. */
void
mouse_subtract_coords(int *delta_x, int *delta_y, int *o_x, int *o_y,
int min, int max, int invert, int abs)
{
int real_x = mouse_x;
int real_y = mouse_y;
int smax_x;
int smax_y;
int rsmin_x;
int rsmin_y;
int smin_x;
int smin_y;
if (invert)
real_y = -real_y;
rsmin_x = mouse_scale_coord_x(min, 0);
rsmin_y = mouse_scale_coord_y(min, 0);
if (abs) {
smax_x = mouse_scale_coord_x(max, 0) + ABS(rsmin_x);
smax_y = mouse_scale_coord_y(max, 0) + ABS(rsmin_y);
max += ABS(min);
real_x += rsmin_x;
real_y += rsmin_y;
smin_x = 0;
smin_y = 0;
} else {
smax_x = mouse_scale_coord_x(max, 0);
smax_y = mouse_scale_coord_y(max, 0);
smin_x = rsmin_x;
smin_y = rsmin_y;
}
/* Default the X and Y overflows to 1. */
if (o_x != NULL)
*o_x = 1;
if (o_y != NULL)
*o_y = 1;
if (real_x > smax_x) {
if (abs)
*delta_x = mouse_scale_coord_x(real_x, 1);
else
*delta_x = max;
real_x -= smax_x;
} else if (real_x < smin_x) {
if (abs)
*delta_x = mouse_scale_coord_x(real_x, 1);
else
*delta_x = min;
real_x += ABS(smin_x);
} else {
if (abs)
*delta_x = mouse_scale_coord_x(real_x, 1);
else
*delta_x = mouse_scale_coord_x(real_x, 1);
real_x = 0;
if (o_x != NULL)
*o_x = 0;
}
if (real_y > smax_y) {
if (abs)
*delta_y = mouse_scale_coord_y(real_y, 1);
else
*delta_y = max;
real_y -= smax_y;
} else if (real_y < smin_y) {
if (abs)
*delta_y = mouse_scale_coord_y(real_y, 1);
else
*delta_y = min;
real_y += ABS(smin_y);
} else {
if (abs)
*delta_y = mouse_scale_coord_y(real_y, 1);
else
*delta_y = mouse_scale_coord_y(real_y, 1);
real_y = 0;
if (o_y != NULL)
*o_y = 0;
}
if (abs) {
real_x -= rsmin_x;
real_y -= rsmin_y;
}
if (invert)
real_y = -real_y;
mouse_x = real_x;
mouse_y = real_y;
}
static void
mouse_timer_poll(UNUSED(void *priv))
{
@@ -178,8 +319,11 @@ mouse_timer_poll(UNUSED(void *priv))
void
mouse_scale(int x, int y)
{
double scaled_x = (((double) x) * mouse_sensitivity) + mouse_x_error;
double scaled_y = (((double) y) * mouse_sensitivity) + mouse_y_error;
double scaled_x = (((double) x) * mouse_sensitivity);
double scaled_y = (((double) y) * mouse_sensitivity);
scaled_x += mouse_x_error;
scaled_y += mouse_y_error;
mouse_x += (int) scaled_x;
mouse_y += (int) scaled_y;
@@ -191,21 +335,25 @@ mouse_scale(int x, int y)
void
mouse_scale_x(int x)
{
double scaled_x = ((double) x) * mouse_sensitivity + mouse_x_error;
double scaled_x = (((double) x) * mouse_sensitivity);
scaled_x += mouse_x_error;
mouse_x += (int) scaled_x;
mouse_x_error = scaled_x - ((double) mouse_x);
mouse_x_error = scaled_x - floor(scaled_x);
}
void
mouse_scale_y(int y)
{
double scaled_y = ((double) y) * mouse_sensitivity + mouse_y_error;
double scaled_y = (((double) y) * mouse_sensitivity);
scaled_y += mouse_y_error;
mouse_y += (int) scaled_y;
mouse_y_error = scaled_y - ((double) mouse_y);
mouse_y_error = scaled_y - floor(scaled_y);
}
void
@@ -248,7 +396,7 @@ mouse_reset(void)
mouse_type, mouse_devices[mouse_type].device->name);
/* Clear local data. */
mouse_x = mouse_y = mouse_z = 0;
mouse_clear_coords();
mouse_buttons = 0x00;
mouse_mode = 0;
mouse_timed = 1;
@@ -292,8 +440,7 @@ mouse_process(void)
if ((mouse_mode >= 1) && mouse_poll_ex)
mouse_poll_ex();
if ((mouse_dev_poll != NULL) || (mouse_curr->poll != NULL)) {
else if ((mouse_mode == 0) && ((mouse_dev_poll != NULL) || (mouse_curr->poll != NULL))) {
if (mouse_curr->poll != NULL)
mouse_curr->poll(mouse_x, mouse_y, mouse_z, mouse_buttons, mouse_x_abs, mouse_y_abs, mouse_priv);
else

View File

@@ -478,7 +478,9 @@ static int
bm_poll(int x, int y, UNUSED(int z), int b, UNUSED(double abs_x), UNUSED(double abs_y), void *priv)
{
mouse_t *dev = (mouse_t *) priv;
int xor ;
int delta_x;
int delta_y;
int xor;
if (!mouse_capture && !video_fullscreen)
return 1;
@@ -514,27 +516,10 @@ bm_poll(int x, int y, UNUSED(int z), int b, UNUSED(double abs_x), UNUSED(double
if (!dev->timer_enabled) {
/* If the counters are not frozen, update them. */
if (!(dev->flags & FLAG_HOLD)) {
if (mouse_x > 127) {
dev->current_x = 127;
mouse_x -= 127;
} else if (mouse_x < 1-128) {
dev->current_x = -128;
mouse_x += 128;
} else {
dev->current_x = mouse_x;
mouse_x = 0;
}
mouse_subtract_coords(&delta_x, &delta_y, NULL, NULL, -128, 127, 0, 0);
if (mouse_y > 127) {
dev->current_y = 127;
mouse_y -= 127;
} else if (mouse_y < 1-128) {
dev->current_y = -128;
mouse_y += 128;
} else {
dev->current_y = mouse_y;
mouse_y = 0;
}
dev->current_x = (int8_t) delta_x;
dev->current_y = (int8_t) delta_y;
dev->current_b = dev->mouse_buttons;
}
@@ -561,27 +546,7 @@ bm_update_data(mouse_t *dev)
/* If the counters are not frozen, update them. */
if ((mouse_capture || video_fullscreen) && !(dev->flags & FLAG_HOLD)) {
/* Update the deltas and the delays. */
if (mouse_x > 127) {
delta_x = 127;
mouse_x -= 127;
} else if (mouse_x < -128) {
delta_x = -128;
mouse_x += 128;
} else {
delta_x = mouse_x;
mouse_x = 0;
}
if (mouse_y > 127) {
delta_y = 127;
mouse_y -= 127;
} else if (mouse_y < -128) {
delta_y = -128;
mouse_y += 128;
} else {
delta_y = mouse_y;
mouse_y = 0;
}
mouse_subtract_coords(&delta_x, &delta_y, NULL, NULL, -128, 127, 0, 0);
dev->current_x = (int8_t) delta_x;
dev->current_y = (int8_t) delta_y;

View File

@@ -75,35 +75,19 @@ static void
ps2_report_coordinates(atkbc_dev_t *dev, int main)
{
uint8_t buff[3] = { 0x08, 0x00, 0x00 };
int delta_x;
int delta_y;
int overflow_x;
int overflow_y;
int temp_z;
if (mouse_x > 255) {
buff[0] |= 0x40;
buff[1] = 255;
mouse_x -= 255;
} else if (mouse_x < -256) {
buff[0] |= (0x40 | 0x10);
mouse_x += 256;
} else {
if (mouse_x < 0)
buff[0] |= 0x10;
buff[1] = mouse_x;
mouse_x = 0;
}
if (mouse_y < -255) {
buff[0] |= 0x80;
buff[2] = 255;
mouse_y += 255;
} else if (mouse_y > 256) {
buff[0] |= (0x80 | 0x20);
mouse_y -= 256;
} else {
if (mouse_y > 0)
buff[0] |= 0x20;
buff[2] = -mouse_y;
mouse_y = 0;
}
mouse_subtract_coords(&delta_x, &delta_y, &overflow_x, &overflow_y,
-256, 255, 1, 0);
buff[0] = (overflow_y << 7) | (overflow_x << 6) |
((delta_y & 0x0100) >> 3) | ((delta_x & 0x0100) >> 4) |
(mouse_buttons & ((dev->flags & FLAG_INTELLI) ? 0x07 : 0x03));
buff[1] = (delta_x & 0x00ff);
buff[2] = (delta_y & 0x00ff);
if (dev->z < -7) {
temp_z = 7;
@@ -116,8 +100,6 @@ ps2_report_coordinates(atkbc_dev_t *dev, int main)
mouse_z = 0;
}
buff[0] |= (mouse_buttons & ((dev->flags & FLAG_INTELLI) ? 0x07 : 0x03));
kbc_at_dev_queue_add(dev, buff[0], main);
kbc_at_dev_queue_add(dev, buff[1], main);
kbc_at_dev_queue_add(dev, buff[2], main);

View File

@@ -82,8 +82,6 @@ typedef struct mouse_t {
int8_t type; /* type of this device */
int8_t port;
int abs_x;
int abs_y;
int old_buttons;
int state;
int bps;
@@ -177,89 +175,13 @@ sermouse_transmit(mouse_t *dev, int len, int from_report, int to_report)
sermouse_set_period(dev, dev->transmit_period);
}
/* It appears all host platforms give us y in the Microsoft format
(positive to the south), so for all non-Microsoft report formsts,
we have to invenrt that. */
static void
sermouse_subtract_coords(mouse_t *dev, int *delta_x, int *delta_y, int min, int max, int invert, int abs)
{
int real_y = mouse_y;
int abs_max = max + ABS(min);
if (invert)
real_y = -real_y;
if (mouse_x > max) {
if (abs) {
dev->abs_x += max;
*delta_x = dev->abs_x;
} else
*delta_x = max;
mouse_x -= max;
} else if (mouse_x < min) {
if (abs) {
dev->abs_x += min;
*delta_x = dev->abs_x;
} else
*delta_x = min;
mouse_x += ABS(min);
} else {
if (abs) {
dev->abs_x += mouse_x;
*delta_x = dev->abs_x;
} else
*delta_x = mouse_x;
mouse_x = 0;
}
if (real_y > max) {
if (abs) {
dev->abs_y += max;
*delta_y = dev->abs_y;
} else
*delta_y = max;
real_y -= max;
} else if (real_y < min) {
if (abs) {
dev->abs_y += min;
*delta_y = dev->abs_y;
} else
*delta_y = min;
real_y += ABS(min);
} else {
if (abs) {
dev->abs_y += real_y;
*delta_y = dev->abs_y;
} else
*delta_y = real_y;
real_y = 0;
}
if (abs) {
if (dev->abs_x < 0)
*delta_x = 0;
else if (dev->abs_x > abs_max)
*delta_x = abs_max;
if (dev->abs_y < 0)
*delta_y = 0;
else if (dev->abs_y > abs_max)
*delta_y = abs_max;
}
if (invert)
real_y = -real_y;
mouse_y = real_y;
}
static uint8_t
sermouse_report_msystems(mouse_t *dev)
{
int delta_x = 0;
int delta_y = 0;
sermouse_subtract_coords(dev, &delta_x, &delta_y, -128, 127, 1, 0);
mouse_subtract_coords(&delta_x, &delta_y, NULL, NULL, -128, 127, 1, 0);
dev->buf[0] = 0x80;
dev->buf[0] |= (mouse_buttons & 0x01) ? 0x00 : 0x04; /* left button */
@@ -282,7 +204,7 @@ sermouse_report_3bp(mouse_t *dev)
int delta_x = 0;
int delta_y = 0;
sermouse_subtract_coords(dev, &delta_x, &delta_y, -128, 127, 1, 0);
mouse_subtract_coords(&delta_x, &delta_y, NULL, NULL, -128, 127, 1, 0);
dev->buf[0] = 0x80;
dev->buf[0] |= (mouse_buttons & 0x01) ? 0x04 : 0x00; /* left button */
@@ -303,7 +225,7 @@ sermouse_report_mmseries(mouse_t *dev)
int delta_x = 0;
int delta_y = 0;
sermouse_subtract_coords(dev, &delta_x, &delta_y, -127, 127, 1, 0);
mouse_subtract_coords(&delta_x, &delta_y, NULL, NULL, -127, 127, 1, 0);
dev->buf[0] = 0x80;
if (delta_x >= 0)
@@ -328,7 +250,7 @@ sermouse_report_bp1(mouse_t *dev, int abs)
int delta_x = 0;
int delta_y = 0;
sermouse_subtract_coords(dev, &delta_x, &delta_y, -2048, 2047, 1, abs);
mouse_subtract_coords(&delta_x, &delta_y, NULL, NULL, -2048, 2047, 1, abs);
dev->buf[0] = 0x80;
dev->buf[0] |= (mouse_buttons & 0x01) ? 0x10 : 0x00; /* left button */
@@ -351,7 +273,7 @@ sermouse_report_ms(mouse_t *dev)
int delta_y = 0;
int delta_z = 0;
sermouse_subtract_coords(dev, &delta_x, &delta_y, -128, 127, 0, 0);
mouse_subtract_coords(&delta_x, &delta_y, NULL, NULL, -128, 127, 0, 0);
dev->buf[0] = 0x40;
dev->buf[0] |= (((delta_y >> 6) & 0x03) << 2);
@@ -409,7 +331,7 @@ sermouse_report_hex(mouse_t *dev)
int delta_x = 0;
int delta_y = 0;
sermouse_subtract_coords(dev, &delta_x, &delta_y, -128, 127, 1, 0);
mouse_subtract_coords(&delta_x, &delta_y, NULL, NULL, -128, 127, 1, 0);
but |= (mouse_buttons & 0x01) ? 0x04 : 0x00; /* left button */
if (dev->but >= 3)
@@ -669,7 +591,7 @@ ltsermouse_process_command(mouse_t *dev)
case 0x41:
/* Absolute Bit Pad One Packed Binary Format */
dev->abs_x = dev->abs_y = 0;
mouse_clear_coords();
fallthrough;
case 0x42: /* Relative Bit Pad One Packed Binary Format */
case 0x53: /* MM Series Data Format */

View File

@@ -143,8 +143,10 @@ extern int is_pentium; /* TODO: Move back to cpu/cpu.h when it's figured out,
extern int fixed_size_x;
extern int fixed_size_y;
extern double mouse_sensitivity; /* (C) Mouse sensitivity scale */
extern double mouse_x_error; /* Mouse error accumulator - Y */
extern double mouse_y_error; /* Mouse error accumulator - Y */
#ifdef _Atomic
extern _Atomic double mouse_x_error; /* Mouse error accumulator - Y */
extern _Atomic double mouse_y_error; /* Mouse error accumulator - Y */
#endif
extern int pit_mode; /* (C) force setting PIT mode */
extern int fm_driver; /* (C) select FM sound driver */

View File

@@ -572,6 +572,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_ambradp90_init(const machine_t *);
extern int machine_at_430nx_init(const machine_t *);

View File

@@ -26,7 +26,7 @@
#endif
#define MOUSE_TYPE_NONE 0 /* no mouse configured */
#define MOUSE_TYPE_INTERNAL 1 /* machine has internal mouse */
#define MOUSE_TYPE_INTERNAL 1 /* achine has internal mouse */
#define MOUSE_TYPE_LOGIBUS 2 /* Logitech/ATI Bus Mouse */
#define MOUSE_TYPE_INPORT 3 /* Microsoft InPort Mouse */
#if 0
@@ -62,8 +62,10 @@ extern double mouse_x_abs;
extern double mouse_y_abs;
extern int tablet_tool_type;
extern double mouse_sensitivity;
extern double mouse_x_error;
extern double mouse_y_error;
#ifdef _Atomic
extern _Atomic double mouse_x_error;
extern _Atomic double mouse_y_error;
#endif
#ifdef EMU_DEVICE_H
extern const device_t *mouse_get_device(int mouse);
@@ -83,8 +85,11 @@ extern const device_t mouse_wacom_device;
extern const device_t mouse_wacom_artpad_device;
#endif
extern void mouse_clear_coords(void);
extern void mouse_init(void);
extern void mouse_close(void);
extern void mouse_subtract_coords(int *delta_x, int *delta_y, int *o_x, int *o_y,
int min, int max, int invert, int abs);
extern void mouse_reset(void);
extern void mouse_set_buttons(int buttons);
extern void mouse_set_poll_ex(void (*poll_ex)(void));

View File

@@ -143,6 +143,7 @@ extern void plat_vid_reload_options(void);
extern uint32_t plat_language_code(char *langcode);
extern void plat_language_code_r(uint32_t lcid, char *outbuf, int len);
extern void plat_get_cpu_string(char *outbuf, uint8_t len);
extern double plat_get_dpi(void);
/* Resource management. */
extern void set_language(uint32_t id);

View File

@@ -61,6 +61,25 @@ machine_at_plato_init(const machine_t *model)
return ret;
}
int
machine_at_dellplato_init(const machine_t *model)
{
int ret;
ret = bios_load_linear_combined("roms/machines/dellplato/1016AX1J.bio",
"roms/machines/dellplato/1016AX1J.bi1",
0x1d000, 128);
if (bios_only || !ret)
return ret;
machine_at_premiere_common_init(model, PCI_CAN_SWITCH_TYPE);
device_add(&i430nx_device);
return ret;
}
int
machine_at_ambradp90_init(const machine_t *model)
{

View File

@@ -8094,6 +8094,45 @@ const machine_t machines[] = {
.snd_device = NULL,
.net_device = NULL
},
/* Same as Intel Premiere PCI/II, but with a Dell OEM BIOS */
{
.name = "[i430NX] Dell Dimension XPS Pxxx",
.internal_name = "dellplato",
.type = MACHINE_TYPE_SOCKET5,
.chipset = MACHINE_CHIPSET_INTEL_430NX,
.init = machine_at_dellplato_init,
.pad = 0,
.pad0 = 0,
.pad1 = MACHINE_AVAILABLE,
.pad2 = 0,
.cpu = {
.package = CPU_PKG_SOCKET5_7,
.block = CPU_BLOCK_NONE,
.min_bus = 50000000,
.max_bus = 66666667,
.min_voltage = 3520,
.max_voltage = 3520,
.min_multi = 1.5,
.max_multi = 1.5
},
.bus_flags = MACHINE_PS2_PCI,
.flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI,
.ram = {
.min = 2048,
.max = 131072,
.step = 2048
},
.nvrmask = 127,
.kbc_device = NULL,
.kbc_p1 = 0,
.gpio = 0,
.device = NULL,
.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. */
{

View File

@@ -236,7 +236,12 @@ pic_update_pending_at(void)
if (!(pic2.flags & PIC_FREEZE)) {
pic2.int_pending = (find_best_interrupt(&pic2) != -1);
pic_cascade(pic2.int_pending);
// pic_cascade(pic2.int_pending);
if (pic2.int_pending)
pic.irr |= (1 << pic2.icw3);
else
pic.irr &= ~(1 << pic2.icw3);
}
if (!(pic.flags & PIC_FREEZE))
@@ -375,6 +380,7 @@ pic_action(pic_t *dev, uint8_t irq, uint8_t eoi, uint8_t rotate)
if (rotate)
dev->priority = (irq + 1) & 7;
pic_update_request(dev, irq);
update_pending();
}
}
@@ -414,13 +420,10 @@ pic_latch_read(UNUSED(uint16_t addr), UNUSED(void *priv))
{
uint8_t ret = 0xff;
pic_log("pic_latch_read(%04X): %02X%02X\n", enabled_latches, latched_irqs & 0x10, latched_irqs & 0x02);
pic_log("pic_latch_read(%04X): %04X\n", enabled_latches, latched_irqs & 0x1002);
if ((latched_irqs & enabled_latches) & 0x0002)
picintc(0x0002);
if ((latched_irqs & enabled_latches) & 0x1000)
picintc(0x1000);
if (latched_irqs & 0x1002)
picintc(latched_irqs & 0x1002);
/* Return FF - we just lower IRQ 1 and IRQ 12. */
return ret;

View File

@@ -293,7 +293,9 @@ MainWindow::MainWindow(QWidget *parent)
connect(this, &MainWindow::resizeContentsMonitor, this, [this](int w, int h, int monitor_index) {
if (!QApplication::platformName().contains("eglfs") && vid_resize != 1) {
#ifdef QT_RESIZE_DEBUG
qDebug() << "Resize";
#endif
w = (w / (!dpi_scale ? util::screenOfWidget(renderers[monitor_index].get())->devicePixelRatio() : 1.));
int modifiedHeight = (h / (!dpi_scale ? util::screenOfWidget(renderers[monitor_index].get())->devicePixelRatio() : 1.));

View File

@@ -37,13 +37,17 @@
#include <QLocalSocket>
#include <QTimer>
#include <QProcess>
#include <QRegularExpression>
#include <QLibrary>
#include <QElapsedTimer>
#include <QScreen>
#include "qt_rendererstack.hpp"
#include "qt_mainwindow.hpp"
#include "qt_progsettings.hpp"
#include "qt_util.hpp"
#ifdef Q_OS_UNIX
# include <sys/mman.h>
@@ -640,7 +644,7 @@ plat_get_global_config_dir(char* strptr)
}
void
plat_init_rom_paths()
plat_init_rom_paths(void)
{
auto paths = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation);
@@ -712,7 +716,7 @@ plat_get_cpu_string(char *outbuf, uint8_t len) {
if (line.isNull()) {
break;
}
if(line.contains(QRegExp("model name.*:"))) {
if(QRegularExpression("model name.*:").match(line).hasMatch()) {
auto list = line.split(": ");
if(!list.last().isEmpty()) {
cpu_string = list.last();
@@ -726,4 +730,10 @@ plat_get_cpu_string(char *outbuf, uint8_t len) {
qstrncpy(outbuf, cpu_string.toUtf8().constData(), len);
}
}
double
plat_get_dpi(void)
{
return util::screenOfWidget(main_window)->devicePixelRatio();
}

View File

@@ -27,6 +27,7 @@
extern "C" {
#include <86box/86box.h>
#include <86box/plat.h>
#include <86box/video.h>
}
@@ -51,62 +52,71 @@ integer_scale(double *d, double *g)
void
RendererCommon::onResize(int width, int height)
{
if ((video_fullscreen == 0) && (video_fullscreen_scale_maximized ? ((parentWidget->isMaximized() == false) && (main_window->isAncestorOf(parentWidget) && main_window->isMaximized() == false)) : 1)) {
/* This is needed so that the if below does not take like, 5 lines. */
bool is_fs = (video_fullscreen == 0);
bool parent_max = (parentWidget->isMaximized() == false);
bool main_is_ancestor = main_window->isAncestorOf(parentWidget);
bool main_max = main_window->isMaximized();
bool main_is_max = (main_is_ancestor && main_max == false);
if (is_fs && (video_fullscreen_scale_maximized ? (parent_max && main_is_max) : 1))
destination.setRect(0, 0, width, height);
return;
}
double dx;
double dy;
double dw;
double dh;
double gsr;
else {
double dx;
double dy;
double dw;
double dh;
double gsr;
double hw = width;
double hh = height;
double gw = source.width();
double gh = source.height();
double hsr = hw / hh;
double hw = width;
double hh = height;
double gw = source.width();
double gh = source.height();
double hsr = hw / hh;
switch (video_fullscreen_scale) {
case FULLSCR_SCALE_INT:
gsr = gw / gh;
if (gsr <= hsr) {
dw = hh * gsr;
dh = hh;
} else {
dw = hw;
dh = hw / gsr;
}
integer_scale(&dw, &gw);
integer_scale(&dh, &gh);
dx = (hw - dw) / 2.0;
dy = (hh - dh) / 2.0;
destination.setRect(dx, dy, dw, dh);
break;
case FULLSCR_SCALE_43:
case FULLSCR_SCALE_KEEPRATIO:
if (video_fullscreen_scale == FULLSCR_SCALE_43) {
gsr = 4.0 / 3.0;
} else {
switch (video_fullscreen_scale) {
case FULLSCR_SCALE_INT:
gsr = gw / gh;
}
if (gsr <= hsr) {
dw = hh * gsr;
dh = hh;
} else {
dw = hw;
dh = hw / gsr;
}
integer_scale(&dw, &gw);
integer_scale(&dh, &gh);
dx = (hw - dw) / 2.0;
dy = (hh - dh) / 2.0;
destination.setRect((int) dx, (int) dy, (int) dw, (int) dh);
break;
case FULLSCR_SCALE_43:
case FULLSCR_SCALE_KEEPRATIO:
if (video_fullscreen_scale == FULLSCR_SCALE_43)
gsr = 4.0 / 3.0;
else
gsr = gw / gh;
if (gsr <= hsr) {
dw = hh * gsr;
dh = hh;
} else {
dw = hw;
dh = hw / gsr;
}
dx = (hw - dw) / 2.0;
dy = (hh - dh) / 2.0;
destination.setRect(dx, dy, dw, dh);
break;
case FULLSCR_SCALE_FULL:
default:
destination.setRect(0, 0, hw, hh);
break;
if (gsr <= hsr) {
dw = hh * gsr;
dh = hh;
} else {
dw = hw;
dh = hw / gsr;
}
dx = (hw - dw) / 2.0;
dy = (hh - dh) / 2.0;
destination.setRect((int) dx, (int) dy, (int) dw, (int) dh);
break;
case FULLSCR_SCALE_FULL:
default:
destination.setRect(0, 0, (int) hw, (int) hh);
break;
}
}
monitors[r_monitor_index].mon_res_x = (int) ((double) destination.width() * plat_get_dpi());
monitors[r_monitor_index].mon_res_y = (int) ((double) destination.height() * plat_get_dpi());
}
bool

View File

@@ -38,8 +38,10 @@ public:
virtual bool hasBlitFunc() { return false; }
virtual void blit(int x, int y, int w, int h) { }
int r_monitor_index = 0;
protected:
bool eventDelegate(QEvent *event, bool &result);
bool eventDelegate(QEvent *event, bool &result);
QRect source { 0, 0, 0, 0 };
QRect destination;

View File

@@ -177,7 +177,17 @@ RendererStack::mouseReleaseEvent(QMouseEvent *event)
return;
}
if (mouse_capture || (mouse_mode >= 1)) {
if ((mouse_mode >= 1) && ((m_monitor_index < 1) || mousedata.mouse_tablet_in_proximity))
#ifdef Q_OS_WINDOWS
if (((m_monitor_index >= 1) && (mouse_mode >= 1) && mousedata.mouse_tablet_in_proximity) ||
((m_monitor_index < 1) && (mouse_mode >= 1)))
#else
#ifndef __APPLE__
if (((m_monitor_index >= 1) && (mouse_mode >= 1) && mousedata.mouse_tablet_in_proximity) ||
(m_monitor_index < 1))
#else
if ((m_monitor_index >= 1) && (mouse_mode >= 1) && mousedata.mouse_tablet_in_proximity)
#endif
#endif
mouse_set_buttons_ex(mouse_get_buttons_ex() & ~event->button());
}
isMouseDown &= ~1;
@@ -188,7 +198,17 @@ RendererStack::mousePressEvent(QMouseEvent *event)
{
isMouseDown |= 1;
if (mouse_capture || (mouse_mode >= 1)) {
if ((mouse_mode >= 1) && ((m_monitor_index < 1) || mousedata.mouse_tablet_in_proximity))
#ifdef Q_OS_WINDOWS
if (((m_monitor_index >= 1) && (mouse_mode >= 1) && mousedata.mouse_tablet_in_proximity) ||
((m_monitor_index < 1) && (mouse_mode >= 1)))
#else
#ifndef __APPLE__
if (((m_monitor_index >= 1) && (mouse_mode >= 1) && mousedata.mouse_tablet_in_proximity) ||
(m_monitor_index < 1))
#else
if ((m_monitor_index >= 1) && (mouse_mode >= 1) && mousedata.mouse_tablet_in_proximity)
#endif
#endif
mouse_set_buttons_ex(mouse_get_buttons_ex() | event->button());
}
event->accept();
@@ -532,3 +552,19 @@ RendererStack::event(QEvent* event)
}
return QStackedWidget::event(event);
}
void
RendererStack::setFocusRenderer()
{
if (current)
current->setFocus();
}
void
RendererStack::onResize(int width, int height)
{
if (rendererWindow) {
rendererWindow->r_monitor_index = m_monitor_index;
rendererWindow->onResize(width, height);
}
}

View File

@@ -71,16 +71,8 @@ public:
/* Returns options dialog for current renderer */
QDialog *getOptions(QWidget *parent) { return rendererWindow ? rendererWindow->getOptions(parent) : nullptr; }
void setFocusRenderer()
{
if (current)
current->setFocus();
}
void onResize(int width, int height)
{
if (rendererWindow)
rendererWindow->onResize(width, height);
}
void setFocusRenderer();
void onResize(int width, int height);
void (*mouse_capture_func)(QWindow *window) = nullptr;
void (*mouse_uncapture_func)() = nullptr;

View File

@@ -150,12 +150,15 @@ public:
{
for (uint32_t i = 0; i < num_samples; i++) {
m_chip.generate(&m_output);
if (ChipType::OUTPUTS == 1) {
*data++ = m_output.data[(m_type == FM_YMF278B) ? 4 : 0];
*data++ = m_output.data[(m_type == FM_YMF278B) ? 4 : 0];
if(m_type == FM_YMF278B) {
*data++ += m_output.data[4 % ChipType::OUTPUTS];
*data++ += m_output.data[5 % ChipType::OUTPUTS];
} else if (ChipType::OUTPUTS == 1) {
*data++ = m_output.data[0];
*data++ = m_output.data[0];
} else {
*data++ = m_output.data[(m_type == FM_YMF278B) ? 4 : 0];
*data++ = m_output.data[(m_type == FM_YMF278B) ? 5 : (1 % ChipType::OUTPUTS)];
*data++ = m_output.data[0];
*data++ = m_output.data[1 % ChipType::OUTPUTS];
}
}
}
@@ -167,12 +170,15 @@ public:
m_oldsamples[0] = m_samples[0];
m_oldsamples[1] = m_samples[1];
m_chip.generate(&m_output);
if (ChipType::OUTPUTS == 1) {
m_samples[0] = m_output.data[(m_type == FM_YMF278B) ? 4 : 0];
m_samples[1] = m_output.data[(m_type == FM_YMF278B) ? 4 : 0];
if(m_type == FM_YMF278B) {
m_samples[0] += m_output.data[4 % ChipType::OUTPUTS];
m_samples[1] += m_output.data[5 % ChipType::OUTPUTS];
} else if (ChipType::OUTPUTS == 1) {
m_samples[0] = m_output.data[0];
m_samples[1] = m_output.data[0];
} else {
m_samples[0] = m_output.data[(m_type == FM_YMF278B) ? 4 : 0];
m_samples[1] = m_output.data[(m_type == FM_YMF278B) ? 5 : (1 % ChipType::OUTPUTS)];
m_samples[0] = m_output.data[0];
m_samples[1] = m_output.data[1 % ChipType::OUTPUTS];
}
m_samplecnt -= m_rateratio;
}

View File

@@ -46,6 +46,8 @@
#include <string>
#include <vector>
#define SNPRINTF_BUFFER_SIZE_CALC (256 - (end - &buffer[0]))
namespace ymfm
{
@@ -350,7 +352,7 @@ public:
{
// create file
char name[20];
sprintf(name, "wavlog-%02d.wav", m_index);
snprintf(name, sizeof(name), "wavlog-%02d.wav", m_index);
FILE *out = fopen(name, "wb");
// make the wav file header

View File

@@ -1522,8 +1522,11 @@ void fm_engine_base<RegisterType>::engine_timer_expired(uint32_t tnum)
m_modified_channels |= 1 << chnum;
}
// reset
m_timer_running[tnum] = false;
// Make sure the array does not go out of bounds to keep gcc happy
if(tnum < 2) {
// reset
m_timer_running[tnum] = false;
}
update_timer(tnum, 1, 0);
}

View File

@@ -388,7 +388,7 @@ std::string opl_registers_base<Revision>::log_keyon(uint32_t choffs, uint32_t op
char buffer[256];
char *end = &buffer[0];
end += sprintf(end, "%2u.%02u freq=%04X fb=%u alg=%X mul=%X tl=%02X ksr=%u ns=%u ksl=%u adr=%X/%X/%X sl=%X sus=%u",
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, "%2u.%02u freq=%04X fb=%u alg=%X mul=%X tl=%02X ksr=%u ns=%u ksl=%u adr=%X/%X/%X sl=%X sus=%u",
chnum, opnum,
ch_block_freq(choffs),
ch_feedback(choffs),
@@ -405,25 +405,25 @@ std::string opl_registers_base<Revision>::log_keyon(uint32_t choffs, uint32_t op
op_eg_sustain(opoffs));
if (OUTPUTS > 1)
end += sprintf(end, " out=%c%c%c%c",
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " out=%c%c%c%c",
ch_output_0(choffs) ? 'L' : '-',
ch_output_1(choffs) ? 'R' : '-',
ch_output_2(choffs) ? '0' : '-',
ch_output_3(choffs) ? '1' : '-');
if (op_lfo_am_enable(opoffs) != 0)
end += sprintf(end, " am=%u", lfo_am_depth());
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " am=%u", lfo_am_depth());
if (op_lfo_pm_enable(opoffs) != 0)
end += sprintf(end, " pm=%u", lfo_pm_depth());
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " pm=%u", lfo_pm_depth());
if (waveform_enable() && op_waveform(opoffs) != 0)
end += sprintf(end, " wf=%u", op_waveform(opoffs));
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " wf=%u", op_waveform(opoffs));
if (is_rhythm(choffs))
end += sprintf(end, " rhy=1");
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " rhy=1");
if (DYNAMIC_OPS)
{
operator_mapping map;
operator_map(map);
if (bitfield(map.chan[chnum], 16, 8) != 0xff)
end += sprintf(end, " 4op");
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " 4op");
}
return buffer;
@@ -687,7 +687,7 @@ std::string opll_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
char buffer[256];
char *end = &buffer[0];
end += sprintf(end, "%u.%02u freq=%04X inst=%X fb=%u mul=%X",
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, "%u.%02u freq=%04X inst=%X fb=%u mul=%X",
chnum, opnum,
ch_block_freq(choffs),
ch_instrument(choffs),
@@ -695,11 +695,11 @@ std::string opll_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
op_multiple(opoffs));
if (bitfield(opoffs, 0) == 1 || (is_rhythm(choffs) && choffs >= 6))
end += sprintf(end, " vol=%X", op_volume(opoffs));
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " vol=%X", op_volume(opoffs));
else
end += sprintf(end, " tl=%02X", ch_total_level(choffs));
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " tl=%02X", ch_total_level(choffs));
end += sprintf(end, " ksr=%u ksl=%u adr=%X/%X/%X sl=%X sus=%u/%u",
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " ksr=%u ksl=%u adr=%X/%X/%X sl=%X sus=%u/%u",
op_ksr(opoffs),
op_ksl(opoffs),
op_attack_rate(opoffs),
@@ -710,13 +710,13 @@ std::string opll_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
ch_sustain(choffs));
if (op_lfo_am_enable(opoffs))
end += sprintf(end, " am=1");
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " am=1");
if (op_lfo_pm_enable(opoffs))
end += sprintf(end, " pm=1");
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " pm=1");
if (op_waveform(opoffs) != 0)
end += sprintf(end, " wf=1");
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " wf=1");
if (is_rhythm(choffs))
end += sprintf(end, " rhy=1");
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " rhy=1");
return buffer;
}

View File

@@ -356,7 +356,7 @@ std::string opm_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
char buffer[256];
char *end = &buffer[0];
end += sprintf(end, "%u.%02u freq=%04X dt2=%u dt=%u fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X out=%c%c",
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, "%u.%02u freq=%04X dt2=%u dt=%u fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X out=%c%c",
chnum, opnum,
ch_block_freq(choffs),
op_detune2(opoffs),
@@ -376,14 +376,14 @@ std::string opm_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
bool am = (lfo_am_depth() != 0 && ch_lfo_am_sens(choffs) != 0 && op_lfo_am_enable(opoffs) != 0);
if (am)
end += sprintf(end, " am=%u/%02X", ch_lfo_am_sens(choffs), lfo_am_depth());
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " am=%u/%02X", ch_lfo_am_sens(choffs), lfo_am_depth());
bool pm = (lfo_pm_depth() != 0 && ch_lfo_pm_sens(choffs) != 0);
if (pm)
end += sprintf(end, " pm=%u/%02X", ch_lfo_pm_sens(choffs), lfo_pm_depth());
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " pm=%u/%02X", ch_lfo_pm_sens(choffs), lfo_pm_depth());
if (am || pm)
end += sprintf(end, " lfo=%02X/%c", lfo_rate(), "WQTN"[lfo_waveform()]);
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " lfo=%02X/%c", lfo_rate(), "WQTN"[lfo_waveform()]);
if (noise_enable() && opoffs == 31)
end += sprintf(end, " noise=1");
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " noise=1");
return buffer;
}

View File

@@ -411,7 +411,7 @@ std::string opn_registers_base<IsOpnA>::log_keyon(uint32_t choffs, uint32_t opof
char buffer[256];
char *end = &buffer[0];
end += sprintf(end, "%u.%02u freq=%04X dt=%u fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X",
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, "%u.%02u freq=%04X dt=%u fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X",
chnum, opnum,
block_freq,
op_detune(opoffs),
@@ -427,21 +427,21 @@ std::string opn_registers_base<IsOpnA>::log_keyon(uint32_t choffs, uint32_t opof
op_sustain_level(opoffs));
if (OUTPUTS > 1)
end += sprintf(end, " out=%c%c",
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " out=%c%c",
ch_output_0(choffs) ? 'L' : '-',
ch_output_1(choffs) ? 'R' : '-');
if (op_ssg_eg_enable(opoffs))
end += sprintf(end, " ssg=%X", op_ssg_eg_mode(opoffs));
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " ssg=%X", op_ssg_eg_mode(opoffs));
bool am = (op_lfo_am_enable(opoffs) && ch_lfo_am_sens(choffs) != 0);
if (am)
end += sprintf(end, " am=%u", ch_lfo_am_sens(choffs));
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " am=%u", ch_lfo_am_sens(choffs));
bool pm = (ch_lfo_pm_sens(choffs) != 0);
if (pm)
end += sprintf(end, " pm=%u", ch_lfo_pm_sens(choffs));
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " pm=%u", ch_lfo_pm_sens(choffs));
if (am || pm)
end += sprintf(end, " lfo=%02X", lfo_rate());
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " lfo=%02X", lfo_rate());
if (multi_freq() && choffs == 2)
end += sprintf(end, " multi=1");
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " multi=1");
return buffer;
}

View File

@@ -341,7 +341,7 @@ std::string opq_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
char buffer[256];
char *end = &buffer[0];
end += sprintf(end, "%u.%02u freq=%04X dt=%+2d fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X out=%c%c",
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, "%u.%02u freq=%04X dt=%+2d fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X out=%c%c",
chnum, opnum,
(opoffs & 1) ? ch_block_freq_24(choffs) : ch_block_freq_13(choffs),
int32_t(op_detune(opoffs)) - 0x20,
@@ -360,14 +360,14 @@ std::string opq_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
bool am = (lfo_enable() && op_lfo_am_enable(opoffs) && ch_lfo_am_sens(choffs) != 0);
if (am)
end += sprintf(end, " am=%u", ch_lfo_am_sens(choffs));
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " am=%u", ch_lfo_am_sens(choffs));
bool pm = (lfo_enable() && ch_lfo_pm_sens(choffs) != 0);
if (pm)
end += sprintf(end, " pm=%u", ch_lfo_pm_sens(choffs));
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " pm=%u", ch_lfo_pm_sens(choffs));
if (am || pm)
end += sprintf(end, " lfo=%02X", lfo_rate());
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " lfo=%02X", lfo_rate());
if (ch_reverb(choffs))
end += sprintf(end, " reverb");
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " reverb");
return buffer;
}

View File

@@ -557,14 +557,14 @@ std::string opz_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
char buffer[256];
char *end = &buffer[0];
end += sprintf(end, "%u.%02u", chnum, opnum);
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, "%u.%02u", chnum, opnum);
if (op_fix_mode(opoffs))
end += sprintf(end, " fixfreq=%X fine=%X shift=%X", op_fix_frequency(opoffs), op_fine(opoffs), op_fix_range(opoffs));
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " fixfreq=%X fine=%X shift=%X", op_fix_frequency(opoffs), op_fine(opoffs), op_fix_range(opoffs));
else
end += sprintf(end, " freq=%04X dt2=%u fine=%X", ch_block_freq(choffs), op_detune2(opoffs), op_fine(opoffs));
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " freq=%04X dt2=%u fine=%X", ch_block_freq(choffs), op_detune2(opoffs), op_fine(opoffs));
end += sprintf(end, " dt=%u fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X out=%c%c",
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " dt=%u fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X out=%c%c",
op_detune(opoffs),
ch_feedback(choffs),
ch_algorithm(choffs),
@@ -580,32 +580,32 @@ std::string opz_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
ch_output_1(choffs) ? 'R' : '-');
if (op_eg_shift(opoffs) != 0)
end += sprintf(end, " egshift=%u", op_eg_shift(opoffs));
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " egshift=%u", op_eg_shift(opoffs));
bool am = (lfo_am_depth() != 0 && ch_lfo_am_sens(choffs) != 0 && op_lfo_am_enable(opoffs) != 0);
if (am)
end += sprintf(end, " am=%u/%02X", ch_lfo_am_sens(choffs), lfo_am_depth());
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " am=%u/%02X", ch_lfo_am_sens(choffs), lfo_am_depth());
bool pm = (lfo_pm_depth() != 0 && ch_lfo_pm_sens(choffs) != 0);
if (pm)
end += sprintf(end, " pm=%u/%02X", ch_lfo_pm_sens(choffs), lfo_pm_depth());
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " pm=%u/%02X", ch_lfo_pm_sens(choffs), lfo_pm_depth());
if (am || pm)
end += sprintf(end, " lfo=%02X/%c", lfo_rate(), "WQTN"[lfo_waveform()]);
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " lfo=%02X/%c", lfo_rate(), "WQTN"[lfo_waveform()]);
bool am2 = (lfo2_am_depth() != 0 && ch_lfo2_am_sens(choffs) != 0 && op_lfo_am_enable(opoffs) != 0);
if (am2)
end += sprintf(end, " am2=%u/%02X", ch_lfo2_am_sens(choffs), lfo2_am_depth());
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " am2=%u/%02X", ch_lfo2_am_sens(choffs), lfo2_am_depth());
bool pm2 = (lfo2_pm_depth() != 0 && ch_lfo2_pm_sens(choffs) != 0);
if (pm2)
end += sprintf(end, " pm2=%u/%02X", ch_lfo2_pm_sens(choffs), lfo2_pm_depth());
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " pm2=%u/%02X", ch_lfo2_pm_sens(choffs), lfo2_pm_depth());
if (am2 || pm2)
end += sprintf(end, " lfo2=%02X/%c", lfo2_rate(), "WQTN"[lfo2_waveform()]);
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " lfo2=%02X/%c", lfo2_rate(), "WQTN"[lfo2_waveform()]);
if (op_reverb_rate(opoffs) != 0)
end += sprintf(end, " rev=%u", op_reverb_rate(opoffs));
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " rev=%u", op_reverb_rate(opoffs));
if (op_waveform(opoffs) != 0)
end += sprintf(end, " wf=%u", op_waveform(opoffs));
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " wf=%u", op_waveform(opoffs));
if (noise_enable() && opoffs == 31)
end += sprintf(end, " noise=1");
end += snprintf(end, SNPRINTF_BUFFER_SIZE_CALC, " noise=1");
return buffer;
}

View File

@@ -139,6 +139,7 @@ herculesplus_out(uint16_t port, uint8_t val, void *priv)
return;
old = dev->crtc[dev->crtcreg];
dev->crtc[dev->crtcreg] = val;
if (dev->crtc[10] == 6 && dev->crtc[11] == 7) {
/*Fix for Generic Turbo XT BIOS,
*which sets up cursor registers wrong*/
@@ -459,8 +460,8 @@ text_line(herculesplus_t *dev, uint16_t ca)
for (uint8_t x = 0; x < dev->crtc[1]; x++) {
if (dev->ctrl & 8) {
chr = dev->vram[(dev->ma << 1) & 0xfff];
attr = dev->vram[((dev->ma << 1) + 1) & 0xfff];
chr = dev->vram[(dev->ma << 1) & 0x3fff];
attr = dev->vram[((dev->ma << 1) + 1) & 0x3fff];
} else
chr = attr = 0;
@@ -535,6 +536,7 @@ herculesplus_poll(void *priv)
int x;
int oldvc;
int oldsc;
int cw = HERCULESPLUS_CW;
VIDEO_MONITOR_PROLOGUE();
if (!dev->linepos) {
@@ -558,7 +560,7 @@ herculesplus_poll(void *priv)
if ((dev->ctrl & HERCULESPLUS_CTRL_GRAPH) && (dev->ctrl2 & HERCULESPLUS_CTRL2_GRAPH))
x = dev->crtc[1] << 4;
else
x = dev->crtc[1] * 9;
x = dev->crtc[1] * cw;
video_process_8(x, dev->displine);
}
@@ -621,7 +623,7 @@ herculesplus_poll(void *priv)
if ((dev->ctrl & HERCULESPLUS_CTRL_GRAPH) && (dev->ctrl2 & HERCULESPLUS_CTRL2_GRAPH))
x = dev->crtc[1] << 4;
else
x = dev->crtc[1] * 9;
x = dev->crtc[1] * cw;
dev->lastline++;
if ((dev->ctrl & 8) && ((x != xsize) || ((dev->lastline - dev->firstline) != ysize) || video_force_resize_get())) {
xsize = x;

View File

@@ -749,8 +749,8 @@ text_line(incolor_t *dev, uint16_t ca)
for (uint8_t x = 0; x < dev->crtc[1]; x++) {
if (dev->ctrl & 8) {
chr = dev->vram[(dev->ma << 1) & 0xfff];
attr = dev->vram[((dev->ma << 1) + 1) & 0xfff];
chr = dev->vram[(dev->ma << 1) & 0x3fff];
attr = dev->vram[((dev->ma << 1) + 1) & 0x3fff];
} else
chr = attr = 0;
@@ -850,6 +850,7 @@ incolor_poll(void *priv)
int x;
int oldvc;
int oldsc;
int cw = INCOLOR_CW;
if (!dev->linepos) {
timer_advance_u64(&dev->timer, dev->dispofftime);
@@ -931,7 +932,7 @@ incolor_poll(void *priv)
if ((dev->ctrl & INCOLOR_CTRL_GRAPH) && (dev->ctrl2 & INCOLOR_CTRL2_GRAPH))
x = dev->crtc[1] << 4;
else
x = dev->crtc[1] * 9;
x = dev->crtc[1] * cw;
dev->lastline++;
if ((dev->ctrl & 8) && ((x != xsize) || ((dev->lastline - dev->firstline) != ysize) || video_force_resize_get())) {
xsize = x;

View File

@@ -3164,9 +3164,9 @@ banshee_init_common(const device_t *info, char *fn, int has_sgram, int type, int
banshee->svga.decode_mask = 0x1ffffff;
if (banshee->has_bios)
pci_add_card(banshee->agp ? PCI_ADD_AGP : PCI_ADD_VIDEO, banshee_pci_read, banshee_pci_write, banshee, &banshee->pci_slot);
else
pci_add_card(banshee->agp ? PCI_ADD_AGP : PCI_ADD_NORMAL, banshee_pci_read, banshee_pci_write, banshee, &banshee->pci_slot);
else
pci_add_card(banshee->agp ? PCI_ADD_AGP : PCI_ADD_VIDEO, banshee_pci_read, banshee_pci_write, banshee, &banshee->pci_slot);
banshee->voodoo = voodoo_2d3d_card_init(voodoo_type);
banshee->voodoo->p = banshee;