From a5fa5b078f8be81c11aef881c4e04052fe445b69 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Fri, 29 Dec 2023 17:48:14 +0200 Subject: [PATCH] Hardware emulated RTG card horizontal panning improvements --- pcem/vid_cl5429.cpp | 55 ++++++++++++++++++++++---- pcem/vid_ncr.cpp | 24 ++++++++++++ pcem/vid_svga.cpp | 34 ++++++++++++++-- pcem/vid_svga.h | 4 +- pcem/vid_svga_render.cpp | 84 +++++++++++++++++++++------------------- 5 files changed, 149 insertions(+), 52 deletions(-) diff --git a/pcem/vid_cl5429.cpp b/pcem/vid_cl5429.cpp index acc145d5..92ea4819 100644 --- a/pcem/vid_cl5429.cpp +++ b/pcem/vid_cl5429.cpp @@ -517,7 +517,7 @@ void gd5429_out(uint16_t addr, uint8_t val, void *p) break; case 0x3c4: - svga->seqaddr = val; + svga->seqaddr = val & 0x1f; break; case 0x3c5: if (svga->seqaddr > 5) @@ -525,14 +525,12 @@ void gd5429_out(uint16_t addr, uint8_t val, void *p) svga->seqregs[svga->seqaddr & 0x1f] = val; switch (svga->seqaddr & 0x1f) { - case 0x10: case 0x30: case 0x50: case 0x70: - case 0x90: case 0xb0: case 0xd0: case 0xf0: + case 0x10: svga->hwcursor.x = (val << 3) | ((svga->seqaddr >> 5) & 7); gd5429->sr10_read = svga->seqaddr & 0xe0; // pclog("svga->hwcursor.x = %i\n", svga->hwcursor.x); break; - case 0x11: case 0x31: case 0x51: case 0x71: - case 0x91: case 0xb1: case 0xd1: case 0xf1: + case 0x11: svga->hwcursor.y = (val << 3) | ((svga->seqaddr >> 5) & 7); gd5429->sr11_read = svga->seqaddr & 0xe0; // pclog("svga->hwcursor.y = %i\n", svga->hwcursor.y); @@ -561,6 +559,7 @@ void gd5429_out(uint16_t addr, uint8_t val, void *p) } svga->packed_chain4 = svga->seqregs[7] & 1; svga_recalctimings(svga); + break; case 0x0f: case 0x17: //UAE @@ -790,7 +789,7 @@ void gd5429_out(uint16_t addr, uint8_t val, void *p) old = val; } - if (old != val) + if (1) { // overlay registers switch (svga->crtcreg) @@ -879,7 +878,7 @@ void gd5429_out(uint16_t addr, uint8_t val, void *p) break; } - if (svga->crtcreg < 0xe || svga->crtcreg > 0x10) + if ((svga->crtcreg < 0xe || svga->crtcreg > 0x10) && old != val) { svga->fullchange = changeframecount; svga_recalctimings(svga); @@ -1174,7 +1173,8 @@ void gd5429_recalctimings(svga_t *svga) if (svga->seqregs[7] & 0x01) { svga->render = svga_render_8bpp_highres; } - + + svga->ma_latch |= ((svga->crtc[0x1b] & 0x01) << 16) | (((svga->crtc[0x1b] >> 2) & 3) << 17); if (gd5429->type >= CL_TYPE_GD5436) { svga->ma_latch |= (((svga->crtc[0x1d] >> 7) & 1) << 19); @@ -1249,6 +1249,44 @@ void gd5429_recalctimings(svga_t *svga) svga->vram_display_mask = (svga->crtc[0x1b] & 2) ? gd5429->vram_mask : 0x3ffff; } +static void gd5429_adjust_panning(svga_t *svga) +{ + gd5429_t *gd5429 = (gd5429_t *)svga->p; + int ar11 = svga->attrregs[0x13] & 7; + int src = 0, dst = 8; + switch (svga->bpp) + { + case 8: + if (svga->horizontal_linedbl) { + dst = 8 - ((ar11 & 3) << 1); + } else { + dst = 8 - ar11; + } + break; + case 15: + case 16: + dst = 8 - ((ar11 & 2) >> 1); + break; + case 24: + if (gd5429->type >= CL_TYPE_GD5446) { + dst = 8 - ((ar11 & 3) << 1); + if (ar11 >= 4) { + src += 3; + } + } else { + src = ar11; + } + break; + case 32: + dst = 8 - (ar11 & 1); + break; + } + + dst += 24; + svga->scrollcache_dst = dst; + svga->scrollcache_src = src; +} + void gd5429_hwcursor_draw(svga_t *svga, int displine) { gd5429_t *gd5429 = (gd5429_t *)svga->p; @@ -2735,6 +2773,7 @@ static void *cl_init(int type, char *fn, int pci_card, uint32_t force_vram_size) gd5429_overlay_draw); gd5429->svga.vblank_start = gd5429_vblank_start; + gd5429->svga.adjust_panning = gd5429_adjust_panning; mem_mapping_set_handlerx(&gd5429->svga.mapping, gd5429_read, gd5429_readw, gd5429_readl, gd5429_write, gd5429_writew, gd5429_writel); mem_mapping_set_px(&gd5429->svga.mapping, gd5429); diff --git a/pcem/vid_ncr.cpp b/pcem/vid_ncr.cpp index 5fcf8d05..77cd00e9 100644 --- a/pcem/vid_ncr.cpp +++ b/pcem/vid_ncr.cpp @@ -1050,6 +1050,29 @@ void ncr_updatemapping(ncr_t *ncr) } } +static void ncr_adjust_panning(svga_t *svga) +{ + int ar11 = svga->attrregs[0x13] & 7; + int src = 0, dst = 8; + + switch (svga->bpp) + { + case 16: + dst = (ar11 & 4) ? 7 : 8; + break; + case 24: + src = ar11 >> 1; + break; + default: + return; + } + + dst += 24; + svga->scrollcache_dst = dst; + svga->scrollcache_src = src; + +} + static inline uint32_t dword_remap(uint32_t in_addr) { return in_addr; @@ -1119,6 +1142,7 @@ static void *ncr_init(char *bios_fn, int chip) } svga->vblank_start = ncr_vblank_start; + svga->adjust_panning = ncr_adjust_panning; ncr_io_set(ncr); diff --git a/pcem/vid_svga.cpp b/pcem/vid_svga.cpp index 00da7515..7580986d 100644 --- a/pcem/vid_svga.cpp +++ b/pcem/vid_svga.cpp @@ -694,8 +694,10 @@ int svga_poll(void *p) // pclog("VC split\n"); svga->ma = svga->maback = 0; svga->sc = 0; - if (svga->attrregs[0x10] & 0x20) - svga->scrollcache = 0; + if (svga->attrregs[0x10] & 0x20) { + svga->scrollcache_dst = 0; + svga->scrollcache_src = 0; + } } } if (svga->vc == svga->dispend) @@ -812,7 +814,7 @@ int svga_poll(void *p) svga->sc = svga->crtc[8] & 0x1f; svga->dispon = 1; svga->displine = (svga->interlace && svga->oddeven) ? 1 : 0; - svga->scrollcache = svga->attrregs[0x13] & 7; + int scrollcache = svga->attrregs[0x13] & 7; svga->linecountff = 0; svga->hwcursor_on = 0; @@ -820,9 +822,35 @@ int svga_poll(void *p) svga->overlay_on = 0; svga->overlay_latch = svga->overlay; + + if (svga->render == svga_render_4bpp_highres || + svga->render == svga_render_2bpp_highres) { + svga->scrollcache_dst = (8 - scrollcache) + 24; + } else if (svga->render == svga_render_4bpp_lowres || + svga->render == svga_render_2bpp_lowres) { + svga->scrollcache_dst = ((8 - scrollcache) << 1) + 16; + } else if (svga->render == svga_render_16bpp_highres || + svga->render == svga_render_15bpp_highres || + svga->render == svga_render_8bpp_highres || + svga->render == svga_render_32bpp_highres || + svga->render == svga_render_32bpp_highres_swaprb || + svga->render == svga_render_ABGR8888_highres || + svga->render == svga_render_RGBA8888_highres) { + svga->scrollcache_dst = (8 - ((scrollcache & 6) >> 1)) + 24; + } else { + svga->scrollcache_dst = (8 - (scrollcache & 6)) + 24; + } + svga->scrollcache_src = 0; + + if (svga->adjust_panning) { + svga->adjust_panning(svga); + } + // pclog("Latch HWcursor addr %08X\n", svga_hwcursor_latch.addr); // pclog("ADDR %08X\n",hwcursor_addr); + + //pclog("%08x %d %d %d\n", svga->ma_latch, svga->attrregs[0x13] & 7, svga->scrollcache_src, svga->scrollcache_dst); } if (svga->sc == (svga->crtc[10] & 31)) svga->con = 1; diff --git a/pcem/vid_svga.h b/pcem/vid_svga.h index df5c0f88..0bcd429a 100644 --- a/pcem/vid_svga.h +++ b/pcem/vid_svga.h @@ -76,7 +76,7 @@ typedef struct svga_t int sc; int linepos, vslines, linecountff, oddeven; int con, cursoron, blink; - int scrollcache; + int scrollcache_src, scrollcache_dst; int char_width; int firstline, lastline; @@ -126,6 +126,8 @@ typedef struct svga_t void (*vblank_start)(struct svga_t *svga); + void (*adjust_panning)(struct svga_t *svga); + /*Called when VC=R18 and friends. If this returns zero then MA resetting is skipped. Matrox Mystique in Power mode reuses this counter for vertical line interrupt*/ diff --git a/pcem/vid_svga_render.cpp b/pcem/vid_svga_render.cpp index 19578df0..cbf1eb94 100644 --- a/pcem/vid_svga_render.cpp +++ b/pcem/vid_svga_render.cpp @@ -48,7 +48,7 @@ void svga_render_text_40(svga_t *svga) if (svga->fullchange) { - int offset = ((8 - svga->scrollcache) << 1) + 16; + int offset = svga->scrollcache_dst; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; int x, xx; int drawcursor; @@ -115,7 +115,7 @@ void svga_render_text_80(svga_t *svga) if (svga->fullchange) { - int offset = (8 - svga->scrollcache) + 24; + int offset = svga->scrollcache_dst; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; int x, xx; int drawcursor; @@ -182,7 +182,7 @@ void svga_render_text_80_ksc5601(svga_t *svga) if (svga->fullchange) { - int offset = (8 - svga->scrollcache) + 24; + int offset = svga->scrollcache_dst; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; int x, xx; int drawcursor; @@ -318,7 +318,7 @@ void svga_render_2bpp_lowres(svga_t *svga) if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { int x; - int offset = ((8 - svga->scrollcache) << 1) + 16; + int offset = svga->scrollcache_dst; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; if (svga->firstline_draw == 4000) @@ -356,7 +356,7 @@ void svga_render_2bpp_highres(svga_t *svga) if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { int x; - int offset = (8 - svga->scrollcache) + 24; + int offset = svga->scrollcache_dst; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; if (svga->firstline_draw == 4000) @@ -392,7 +392,7 @@ void svga_render_4bpp_lowres(svga_t *svga) if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { int x; - int offset = ((8 - svga->scrollcache) << 1) + 16; + int offset = svga->scrollcache_dst; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; if (svga->firstline_draw == 4000) @@ -434,7 +434,7 @@ void svga_render_4bpp_highres(svga_t *svga) if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { int x; - int offset = (8 - svga->scrollcache) + 24; + int offset = svga->scrollcache_dst; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; if (svga->firstline_draw == 4000) @@ -474,7 +474,7 @@ void svga_render_8bpp_lowres(svga_t *svga) if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { int x; - int offset = (8 - (svga->scrollcache & 6)) + 24; + int offset = svga->scrollcache_dst; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; if (svga->firstline_draw == 4000) @@ -523,7 +523,7 @@ void svga_render_8bpp_highres(svga_t *svga) if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { int x; - int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24; + int offset = svga->scrollcache_dst; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; if (svga->firstline_draw == 4000) @@ -576,7 +576,7 @@ void svga_render_15bpp_lowres(svga_t *svga) if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { int x; - int offset = (8 - (svga->scrollcache & 6)) + 24; + int offset = svga->scrollcache_dst; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; if (svga->firstline_draw == 4000) @@ -623,7 +623,7 @@ void svga_render_15bpp_highres(svga_t *svga) if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { int x; - int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24; + int offset = svga->scrollcache_dst; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; if (svga->firstline_draw == 4000) @@ -677,7 +677,7 @@ void svga_render_16bpp_lowres(svga_t *svga) if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { int x; - int offset = (8 - (svga->scrollcache & 6)) + 24; + int offset = svga->scrollcache_dst; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; if (svga->firstline_draw == 4000) @@ -724,7 +724,7 @@ void svga_render_16bpp_highres(svga_t *svga) if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { int x; - int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24; + int offset = svga->scrollcache_dst; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; if (svga->firstline_draw == 4000) @@ -778,7 +778,8 @@ void svga_render_24bpp_lowres(svga_t *svga) if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { int x; - int offset = (8 - (svga->scrollcache & 6)) + 24; + int offset = svga->scrollcache_dst; + int shift = svga->scrollcache_src; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; if (svga->firstline_draw == 4000) @@ -791,7 +792,7 @@ void svga_render_24bpp_lowres(svga_t *svga) for (x = 0; x <= svga->hdisp << svga->horizontal_linedbl; x++) { - uint32_t fg = svga->vram[svga->ma + 2] | (svga->vram[svga->ma + 1] << 8) | (svga->vram[svga->ma + 0] << 16); + uint32_t fg = svga->vram[svga->ma + shift + 2] | (svga->vram[svga->ma + shift + 1] << 8) | (svga->vram[svga->ma + shift + 0] << 16); svga->ma += 3; svga->ma &= svga->vram_display_mask; p[0] = p[1] = fg; @@ -804,9 +805,9 @@ void svga_render_24bpp_lowres(svga_t *svga) for (x = 0; x <= svga->hdisp << svga->horizontal_linedbl; x++) { - uint32_t dat0 = *(uint32_t *)(&svga->vram[svga->ma & svga->vram_display_mask]); - uint32_t dat1 = *(uint32_t *)(&svga->vram[(svga->ma + 4) & svga->vram_display_mask]); - uint32_t dat2 = *(uint32_t *)(&svga->vram[(svga->ma + 8) & svga->vram_display_mask]); + uint32_t dat0 = *(uint32_t *)(&svga->vram[(svga->ma + shift) & svga->vram_display_mask]); + uint32_t dat1 = *(uint32_t *)(&svga->vram[(svga->ma + shift + 4) & svga->vram_display_mask]); + uint32_t dat2 = *(uint32_t *)(&svga->vram[(svga->ma + shift + 8) & svga->vram_display_mask]); p[0] = p[1] = dat0 & 0xffffff; p[2] = p[3] = (dat0 >> 24) | ((dat1 & 0xffff) << 8); @@ -826,11 +827,11 @@ void svga_render_24bpp_lowres(svga_t *svga) uint32_t addr; addr = svga->remap_func(svga, svga->ma); - dat0 = *(uint32_t *)(&svga->vram[addr & svga->vram_display_mask]); + dat0 = *(uint32_t *)(&svga->vram[(addr + shift) & svga->vram_display_mask]); addr = svga->remap_func(svga, svga->ma + 4); - dat1 = *(uint32_t *)(&svga->vram[addr & svga->vram_display_mask]); + dat1 = *(uint32_t *)(&svga->vram[(addr + shift) & svga->vram_display_mask]); addr = svga->remap_func(svga, svga->ma + 8); - dat2 = *(uint32_t *)(&svga->vram[addr & svga->vram_display_mask]); + dat2 = *(uint32_t *)(&svga->vram[(addr + shift) & svga->vram_display_mask]); p[0] = p[1] = dat0 & 0xffffff; p[2] = p[3] = (dat0 >> 24) | ((dat1 & 0xffff) << 8); @@ -851,7 +852,8 @@ void svga_render_24bpp_lowres_swaprb(svga_t *svga) if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { int x; - int offset = (8 - (svga->scrollcache & 6)) + 24; + int offset = svga->scrollcache_dst; + int shift = svga->scrollcache_src; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; if (svga->firstline_draw == 4000) @@ -862,7 +864,7 @@ void svga_render_24bpp_lowres_swaprb(svga_t *svga) { for (x = 0; x <= svga->hdisp << svga->horizontal_linedbl; x++) { - uint32_t fg = svga->vram[svga->ma + 2] | (svga->vram[svga->ma + 1] << 8) | (svga->vram[svga->ma + 0] << 16); + uint32_t fg = svga->vram[svga->ma + shift + 2] | (svga->vram[svga->ma + shift + 1] << 8) | (svga->vram[svga->ma + shift + 0] << 16); svga->ma += 3; svga->ma &= svga->vram_display_mask; p[0] = p[1] = fg; @@ -876,7 +878,7 @@ void svga_render_24bpp_lowres_swaprb(svga_t *svga) uint32_t addr; addr = svga->remap_func(svga, svga->ma); - uint32_t fg = svga->vram[addr + 2] | (svga->vram[addr + 1] << 8) | (svga->vram[addr + 0] << 16); + uint32_t fg = svga->vram[addr + shift + 2] | (svga->vram[addr + shift + 1] << 8) | (svga->vram[addr + shift + 0] << 16); svga->ma += 3; svga->ma &= svga->vram_display_mask; p[0] = p[1] = fg; @@ -894,7 +896,8 @@ void svga_render_24bpp_highres(svga_t *svga) if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { int x; - int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24; + int offset = svga->scrollcache_dst; + int shift = svga->scrollcache_src; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; if (svga->firstline_draw == 4000) @@ -905,9 +908,9 @@ void svga_render_24bpp_highres(svga_t *svga) { for (x = 0; x <= svga->hdisp; x += 4) { - uint32_t dat0 = *(uint32_t *)(&svga->vram[svga->ma & svga->vram_display_mask]); - uint32_t dat1 = *(uint32_t *)(&svga->vram[(svga->ma + 4) & svga->vram_display_mask]); - uint32_t dat2 = *(uint32_t *)(&svga->vram[(svga->ma + 8) & svga->vram_display_mask]); + uint32_t dat0 = *(uint32_t *)(&svga->vram[(svga->ma + shift) & svga->vram_display_mask]); + uint32_t dat1 = *(uint32_t *)(&svga->vram[(svga->ma + shift + 4) & svga->vram_display_mask]); + uint32_t dat2 = *(uint32_t *)(&svga->vram[(svga->ma + shift + 8) & svga->vram_display_mask]); *p++ = dat0 & 0xffffff; *p++ = (dat0 >> 24) | ((dat1 & 0xffff) << 8); @@ -925,11 +928,11 @@ void svga_render_24bpp_highres(svga_t *svga) uint32_t addr; addr = svga->remap_func(svga, svga->ma); - dat0 = *(uint32_t *)(&svga->vram[addr & svga->vram_display_mask]); + dat0 = *(uint32_t *)(&svga->vram[(addr + shift) & svga->vram_display_mask]); addr = svga->remap_func(svga, svga->ma + 4); - dat1 = *(uint32_t *)(&svga->vram[addr & svga->vram_display_mask]); + dat1 = *(uint32_t *)(&svga->vram[(addr + shift) & svga->vram_display_mask]); addr = svga->remap_func(svga, svga->ma + 8); - dat2 = *(uint32_t *)(&svga->vram[addr & svga->vram_display_mask]); + dat2 = *(uint32_t *)(&svga->vram[(addr + shift) & svga->vram_display_mask]); *p++ = dat0 & 0xffffff; *p++ = (dat0 >> 24) | ((dat1 & 0xffff) << 8); @@ -950,7 +953,8 @@ void svga_render_24bpp_highres_swaprb(svga_t *svga) if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { int x; - int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24; + int offset = svga->scrollcache_dst; + int shift = svga->scrollcache_src; uint32_t *p = &((uint32_t*)buffer32->line[svga->displine])[offset]; if (svga->firstline_draw == 4000) @@ -961,7 +965,7 @@ void svga_render_24bpp_highres_swaprb(svga_t *svga) { for (x = 0; x <= svga->hdisp; x++) { - uint32_t fg = svga->vram[svga->ma + 2] | (svga->vram[svga->ma + 1] << 8) | (svga->vram[svga->ma + 0] << 16); + uint32_t fg = svga->vram[svga->ma + shift + 2] | (svga->vram[svga->ma + shift + 1] << 8) | (svga->vram[svga->ma + shift + 0] << 16); svga->ma += 3; svga->ma &= svga->vram_display_mask; *p++ = fg; @@ -972,7 +976,7 @@ void svga_render_24bpp_highres_swaprb(svga_t *svga) for (x = 0; x <= svga->hdisp; x += 4) { uint32_t addr = svga->remap_func(svga, svga->ma); - uint32_t fg = svga->vram[addr + 2] | (svga->vram[addr + 1] << 8) | (svga->vram[addr + 0] << 16); + uint32_t fg = svga->vram[addr + shift + 2] | (svga->vram[addr + shift + 1] << 8) | (svga->vram[addr + shift + 0] << 16); svga->ma += 3; svga->ma &= svga->vram_display_mask; *p++ = fg; @@ -989,7 +993,7 @@ void svga_render_32bpp_lowres(svga_t *svga) if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { int x; - int offset = (8 - (svga->scrollcache & 6)) + 24; + int offset = svga->scrollcache_dst; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; if (svga->firstline_draw == 4000) @@ -1028,7 +1032,7 @@ void svga_render_32bpp_lowres_swaprb(svga_t *svga) if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { int x; - int offset = (8 - (svga->scrollcache & 6)) + 24; + int offset = svga->scrollcache_dst; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; if (svga->firstline_draw == 4000) @@ -1070,7 +1074,7 @@ void svga_render_32bpp_highres(svga_t *svga) if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { int x; - int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24; + int offset = svga->scrollcache_dst; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; if (svga->firstline_draw == 4000) @@ -1108,7 +1112,7 @@ void svga_render_32bpp_highres_swaprb(svga_t *svga) if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { int x; - int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24; + int offset = svga->scrollcache_dst; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; if (svga->firstline_draw == 4000) @@ -1149,7 +1153,7 @@ void svga_render_ABGR8888_highres(svga_t *svga) if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { int x; - int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24; + int offset = svga->scrollcache_dst; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; if (svga->firstline_draw == 4000) @@ -1187,7 +1191,7 @@ void svga_render_RGBA8888_highres(svga_t *svga) if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { int x; - int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24; + int offset = svga->scrollcache_dst; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; if (svga->firstline_draw == 4000) -- 2.47.3