From f4303dfce281bcde85d459316d4a9669099a1dff Mon Sep 17 00:00:00 2001 From: TC1995 Date: Thu, 5 Sep 2024 01:06:34 +0200 Subject: [PATCH] XGA changes of the day (September 5th, 2024) Don't overwrite the VGA DAC mask in XGA mode, instead, using dedicated variables for it. --- src/include/86box/vid_xga.h | 6 +++++ src/video/vid_xga.c | 54 ++++++++++++++++++------------------- 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/src/include/86box/vid_xga.h b/src/include/86box/vid_xga.h index e5248b309..0686972ca 100644 --- a/src/include/86box/vid_xga.h +++ b/src/include/86box/vid_xga.h @@ -47,6 +47,8 @@ typedef struct xga_t { uint8_t pos_regs[8]; uint8_t disp_addr; + uint8_t dac_mask; + uint8_t dac_status; uint8_t cfg_reg; uint8_t instance; uint8_t op_mode; @@ -106,6 +108,10 @@ typedef struct xga_t { uint16_t old_pal_addr_idx; uint16_t sprite_pal_addr_idx_prefetch; + int dac_addr; + int dac_pos; + int dac_r; + int dac_g; int v_total; int dispend; int v_syncstart; diff --git a/src/video/vid_xga.c b/src/video/vid_xga.c index f1cad184e..824a3dbf0 100644 --- a/src/video/vid_xga.c +++ b/src/video/vid_xga.c @@ -417,8 +417,8 @@ xga_ext_out_reg(xga_t *xga, svga_t *svga, uint8_t idx, uint8_t val) case 0x60: xga->sprite_pal_addr_idx = (xga->sprite_pal_addr_idx & 0x3f00) | val; - svga->dac_pos = 0; - svga->dac_addr = val & 0xff; + xga->dac_pos = 0; + xga->dac_addr = val & 0xff; break; case 0x61: xga->sprite_pal_addr_idx = (xga->sprite_pal_addr_idx & 0xff) | ((val & 0x3f) << 8); @@ -430,8 +430,8 @@ xga_ext_out_reg(xga_t *xga, svga_t *svga, uint8_t idx, uint8_t val) case 0x62: xga->sprite_pal_addr_idx_prefetch = (xga->sprite_pal_addr_idx_prefetch & 0x3f00) | val; - svga->dac_pos = 0; - svga->dac_addr = val & 0xff; + xga->dac_pos = 0; + xga->dac_addr = val & 0xff; break; case 0x63: xga->sprite_pal_addr_idx_prefetch = (xga->sprite_pal_addr_idx_prefetch & 0xff) | ((val & 0x3f) << 8); @@ -439,29 +439,29 @@ xga_ext_out_reg(xga_t *xga, svga_t *svga, uint8_t idx, uint8_t val) break; case 0x64: - svga->dac_mask = val; + xga->dac_mask = val; break; case 0x65: svga->fullchange = svga->monitor->mon_changeframecount; - switch (svga->dac_pos) { + switch (xga->dac_pos) { case 0: - svga->dac_r = val; - svga->dac_pos++; + xga->dac_r = val; + xga->dac_pos++; break; case 1: - svga->dac_g = val; - svga->dac_pos++; + xga->dac_g = val; + xga->dac_pos++; break; case 2: xga->pal_b = val; - index = svga->dac_addr & 0xff; - svga->vgapal[index].r = svga->dac_r; - svga->vgapal[index].g = svga->dac_g; + index = xga->dac_addr & 0xff; + svga->vgapal[index].r = xga->dac_r; + svga->vgapal[index].g = xga->dac_g; svga->vgapal[index].b = xga->pal_b; xga->pallook[index] = makecol32(svga->vgapal[index].r, svga->vgapal[index].g, svga->vgapal[index].b); - svga->dac_pos = 0; - svga->dac_addr = (svga->dac_addr + 1) & 0xff; + xga->dac_pos = 0; + xga->dac_addr = (xga->dac_addr + 1) & 0xff; break; default: @@ -474,13 +474,13 @@ xga_ext_out_reg(xga_t *xga, svga_t *svga, uint8_t idx, uint8_t val) break; case 0x67: - svga->dac_r = val; + xga->dac_r = val; break; case 0x68: xga->pal_b = val; break; case 0x69: - svga->dac_g = val; + xga->dac_g = val; break; case 0x6a: @@ -730,24 +730,24 @@ xga_ext_inb(uint16_t addr, void *priv) break; case 0x64: - ret = svga->dac_mask; + ret = xga->dac_mask; break; case 0x65: - index = svga->dac_addr & 0xff; - switch (svga->dac_pos) { + index = xga->dac_addr & 0xff; + switch (xga->dac_pos) { case 0: - svga->dac_pos++; + xga->dac_pos++; ret = svga->vgapal[index].r; break; case 1: - svga->dac_pos++; + xga->dac_pos++; ret = svga->vgapal[index].g; break; case 2: - svga->dac_pos = 0; - svga->dac_addr = (svga->dac_addr + 1) & 0xff; - ret = svga->vgapal[index].b; + xga->dac_pos = 0; + xga->dac_addr = (xga->dac_addr + 1) & 0xff; + ret = svga->vgapal[index].b; break; default: @@ -760,13 +760,13 @@ xga_ext_inb(uint16_t addr, void *priv) break; case 0x67: - ret = svga->dac_r; + ret = xga->dac_r; break; case 0x68: ret = xga->pal_b; break; case 0x69: - ret = svga->dac_g; + ret = xga->dac_g; break; case 0x6a: