]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Fix wrong 24-bit/32-bit colors in hardware emulated RTG board that swap R and B color...
authorToni Wilen <twilen@winuae.net>
Sun, 7 Aug 2022 17:48:20 +0000 (20:48 +0300)
committerToni Wilen <twilen@winuae.net>
Sun, 7 Aug 2022 17:48:20 +0000 (20:48 +0300)
pcem/vid_svga.cpp
pcem/vid_svga_render.cpp
pcem/vid_svga_render.h

index c2a552262ec7b0fc0012aca24725bb9c94f1f483..f01681bae628a3eb2c2f411117f1efa38caea0c7 100644 (file)
@@ -498,6 +498,16 @@ void svga_recalctimings(svga_t *svga)
                 if (svga->render == svga_render_32bpp_highres)
                     svga->render = svga_render_32bpp_lowres;
             }
+            if (svga->swaprb) {
+                if (svga->render == svga_render_24bpp_lowres)
+                    svga->render = svga_render_24bpp_lowres_swaprb;
+                if (svga->render == svga_render_24bpp_highres)
+                    svga->render = svga_render_24bpp_highres_swaprb;
+                if (svga->render == svga_render_32bpp_lowres)
+                    svga->render = svga_render_32bpp_lowres_swaprb;
+                if (svga->render == svga_render_32bpp_highres)
+                    svga->render = svga_render_32bpp_highres_swaprb;
+            }
         }
 
         crtcconst = svga->clock * svga->char_width;
index a3514c995a63cf91a1382b5c7131741e9194039c..19578df01e7b291827083bc04e9a97a8850c1298 100644 (file)
@@ -844,6 +844,49 @@ void svga_render_24bpp_lowres(svga_t *svga)
         }
 }
 
+void svga_render_24bpp_lowres_swaprb(svga_t *svga)
+{
+        uint32_t changed_addr = svga->remap_func(svga, svga->ma);
+
+        if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
+        {
+                int x;
+                int offset = (8 - (svga->scrollcache & 6)) + 24;
+                uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
+
+                if (svga->firstline_draw == 4000) 
+                        svga->firstline_draw = svga->displine;
+                svga->lastline_draw = svga->displine;
+
+                if (!svga->remap_required)
+                {
+                            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);
+                                svga->ma += 3;
+                                svga->ma &= svga->vram_display_mask;
+                                p[0] = p[1] = fg;
+                                p += 2;
+                            }
+                }
+                else
+                {
+                            for (x = 0; x <= svga->hdisp << svga->horizontal_linedbl; x++)
+                            {
+                                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);
+                                svga->ma += 3;
+                                svga->ma &= svga->vram_display_mask;
+                                p[0] = p[1] = fg;
+                                p += 2;
+                            }
+                }
+        }
+}
+
+
 void svga_render_24bpp_highres(svga_t *svga)
 {
         uint32_t changed_addr = svga->remap_func(svga, svga->ma);
@@ -900,6 +943,45 @@ void svga_render_24bpp_highres(svga_t *svga)
         }
 }
 
+void svga_render_24bpp_highres_swaprb(svga_t *svga)
+{
+        uint32_t changed_addr = svga->remap_func(svga, svga->ma);
+
+        if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
+        {
+                int x;
+                int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
+                uint32_t *p = &((uint32_t*)buffer32->line[svga->displine])[offset];
+                
+                if (svga->firstline_draw == 4000) 
+                        svga->firstline_draw = svga->displine;
+                svga->lastline_draw = svga->displine;
+
+                if (!svga->remap_required)
+                {
+                        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);
+                                svga->ma += 3;
+                                svga->ma &= svga->vram_display_mask;
+                                *p++ = fg;
+                        }
+                }
+                else
+                {
+                        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);
+                                svga->ma += 3;
+                                svga->ma &= svga->vram_display_mask;
+                                *p++ = fg;
+                        }
+                }
+                svga->ma &= svga->vram_display_mask;
+        }
+}
+
 void svga_render_32bpp_lowres(svga_t *svga)
 {
         uint32_t changed_addr = svga->remap_func(svga, svga->ma);
@@ -939,8 +1021,48 @@ void svga_render_32bpp_lowres(svga_t *svga)
         }
 }
 
-/*72%
-  91%*/
+void svga_render_32bpp_lowres_swaprb(svga_t *svga)
+{
+        uint32_t changed_addr = svga->remap_func(svga, svga->ma);
+
+        if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
+        {
+                int x;
+                int offset = (8 - (svga->scrollcache & 6)) + 24;
+                uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
+
+                if (svga->firstline_draw == 4000) 
+                        svga->firstline_draw = svga->displine;
+                svga->lastline_draw = svga->displine;
+
+                if (!svga->remap_required)
+                {
+                        for (x = 0; x <= svga->hdisp << svga->horizontal_linedbl; x++)
+                        {
+                                uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 2)) & svga->vram_display_mask]);
+                                dat = ((dat & 0xff0000) >> 16) | ((dat & 0x0000ff) << 16) | ((dat & 0x00ff00));
+                                *p++ = dat & 0xffffff;
+                                *p++ = dat & 0xffffff;
+                        }
+                        svga->ma += x * 4;
+                }
+                else
+                {
+                        for (x = 0; x <= svga->hdisp << svga->horizontal_linedbl; x++)
+                        {
+                                uint32_t addr = svga->remap_func(svga, svga->ma);
+                                uint32_t dat = *(uint32_t *)(&svga->vram[addr]);
+                                dat = ((dat & 0xff0000) >> 16) | ((dat & 0x0000ff) << 16) | ((dat & 0x00ff00));
+                                *p++ = dat & 0xffffff;
+                                *p++ = dat & 0xffffff;
+                                svga->ma += 4;
+                        }
+                }
+                svga->ma &= svga->vram_display_mask;
+        }
+}
+
+
 void svga_render_32bpp_highres(svga_t *svga)
 {
         uint32_t changed_addr = svga->remap_func(svga, svga->ma);
@@ -979,6 +1101,47 @@ void svga_render_32bpp_highres(svga_t *svga)
         }
 }
 
+void svga_render_32bpp_highres_swaprb(svga_t *svga)
+{
+        uint32_t changed_addr = svga->remap_func(svga, svga->ma);
+
+        if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
+        {
+                int x;
+                int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
+                uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
+                
+                if (svga->firstline_draw == 4000) 
+                        svga->firstline_draw = svga->displine;
+                svga->lastline_draw = svga->displine;
+
+                if (!svga->remap_required)
+                {
+                        for (x = 0; x <= svga->hdisp; x++)
+                        {
+                                uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 2)) & svga->vram_display_mask]);
+                                dat = ((dat & 0xff0000) >> 16) | ((dat & 0x0000ff) << 16) | ((dat & 0x00ff00));
+                                *p++ = dat & 0xffffff;
+                        }
+                        svga->ma += x * 4;
+                }
+                else
+                {
+                        for (x = 0; x <= svga->hdisp; x++)
+                        {
+                                uint32_t addr = svga->remap_func(svga, svga->ma);
+                                uint32_t dat = *(uint32_t *)(&svga->vram[addr & svga->vram_display_mask]);
+                                dat = ((dat & 0xff0000) >> 16) | ((dat & 0x0000ff) << 16) | ((dat & 0x00ff00));
+                                *p++ = dat & 0xffffff;
+                                svga->ma += 4;
+                        }
+                }
+
+                svga->ma &= svga->vram_display_mask;
+        }
+}
+
+
 void svga_render_ABGR8888_highres(svga_t *svga)
 {
         uint32_t changed_addr = svga->remap_func(svga, svga->ma);
index e0f81e5eae962974464172a768ccf52d70aca58b..2a94c57f68e01eba50d7465220c985854f8a8624 100644 (file)
@@ -28,9 +28,13 @@ void svga_render_15bpp_highres(svga_t *svga);
 void svga_render_16bpp_lowres(svga_t *svga);
 void svga_render_16bpp_highres(svga_t *svga);
 void svga_render_24bpp_lowres(svga_t *svga);
+void svga_render_24bpp_lowres_swaprb(svga_t *svga);
 void svga_render_24bpp_highres(svga_t *svga);
+void svga_render_24bpp_highres_swaprb(svga_t *svga);
 void svga_render_32bpp_lowres(svga_t *svga);
+void svga_render_32bpp_lowres_swaprb(svga_t *svga);
 void svga_render_32bpp_highres(svga_t *svga);
+void svga_render_32bpp_highres_swaprb(svga_t *svga);
 void svga_render_ABGR8888_highres(svga_t *svga);
 void svga_render_RGBA8888_highres(svga_t *svga);