diff --git a/src/include/86box/thread.h b/src/include/86box/thread.h
index 3f09bf8f9..4d5584787 100644
--- a/src/include/86box/thread.h
+++ b/src/include/86box/thread.h
@@ -1,3 +1,24 @@
+/*
+ * 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.
+ *
+ * Thread API header.
+ *
+ *
+ *
+ * Authors: Sarah Walker,
+ * Miran Grca,
+ *
+ * Copyright 2008-2023 Sarah Walker.
+ * Copyright 2016-2023 Miran Grca.
+ */
+#ifndef THREAD_H
+# define THREAD_H
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -44,3 +65,5 @@ extern int thread_release_mutex(mutex_t *mutex);
#ifdef __cplusplus
}
#endif
+
+#endif /*THREAD_H*/
diff --git a/src/include/86box/vid_8514a.h b/src/include/86box/vid_8514a.h
index a78434bd2..983e98cd1 100644
--- a/src/include/86box/vid_8514a.h
+++ b/src/include/86box/vid_8514a.h
@@ -15,7 +15,6 @@
*
* Copyright 2022 TheCollector1995.
*/
-
#ifndef VIDEO_8514A_H
#define VIDEO_8514A_H
@@ -203,4 +202,5 @@ typedef struct ibm8514_t {
int ext_pitch;
int ext_crt_pitch;
} ibm8514_t;
+
#endif /*VIDEO_8514A_H*/
diff --git a/src/include/86box/vid_svga.h b/src/include/86box/vid_svga.h
index 2fd2acf50..f725996d8 100644
--- a/src/include/86box/vid_svga.h
+++ b/src/include/86box/vid_svga.h
@@ -16,11 +16,6 @@
* Copyright 2008-2020 Sarah Walker.
* Copyright 2016-2020 Miran Grca.
*/
-
-#include <86box/thread.h>
-#include <86box/vid_8514a.h>
-#include <86box/vid_xga.h>
-
#ifndef VIDEO_SVGA_H
# define VIDEO_SVGA_H
@@ -58,8 +53,6 @@ typedef union {
} latch_t;
typedef struct svga_t {
- ibm8514_t dev8514;
- xga_t xga;
mem_mapping_t mapping;
uint8_t fast;
@@ -269,11 +262,14 @@ typedef struct svga_t {
/* Pointer to monitor */
monitor_t *monitor;
+
+ void * dev8514;
+ void * xga;
} svga_t;
extern int vga_on;
-extern void ibm8514_poll(ibm8514_t *dev, svga_t *svga);
+extern void ibm8514_poll(void *priv, svga_t *svga);
extern void ibm8514_recalctimings(svga_t *svga);
extern uint8_t ibm8514_ramdac_in(uint16_t port, void *priv);
extern void ibm8514_ramdac_out(uint16_t port, uint8_t val, void *priv);
@@ -283,7 +279,7 @@ extern void ibm8514_accel_out_pixtrans(svga_t *svga, uint16_t port, uint16_t
extern void ibm8514_short_stroke_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, svga_t *svga, uint8_t ssv, int len);
extern void ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, svga_t *svga, int len);
-extern void xga_poll(xga_t *xga, svga_t *svga);
+extern void xga_poll(void *priv, svga_t *svga);
extern void xga_recalctimings(svga_t *svga);
extern int svga_init(const device_t *info, svga_t *svga, void *priv, int memsize,
diff --git a/src/include/86box/vid_xga.h b/src/include/86box/vid_xga.h
index 739e30c5c..e5248b309 100644
--- a/src/include/86box/vid_xga.h
+++ b/src/include/86box/vid_xga.h
@@ -14,7 +14,6 @@
*
* Copyright 2022 TheCollector1995.
*/
-
#ifndef VIDEO_XGA_H
#define VIDEO_XGA_H
@@ -232,4 +231,5 @@ typedef struct xga_t {
int big_endian_linear;
} xga_t;
+
#endif /*VIDEO_XGA_H*/
diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c
index ef735852c..a2cabfb0d 100644
--- a/src/video/vid_8514a.c
+++ b/src/video/vid_8514a.c
@@ -34,6 +34,8 @@
#include <86box/plat.h>
#include <86box/thread.h>
#include <86box/video.h>
+#include <86box/vid_8514a.h>
+#include <86box/vid_xga.h>
#include <86box/vid_svga.h>
#include <86box/vid_svga_render.h>
#include "cpu.h"
@@ -193,7 +195,7 @@ int ibm8514_active = 0;
int
ibm8514_cpu_src(svga_t *svga)
{
- const ibm8514_t *dev = &svga->dev8514;
+ const ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
if (!(dev->accel.cmd & 0x100))
return 0;
@@ -207,7 +209,7 @@ ibm8514_cpu_src(svga_t *svga)
int
ibm8514_cpu_dest(svga_t *svga)
{
- const ibm8514_t *dev = &svga->dev8514;
+ const ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
if (!(dev->accel.cmd & 0x100))
return 0;
@@ -221,7 +223,7 @@ ibm8514_cpu_dest(svga_t *svga)
void
ibm8514_accel_out_pixtrans(svga_t *svga, UNUSED(uint16_t port), uint16_t val, int len)
{
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
uint8_t nibble = 0;
uint32_t pixelxfer = 0;
uint32_t monoxfer = 0xffffffff;
@@ -443,7 +445,7 @@ regular_nibble:
static void
ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len)
{
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
switch (port) {
case 0x82e8:
@@ -845,7 +847,7 @@ ibm8514_io_set(svga_t *svga)
static void
ibm8514_accel_out(uint16_t port, uint32_t val, svga_t *svga, int len)
{
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
if (port & 0x8000) {
ibm8514_accel_out_fifo(svga, port, val, len);
@@ -993,7 +995,7 @@ ibm8514_accel_outw(uint16_t port, uint16_t val, void *priv)
static uint32_t
ibm8514_accel_in(uint16_t port, svga_t *svga, int len)
{
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
uint32_t temp = 0;
int cmd;
int vpos = 0;
@@ -1138,7 +1140,7 @@ ibm8514_accel_inw(uint16_t port, void *priv)
void
ibm8514_short_stroke_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, svga_t *svga, uint8_t ssv, int len)
{
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
if (!cpu_input) {
dev->accel.ssv_len = ssv & 0x0f;
@@ -1156,7 +1158,7 @@ ibm8514_short_stroke_start(int count, int cpu_input, uint32_t mix_dat, uint32_t
void
ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, svga_t *svga, UNUSED(int len))
{
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
uint16_t *vram_w = (uint16_t *) dev->vram;
uint16_t src_dat = 0;
uint16_t dest_dat;
@@ -3817,7 +3819,7 @@ bitblt:
void
ibm8514_render_8bpp(svga_t *svga)
{
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
uint32_t *p;
uint32_t dat;
@@ -3855,7 +3857,7 @@ ibm8514_render_8bpp(svga_t *svga)
void
ibm8514_render_15bpp(svga_t *svga)
{
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
int x;
uint32_t *p;
uint32_t dat;
@@ -3896,7 +3898,7 @@ ibm8514_render_15bpp(svga_t *svga)
void
ibm8514_render_16bpp(svga_t *svga)
{
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
int x;
uint32_t *p;
uint32_t dat;
@@ -3937,7 +3939,7 @@ ibm8514_render_16bpp(svga_t *svga)
void
ibm8514_render_24bpp(svga_t *svga)
{
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
uint32_t *p;
uint32_t dat;
@@ -3973,7 +3975,7 @@ ibm8514_render_24bpp(svga_t *svga)
void
ibm8514_render_BGR(svga_t *svga)
{
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
uint32_t *p;
uint32_t dat;
@@ -4009,7 +4011,7 @@ ibm8514_render_BGR(svga_t *svga)
void
ibm8514_render_ABGR8888(svga_t *svga)
{
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
int x;
uint32_t *p;
uint32_t dat;
@@ -4036,7 +4038,7 @@ ibm8514_render_ABGR8888(svga_t *svga)
void
ibm8514_render_RGBA8888(svga_t *svga)
{
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
int x;
uint32_t *p;
uint32_t dat;
@@ -4090,8 +4092,9 @@ ibm8514_render_overscan_right(ibm8514_t *dev, svga_t *svga)
}
void
-ibm8514_poll(ibm8514_t *dev, svga_t *svga)
+ibm8514_poll(void *priv, svga_t *svga)
{
+ ibm8514_t *dev = (ibm8514_t *) priv;
uint32_t x;
int wx;
int wy;
@@ -4238,7 +4241,7 @@ ibm8514_poll(ibm8514_t *dev, svga_t *svga)
void
ibm8514_recalctimings(svga_t *svga)
{
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
if (dev->on) {
dev->h_disp = (dev->hdisp + 1) << 3;
@@ -4307,7 +4310,7 @@ static uint8_t
ibm8514_mca_read(int port, void *priv)
{
const svga_t *svga = (svga_t *) priv;
- const ibm8514_t *dev = &svga->dev8514;
+ const ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
return (dev->pos_regs[port & 7]);
}
@@ -4316,7 +4319,7 @@ static void
ibm8514_mca_write(int port, uint8_t val, void *priv)
{
svga_t *svga = (svga_t *) priv;
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
/* MCA does not write registers below 0x0100. */
if (port < 0x0102)
@@ -4330,7 +4333,7 @@ static uint8_t
ibm8514_mca_feedb(void *priv)
{
const svga_t *svga = (svga_t *) priv;
- const ibm8514_t *dev = &svga->dev8514;
+ const ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
return dev->pos_regs[2] & 1;
}
@@ -4341,8 +4344,10 @@ ibm8514_init(const device_t *info)
if (svga_get_pri() == NULL)
return NULL;
- svga_t *svga = svga_get_pri();
- ibm8514_t *dev = &svga->dev8514;
+ svga_t *svga = svga_get_pri();
+ ibm8514_t *dev = (ibm8514_t *) calloc(1, sizeof(ibm8514_t));
+
+ svga->dev8514 = dev;
dev->vram_size = 1024 << 10;
dev->vram = calloc(dev->vram_size, 1);
@@ -4368,11 +4373,13 @@ static void
ibm8514_close(void *priv)
{
svga_t *svga = (svga_t *) priv;
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
if (dev) {
free(dev->vram);
free(dev->changedvram);
+
+ free(dev);
}
}
diff --git a/src/video/vid_ati68860_ramdac.c b/src/video/vid_ati68860_ramdac.c
index 169199826..4e76cb808 100644
--- a/src/video/vid_ati68860_ramdac.c
+++ b/src/video/vid_ati68860_ramdac.c
@@ -46,6 +46,7 @@
#include <86box/mem.h>
#include <86box/timer.h>
#include <86box/video.h>
+#include <86box/vid_8514a.h>
#include <86box/vid_svga.h>
#include <86box/vid_svga_render.h>
#include <86box/plat_unused.h>
@@ -68,7 +69,7 @@ void
ati68860_ramdac_out(uint16_t addr, uint8_t val, void *priv, svga_t *svga)
{
ati68860_ramdac_t *ramdac = (ati68860_ramdac_t *) priv;
- const ibm8514_t *dev = &svga->dev8514;
+ const ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
switch (addr) {
case 0:
@@ -172,7 +173,7 @@ uint8_t
ati68860_ramdac_in(uint16_t addr, void *priv, svga_t *svga)
{
const ati68860_ramdac_t *ramdac = (ati68860_ramdac_t *) priv;
- const ibm8514_t *dev = &svga->dev8514;
+ const ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
uint8_t temp = 0;
switch (addr) {
diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c
index 1d3f6bbc8..42a2a9f02 100644
--- a/src/video/vid_ati_mach8.c
+++ b/src/video/vid_ati_mach8.c
@@ -36,6 +36,7 @@
#include <86box/video.h>
#include <86box/i2c.h>
#include <86box/vid_ddc.h>
+#include <86box/vid_8514a.h>
#include <86box/vid_svga.h>
#include <86box/vid_svga_render.h>
#include <86box/vid_ati_eeprom.h>
@@ -2299,7 +2300,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv)
{
mach_t *mach = (mach_t *) priv;
svga_t *svga = &mach->svga;
- const ibm8514_t *dev = &svga->dev8514;
+ const ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
uint8_t old;
uint8_t rs2;
uint8_t rs3;
@@ -2472,7 +2473,7 @@ mach_in(uint16_t addr, void *priv)
{
mach_t *mach = (mach_t *) priv;
svga_t *svga = &mach->svga;
- const ibm8514_t *dev = &svga->dev8514;
+ const ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
uint8_t temp = 0xff;
uint8_t rs2;
uint8_t rs3;
@@ -2569,7 +2570,7 @@ static void
mach_recalctimings(svga_t *svga)
{
const mach_t *mach = (mach_t *) svga->priv;
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
int clock_sel;
clock_sel = ((svga->miscout >> 2) & 3) | ((mach->regs[0xbe] & 0x10) >> 1) | ((mach->regs[0xb9] & 2) << 1);
@@ -3622,7 +3623,7 @@ static void
mach_accel_out(uint16_t port, uint8_t val, mach_t *mach)
{
svga_t *svga = &mach->svga;
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
mach_log("Port accel out = %04x, val = %04x.\n", port, val);
@@ -4349,7 +4350,7 @@ static uint8_t
mach_accel_in(uint16_t port, mach_t *mach)
{
svga_t *svga = &mach->svga;
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
uint8_t temp = 0;
int vpos = 0;
int vblankend = svga->vblankstart + svga->crtc[0x16];
@@ -4550,7 +4551,7 @@ mach_accel_outb(uint16_t port, uint8_t val, void *priv)
svga_t *svga = &mach->svga;
if (port & 0x8000)
- mach_accel_out_fifo(mach, svga, &svga->dev8514, port, val, 1);
+ mach_accel_out_fifo(mach, svga, (ibm8514_t *) svga->dev8514, port, val, 1);
else
mach_accel_out(port, val, mach);
}
@@ -4562,7 +4563,7 @@ mach_accel_outw(uint16_t port, uint16_t val, void *priv)
svga_t *svga = &mach->svga;
if (port & 0x8000)
- mach_accel_out_fifo(mach, svga, &svga->dev8514, port, val, 2);
+ mach_accel_out_fifo(mach, svga, (ibm8514_t *) svga->dev8514, port, val, 2);
else {
mach_accel_out(port, val, mach);
mach_accel_out(port + 1, (val >> 8), mach);
@@ -4576,8 +4577,8 @@ mach_accel_outl(uint16_t port, uint32_t val, void *priv)
svga_t *svga = &mach->svga;
if (port & 0x8000) {
- mach_accel_out_fifo(mach, svga, &svga->dev8514, port, val & 0xffff, 2);
- mach_accel_out_fifo(mach, svga, &svga->dev8514, port + 2, val >> 16, 2);
+ mach_accel_out_fifo(mach, svga, (ibm8514_t *) svga->dev8514, port, val & 0xffff, 2);
+ mach_accel_out_fifo(mach, svga, (ibm8514_t *) svga->dev8514, port + 2, val >> 16, 2);
} else {
mach_accel_out(port, val, mach);
mach_accel_out(port + 1, (val >> 8), mach);
@@ -4593,7 +4594,7 @@ mach_accel_inb(uint16_t port, void *priv)
uint8_t temp;
if (port & 0x8000)
- temp = mach_accel_in_fifo(mach, svga, &svga->dev8514, port, 1);
+ temp = mach_accel_in_fifo(mach, svga, (ibm8514_t *) svga->dev8514, port, 1);
else
temp = mach_accel_in(port, mach);
@@ -4608,7 +4609,7 @@ mach_accel_inw(uint16_t port, void *priv)
uint16_t temp;
if (port & 0x8000)
- temp = mach_accel_in_fifo(mach, svga, &svga->dev8514, port, 2);
+ temp = mach_accel_in_fifo(mach, svga, (ibm8514_t *) svga->dev8514, port, 2);
else {
temp = mach_accel_in(port, mach);
temp |= (mach_accel_in(port + 1, mach) << 8);
@@ -4624,8 +4625,8 @@ mach_accel_inl(uint16_t port, void *priv)
uint32_t temp;
if (port & 0x8000) {
- temp = mach_accel_in_fifo(mach, svga, &svga->dev8514, port, 2);
- temp = (mach_accel_in_fifo(mach, svga, &svga->dev8514, port + 2, 2) << 16);
+ temp = mach_accel_in_fifo(mach, svga, (ibm8514_t *) svga->dev8514, port, 2);
+ temp = (mach_accel_in_fifo(mach, svga, (ibm8514_t *) svga->dev8514, port + 2, 2) << 16);
} else {
temp = mach_accel_in(port, mach);
temp |= (mach_accel_in(port + 1, mach) << 8);
@@ -4639,7 +4640,7 @@ static void
mach32_write_linear(uint32_t addr, uint8_t val, void *priv)
{
svga_t *svga = (svga_t *) priv;
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
int writemask2 = svga->writemask;
int reset_wm = 0;
latch_t vall;
@@ -4802,7 +4803,7 @@ static uint8_t
mach32_read_linear(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) priv;
- const ibm8514_t *dev = &svga->dev8514;
+ const ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
uint32_t latch_addr = 0;
int readplane = svga->readplane;
uint8_t count;
@@ -5066,7 +5067,7 @@ static void
mach32_updatemapping(mach_t *mach)
{
svga_t *svga = &mach->svga;
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
if (mach->pci_bus && (!(mach->pci_regs[PCI_REG_COMMAND] & PCI_COMMAND_MEM))) {
mem_mapping_disable(&svga->mapping);
@@ -5129,7 +5130,7 @@ static void
mach32_hwcursor_draw(svga_t *svga, int displine)
{
const mach_t *mach = (mach_t *) svga->priv;
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
uint16_t dat;
int comb;
int offset = dev->hwcursor_latch.x - dev->hwcursor_latch.xoff;
@@ -5452,7 +5453,7 @@ mach_mca_reset(void *priv)
{
mach_t *mach = (mach_t *) priv;
svga_t *svga = &mach->svga;
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
mem_mapping_disable(&mach->bios_rom.mapping);
mem_mapping_disable(&mach->bios_rom2.mapping);
@@ -5599,11 +5600,12 @@ mach8_init(const device_t *info)
svga_t *svga;
ibm8514_t *dev;
- mach = malloc(sizeof(mach_t));
- memset(mach, 0x00, sizeof(mach_t));
+ mach = calloc(1, sizeof(mach_t));
- svga = &mach->svga;
- dev = &svga->dev8514;
+ svga = &mach->svga;
+ dev = (ibm8514_t *) calloc(1, sizeof(ibm8514_t));
+
+ svga->dev8514 = dev;
mach->pci_bus = !!(info->flags & DEVICE_PCI);
mach->vlb_bus = !!(info->flags & DEVICE_VLB);
@@ -5800,11 +5802,13 @@ mach_close(void *priv)
{
mach_t *mach = (mach_t *) priv;
svga_t *svga = &mach->svga;
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
if (dev) {
free(dev->vram);
free(dev->changedvram);
+
+ free(dev);
}
svga_close(svga);
diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c
index e32575db7..c53053ac5 100644
--- a/src/video/vid_svga.c
+++ b/src/video/vid_svga.c
@@ -39,6 +39,8 @@
#include <86box/plat.h>
#include <86box/ui.h>
#include <86box/video.h>
+#include <86box/vid_8514a.h>
+#include <86box/vid_xga.h>
#include <86box/vid_svga.h>
#include <86box/vid_svga_render.h>
#include <86box/vid_xga_device.h>
@@ -110,8 +112,8 @@ void
svga_out(uint16_t addr, uint8_t val, void *priv)
{
svga_t *svga = (svga_t *) priv;
- ibm8514_t *dev = &svga->dev8514;
- xga_t *xga = &svga->xga;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
+ xga_t *xga = (xga_t *) svga->xga;
uint8_t o;
uint8_t index;
@@ -357,7 +359,7 @@ uint8_t
svga_in(uint16_t addr, void *priv)
{
svga_t *svga = (svga_t *) priv;
- ibm8514_t *dev = &svga->dev8514;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
uint8_t index;
uint8_t ret = 0xff;
@@ -512,8 +514,8 @@ svga_in(uint16_t addr, void *priv)
void
svga_set_ramdac_type(svga_t *svga, int type)
{
- ibm8514_t *dev = &svga->dev8514;
- xga_t *xga = &svga->xga;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
+ xga_t *xga = (xga_t *) svga->xga;
if (svga->ramdac_type != type) {
svga->ramdac_type = type;
@@ -548,7 +550,7 @@ svga_set_ramdac_type(svga_t *svga, int type)
void
svga_recalctimings(svga_t *svga)
{
- const ibm8514_t *dev = &svga->dev8514;
+ const ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
double crtcconst;
double _dispontime;
double _dispofftime;
@@ -816,8 +818,8 @@ void
svga_poll(void *priv)
{
svga_t *svga = (svga_t *) priv;
- ibm8514_t *dev = &svga->dev8514;
- xga_t *xga = &svga->xga;
+ ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
+ xga_t *xga = (xga_t *) svga->xga;
uint32_t x;
uint32_t blink_delay;
int wx;
@@ -1229,7 +1231,7 @@ static __inline void
svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
int writemask2 = svga->writemask;
int reset_wm = 0;
latch_t vall;
@@ -1449,7 +1451,7 @@ static __inline uint8_t
svga_read_common(uint32_t addr, uint8_t linear, void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
uint32_t latch_addr = 0;
int readplane = svga->readplane;
uint8_t count;
diff --git a/src/video/vid_xga.c b/src/video/vid_xga.c
index 915ac548a..21bde90fe 100644
--- a/src/video/vid_xga.c
+++ b/src/video/vid_xga.c
@@ -30,6 +30,7 @@
#include <86box/device.h>
#include <86box/timer.h>
#include <86box/video.h>
+#include <86box/vid_xga.h>
#include <86box/vid_svga.h>
#include <86box/vid_svga_render.h>
#include <86box/vid_xga_device.h>
@@ -143,7 +144,7 @@ svga_xga_in(uint16_t addr, void *priv)
void
xga_updatemapping(svga_t *svga)
{
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
xga_log("OpMode = %x, linear base = %08x, aperture cntl = %d, access mode = %x, map = %x, "
"endian reverse = %d, a5test = %d, XGA on = %d.\n", xga->op_mode, xga->linear_base,
@@ -186,7 +187,7 @@ xga_updatemapping(svga_t *svga)
void
xga_recalctimings(svga_t *svga)
{
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
if (xga->on) {
xga->v_total = xga->vtotal + 1;
@@ -505,7 +506,7 @@ static void
xga_ext_outb(uint16_t addr, uint8_t val, void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
xga_log("[%04X:%08X]: EXT OUTB = %02x, val = %02x\n", CS, cpu_state.pc, addr, val);
@@ -567,7 +568,7 @@ static uint8_t
xga_ext_inb(uint16_t addr, void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
uint8_t ret = 0;
uint8_t index;
@@ -906,7 +907,7 @@ xga_ext_inb(uint16_t addr, void *priv)
static uint32_t
xga_accel_read_pattern_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int width)
{
- const xga_t *xga = &svga->xga;
+ const xga_t *xga = (xga_t *) svga->xga;
uint32_t addr = base;
int bits;
uint8_t byte;
@@ -944,7 +945,7 @@ xga_accel_read_pattern_map_pixel(svga_t *svga, int x, int y, int map, uint32_t b
static uint32_t
xga_accel_read_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int width, UNUSED(int usesrc))
{
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
uint32_t addr = base;
int bits;
uint32_t byte;
@@ -1024,7 +1025,7 @@ xga_accel_read_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int
static void
xga_accel_write_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, uint32_t pixel, int width)
{
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
uint32_t addr = base;
uint8_t byte;
uint8_t mask;
@@ -1125,7 +1126,7 @@ xga_accel_write_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, ui
static void
xga_short_stroke(svga_t *svga, uint8_t ssv)
{
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
uint32_t src_dat;
uint32_t dest_dat;
uint32_t old_dest_dat;
@@ -1254,7 +1255,7 @@ xga_short_stroke(svga_t *svga, uint8_t ssv)
static void
xga_line_draw_write(svga_t *svga)
{
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
uint32_t src_dat;
uint32_t dest_dat;
uint32_t old_dest_dat;
@@ -1476,7 +1477,7 @@ xga_line_draw_write(svga_t *svga)
static void
xga_bitblt(svga_t *svga)
{
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
uint8_t area_state = 0;
uint32_t src_dat;
uint32_t dest_dat;
@@ -2283,7 +2284,7 @@ static void
xga_memio_writeb(uint32_t addr, uint8_t val, void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
xga_mem_write(addr, val, xga, svga, 1);
@@ -2294,7 +2295,7 @@ static void
xga_memio_writew(uint32_t addr, uint16_t val, void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
xga_mem_write(addr, val, xga, svga, 2);
@@ -2305,7 +2306,7 @@ static void
xga_memio_writel(uint32_t addr, uint32_t val, void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
xga_mem_write(addr, val, xga, svga, 4);
@@ -2400,7 +2401,7 @@ static uint8_t
xga_memio_readb(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
uint8_t temp;
temp = xga_mem_read(addr, xga, svga);
@@ -2414,7 +2415,7 @@ static uint16_t
xga_memio_readw(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
uint16_t temp;
temp = xga_mem_read(addr, xga, svga);
@@ -2429,7 +2430,7 @@ static uint32_t
xga_memio_readl(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
uint32_t temp;
temp = xga_mem_read(addr, xga, svga);
@@ -2445,7 +2446,7 @@ xga_memio_readl(uint32_t addr, void *priv)
static void
xga_hwcursor_draw(svga_t *svga, int displine)
{
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
uint8_t dat = 0;
int offset = xga->hwcursor_latch.x - xga->hwcursor_latch.xoff;
int x_pos;
@@ -2531,7 +2532,7 @@ xga_render_overscan_right(xga_t *xga, svga_t *svga)
static void
xga_render_4bpp(svga_t *svga)
{
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
uint32_t *p;
uint32_t dat;
@@ -2572,7 +2573,7 @@ xga_render_4bpp(svga_t *svga)
static void
xga_render_8bpp(svga_t *svga)
{
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
uint32_t *p;
uint32_t dat;
@@ -2609,7 +2610,7 @@ xga_render_8bpp(svga_t *svga)
static void
xga_render_16bpp(svga_t *svga)
{
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
int x;
uint32_t *p;
uint32_t dat;
@@ -2650,7 +2651,7 @@ static void
xga_write(uint32_t addr, uint8_t val, void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
if (!xga->on) {
svga_write(addr, val, svga);
@@ -2678,7 +2679,7 @@ static void
xga_writew(uint32_t addr, uint16_t val, void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
if (!xga->on) {
svga_writew(addr, val, svga);
@@ -2693,7 +2694,7 @@ static void
xga_writel(uint32_t addr, uint32_t val, void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
if (!xga->on) {
svga_writel(addr, val, svga);
@@ -2710,7 +2711,7 @@ static uint8_t
xga_read(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
uint8_t ret = 0xff;
if (!xga->on) {
@@ -2740,7 +2741,7 @@ static uint16_t
xga_readw(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
uint16_t ret = 0xffff;
if (!xga->on) {
@@ -2758,7 +2759,7 @@ static uint32_t
xga_readl(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
uint32_t ret = 0xffffffff;
if (!xga->on) {
@@ -2778,7 +2779,7 @@ static void
xga_write_linear(uint32_t addr, uint8_t val, void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
if (!xga->on) {
svga_write_linear(addr, val, svga);
@@ -2810,7 +2811,7 @@ static void
xga_writew_linear(uint32_t addr, uint16_t val, void *priv)
{
svga_t *svga = (svga_t *) priv;
- const xga_t *xga = &svga->xga;
+ const xga_t *xga = (xga_t *) svga->xga;
if (!xga->on) {
svga_writew_linear(addr, val, svga);
@@ -2825,7 +2826,7 @@ static void
xga_writel_linear(uint32_t addr, uint32_t val, void *priv)
{
svga_t *svga = (svga_t *) priv;
- const xga_t *xga = &svga->xga;
+ const xga_t *xga = (xga_t *) svga->xga;
if (!xga->on) {
svga_writel_linear(addr, val, svga);
@@ -2842,7 +2843,7 @@ static uint8_t
xga_read_linear(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) priv;
- const xga_t *xga = &svga->xga;
+ const xga_t *xga = (xga_t *) svga->xga;
uint8_t ret = 0xff;
if (!xga->on)
@@ -2872,7 +2873,7 @@ static uint16_t
xga_readw_linear(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) priv;
- const xga_t *xga = &svga->xga;
+ const xga_t *xga = (xga_t *) svga->xga;
uint16_t ret;
if (!xga->on)
@@ -2888,7 +2889,7 @@ static uint32_t
xga_readl_linear(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) priv;
- const xga_t *xga = &svga->xga;
+ const xga_t *xga = (xga_t *) svga->xga;
uint32_t ret;
if (!xga->on)
@@ -2905,7 +2906,7 @@ xga_readl_linear(uint32_t addr, void *priv)
static void
xga_do_render(svga_t *svga)
{
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
xga_log("DISPCNTL = %d, vga = %d.\n", xga->disp_cntl_2 & 7, vga_on);
switch (xga->disp_cntl_2 & 7) {
@@ -2936,8 +2937,9 @@ xga_do_render(svga_t *svga)
}
void
-xga_poll(xga_t *xga, svga_t *svga)
+xga_poll(void *priv, svga_t *svga)
{
+ xga_t *xga = (xga_t *) priv;
uint32_t x;
int wx;
int wy;
@@ -3075,7 +3077,7 @@ static uint8_t
xga_mca_read(int port, void *priv)
{
const svga_t *svga = (svga_t *) priv;
- const xga_t *xga = &svga->xga;
+ const xga_t *xga = (xga_t *) svga->xga;
uint8_t ret = xga->pos_regs[port & 7];
if (((port & 7) == 3) && !(ret & 1)) /*Always enable the mapping.*/
@@ -3091,7 +3093,7 @@ static void
xga_mca_write(int port, uint8_t val, void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
/* MCA does not write registers below 0x0100. */
if (port < 0x0102)
@@ -3133,7 +3135,7 @@ static uint8_t
xga_mca_feedb(void *priv)
{
const svga_t *svga = (svga_t *) priv;
- const xga_t *xga = &svga->xga;
+ const xga_t *xga = (xga_t *) svga->xga;
return xga->pos_regs[2] & 1;
}
@@ -3142,7 +3144,7 @@ static void
xga_mca_reset(void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
mem_mapping_disable(&xga->bios_rom.mapping);
mem_mapping_disable(&xga->memio_mapping);
@@ -3155,7 +3157,7 @@ static void
xga_reset(void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
mem_mapping_disable(&xga->bios_rom.mapping);
mem_mapping_disable(&xga->memio_mapping);
@@ -3169,7 +3171,7 @@ static uint8_t
xga_pos_in(uint16_t addr, void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
uint8_t ret = 0xff;
if (!xga_standalone_enabled) {
@@ -3285,7 +3287,7 @@ static void
xga_pos_out(uint16_t addr, uint8_t val, void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
if (!xga_standalone_enabled) {
switch (addr) {
@@ -3337,10 +3339,12 @@ xga_init(const device_t *info)
if (svga_get_pri() == NULL)
return NULL;
- svga_t *svga = svga_get_pri();
- xga_t *xga = &svga->xga;
+ svga_t *svga = svga_get_pri();
+ xga_t *xga = (xga_t *) calloc(1, sizeof(xga_t));
FILE *fp;
- uint8_t *rom = NULL;
+ uint8_t *rom = NULL;
+
+ svga->xga = xga;
xga->ext_mem_addr = device_get_config_hex16("ext_mem_addr");
xga->instance_isa = device_get_config_int("instance");
@@ -3427,8 +3431,7 @@ xga_init(const device_t *info)
static void *
svga_xga_init(const device_t *info)
{
- svga_t *svga = malloc(sizeof(svga_t));
- memset(svga, 0, sizeof(svga_t));
+ svga_t *svga = (svga_t *) calloc(1, sizeof(svga_t));
video_inform(VIDEO_FLAG_TYPE_XGA, &timing_xga_isa);
@@ -3451,11 +3454,13 @@ static void
xga_close(void *priv)
{
svga_t *svga = (svga_t *) priv;
- xga_t *xga = &svga->xga;
+ xga_t *xga = (xga_t *) svga->xga;
if (svga) {
free(xga->vram);
free(xga->changedvram);
+
+ free(xga);
}
}