From e045df2b50b929362500827c9cbb4f4ca17025bb Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 24 Mar 2021 19:35:07 +0100 Subject: [PATCH] (S)VGA clean-ups and fixes (some parts of the COPPER demo should now work), and fixed the graphics modes on the ICS5341. --- src/video/vid_sdac_ramdac.c | 79 +++++++++++++++++++++++++------------ src/video/vid_svga.c | 26 ++++-------- src/video/vid_svga_render.c | 51 +++++++++++++++++++----- src/video/video.c | 1 - 4 files changed, 104 insertions(+), 53 deletions(-) diff --git a/src/video/vid_sdac_ramdac.c b/src/video/vid_sdac_ramdac.c index b4fbfb9b8..4c0334585 100644 --- a/src/video/vid_sdac_ramdac.c +++ b/src/video/vid_sdac_ramdac.c @@ -44,7 +44,7 @@ sdac_control_write(sdac_ramdac_t *ramdac, svga_t *svga, uint8_t val) { ramdac->command = val; - if (ramdac->type == 1 || ramdac->type == 2) { + if (ramdac->type == 1) { switch (val) { case 0xa0: svga->bpp = 15; @@ -67,32 +67,61 @@ sdac_control_write(sdac_ramdac_t *ramdac, svga_t *svga, uint8_t val) svga->bpp = 8; break; } + } else if (ramdac->type == 2) { + switch (val >> 4) { + case 0x00: + default: + svga->bpp = 8; + break; + case 0x01: + case 0x04: + case 0x05: + case 0x09: + svga->bpp = 15; + break; + case 0x08: + svga->bpp = 17; /* 15bpp_mix */ + break; + case 0x03: + case 0x06: + case 0x0a: + svga->bpp = 16; + break; + case 0xc0: + svga->bpp = 24; + break; + case 0x02: + case 0x07: + case 0x0b: + svga->bpp = 32; + break; + } } else { switch (val >> 4) { - case 0x2: - case 0x3: - case 0xa: - case 0x8: - svga->bpp = 15; - break; - case 0x4: - case 0x9: - case 0xe: - svga->bpp = 24; - break; - case 0x5: - case 0x6: - case 0xc: - svga->bpp = 16; - break; - case 0x7: - svga->bpp = 32; - break; - case 0x0: - case 0x1: - default: - svga->bpp = 8; - break; + case 0x2: + case 0x3: + case 0xa: + case 0x8: + svga->bpp = 15; + break; + case 0x4: + case 0x9: + case 0xe: + svga->bpp = 24; + break; + case 0x5: + case 0x6: + case 0xc: + svga->bpp = 16; + break; + case 0x7: + svga->bpp = 32; + break; + case 0x0: + case 0x1: + default: + svga->bpp = 8; + break; } } } diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index 61dcc6d1f..f641d0bb2 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -503,6 +503,12 @@ svga_recalctimings(svga_t *svga) else svga->render = svga_render_16bpp_highres; break; + case 17: + if (svga->lowres) + svga->render = svga_render_15bpp_mix_lowres; + else + svga->render = svga_render_15bpp_mix_highres; + break; case 24: if (svga->lowres) svga->render = svga_render_24bpp_lowres; @@ -1003,7 +1009,7 @@ svga_decode_addr(svga_t *svga, uint32_t addr, int write) } -void +static __inline void svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *p) { svga_t *svga = (svga_t *)p; @@ -1016,8 +1022,6 @@ svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *p) if (svga->adv_flags & FLAG_ADDR_BY8) writemask2 = svga->seqregs[2]; - egawrites++; - cycles -= video_timing_write_b; if (!linear) { @@ -1182,7 +1186,7 @@ svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *p) } -uint8_t +static __inline uint8_t svga_read_common(uint32_t addr, uint8_t linear, void *p) { svga_t *svga = (svga_t *)p; @@ -1197,8 +1201,6 @@ svga_read_common(uint32_t addr, uint8_t linear, void *p) cycles -= video_timing_read_b; - egareads++; - if (!linear) { addr = svga_decode_addr(svga, addr, 0); @@ -1399,8 +1401,6 @@ svga_writeb_linear(uint32_t addr, uint8_t val, void *p) return; } - egawrites++; - addr &= svga->decode_mask; if (addr >= svga->vram_max) return; @@ -1421,8 +1421,6 @@ svga_writew_common(uint32_t addr, uint16_t val, uint8_t linear, void *p) return; } - egawrites += 2; - cycles -= video_timing_write_w; if (!linear) { @@ -1482,8 +1480,6 @@ svga_writel_common(uint32_t addr, uint32_t val, uint8_t linear, void *p) return; } - egawrites += 4; - cycles -= video_timing_write_l; if (!linear) { @@ -1548,8 +1544,6 @@ svga_readb_linear(uint32_t addr, void *p) if (!svga->fast) return svga_read_linear(addr, p); - egareads++; - addr &= svga->decode_mask; if (addr >= svga->vram_max) return 0xff; @@ -1566,8 +1560,6 @@ svga_readw_common(uint32_t addr, uint8_t linear, void *p) if (!svga->fast) return svga_read_common(addr, linear, p) | (svga_read_common(addr + 1, linear, p) << 8); - egareads += 2; - cycles -= video_timing_read_w; if (!linear) { @@ -1619,8 +1611,6 @@ svga_readl_common(uint32_t addr, uint8_t linear, void *p) (svga_read_common(addr + 2, linear, p) << 16) | (svga_read_common(addr + 3, linear, p) << 24); } - egareads += 4; - cycles -= video_timing_read_l; if (!linear) { diff --git a/src/video/vid_svga_render.c b/src/video/vid_svga_render.c index 083ccddbb..8252557d8 100644 --- a/src/video/vid_svga_render.c +++ b/src/video/vid_svga_render.c @@ -667,10 +667,21 @@ svga_render_8bpp_lowres(svga_t *svga) for (x = 0; x <= (svga->hdisp + svga->scrollcache); x += 8) { if (svga->crtc[0x17] & 0x80) { dat = *(uint32_t *)(&svga->vram[svga->ma & svga->vram_display_mask]); + if (svga->attrregs[0x10] & 0x80) + dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); p[0] = p[1] = svga->map8[dat & 0xff]; - p[2] = p[3] = svga->map8[(dat >> 8) & 0xff]; - p[4] = p[5] = svga->map8[(dat >> 16) & 0xff]; - p[6] = p[7] = svga->map8[(dat >> 24) & 0xff]; + dat >>= 8; + if (svga->attrregs[0x10] & 0x80) + dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); + p[2] = p[3] = svga->map8[dat & 0xff]; + dat >>= 8; + if (svga->attrregs[0x10] & 0x80) + dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); + p[4] = p[5] = svga->map8[dat & 0xff]; + dat >>= 8; + if (svga->attrregs[0x10] & 0x80) + dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); + p[6] = p[7] = svga->map8[dat & 0xff]; } else memset(p, 0x00, 8 * sizeof(uint32_t)); @@ -702,16 +713,38 @@ svga_render_8bpp_highres(svga_t *svga) for (x = 0; x <= (svga->hdisp/* + svga->scrollcache*/); x += 8) { if (svga->crtc[0x17] & 0x80) { dat = *(uint32_t *)(&svga->vram[svga->ma & svga->vram_display_mask]); + if (svga->attrregs[0x10] & 0x80) + dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); p[0] = svga->map8[dat & 0xff]; - p[1] = svga->map8[(dat >> 8) & 0xff]; - p[2] = svga->map8[(dat >> 16) & 0xff]; - p[3] = svga->map8[(dat >> 24) & 0xff]; + dat >>= 8; + if (svga->attrregs[0x10] & 0x80) + dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); + p[1] = svga->map8[dat & 0xff]; + dat >>= 8; + if (svga->attrregs[0x10] & 0x80) + dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); + p[2] = svga->map8[dat & 0xff]; + dat >>= 8; + if (svga->attrregs[0x10] & 0x80) + dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); + p[3] = svga->map8[dat & 0xff]; dat = *(uint32_t *)(&svga->vram[(svga->ma + 4) & svga->vram_display_mask]); + if (svga->attrregs[0x10] & 0x80) + dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); p[4] = svga->map8[dat & 0xff]; - p[5] = svga->map8[(dat >> 8) & 0xff]; - p[6] = svga->map8[(dat >> 16) & 0xff]; - p[7] = svga->map8[(dat >> 24) & 0xff]; + dat >>= 8; + if (svga->attrregs[0x10] & 0x80) + dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); + p[5] = svga->map8[dat & 0xff]; + dat >>= 8; + if (svga->attrregs[0x10] & 0x80) + dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); + p[6] = svga->map8[dat & 0xff]; + dat >>= 8; + if (svga->attrregs[0x10] & 0x80) + dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); + p[7] = svga->map8[dat & 0xff]; } else memset(p, 0x00, 8 * sizeof(uint32_t)); diff --git a/src/video/video.c b/src/video/video.c index 00329b07c..fff65a617 100644 --- a/src/video/video.c +++ b/src/video/video.c @@ -85,7 +85,6 @@ dbcs_font_t *fontdatksc5601_user = NULL; /* Korean KSC-5601 user defined font */ uint32_t pal_lookup[256]; int xsize = 1, ysize = 1; -int egareads = 0, egawrites = 0; int cga_palette = 0, herc_blend = 0; uint32_t *video_6to8 = NULL,