]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Emulate HAM + DPF undocumented feature.
authorToni Wilen <twilen@winuae.net>
Sat, 5 Sep 2020 18:18:13 +0000 (21:18 +0300)
committerToni Wilen <twilen@winuae.net>
Sat, 5 Sep 2020 18:18:13 +0000 (21:18 +0300)
drawing.cpp

index 48ad35dcdf58f87efb6e8c453a5656f962412ac3..f408e219185174241aa33dd4a0a887820d6dbaee 100644 (file)
@@ -2138,15 +2138,31 @@ static void init_ham_decoding (void)
                }
 #endif
        } else {
-               /* OCS/ECS mode HAM6 */
-               while (unpainted_amiga-- > 0) {
-                       int pv = pixdata.apixels[ham_decode_pixel++];
-                       switch (pv & 0x30)
-                       {
-                       case 0x00: ham_lastcolor = colors_for_drawing.color_regs_ecs[pv] & 0xfff; break;
-                       case 0x10: ham_lastcolor &= 0xFF0; ham_lastcolor |= (pv & 0xF); break;
-                       case 0x20: ham_lastcolor &= 0x0FF; ham_lastcolor |= (pv & 0xF) << 8; break;
-                       case 0x30: ham_lastcolor &= 0xF0F; ham_lastcolor |= (pv & 0xF) << 4; break;
+               if (!bpldualpf) {
+                       /* OCS/ECS mode HAM6 */
+                       while (unpainted_amiga-- > 0) {
+                               int pv = pixdata.apixels[ham_decode_pixel++];
+                               switch (pv & 0x30)
+                               {
+                               case 0x00: ham_lastcolor = colors_for_drawing.color_regs_ecs[pv] & 0xfff; break;
+                               case 0x10: ham_lastcolor &= 0xFF0; ham_lastcolor |= (pv & 0xF); break;
+                               case 0x20: ham_lastcolor &= 0x0FF; ham_lastcolor |= (pv & 0xF) << 8; break;
+                               case 0x30: ham_lastcolor &= 0xF0F; ham_lastcolor |= (pv & 0xF) << 4; break;
+                               }
+                       }
+               } else {
+                       /* OCS/ECS mode HAM6 + DPF */
+                       while (unpainted_amiga-- > 0) {
+                               int pv = pixdata.apixels[ham_decode_pixel++];
+                               int *lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
+                               int idx = lookup[pv];
+                               switch (pv & 0x30)
+                               {
+                               case 0x00: ham_lastcolor = colors_for_drawing.color_regs_ecs[idx] & 0xfff; break;
+                               case 0x10: ham_lastcolor &= 0xFF0; ham_lastcolor |= (idx & 0xF); break;
+                               case 0x20: ham_lastcolor &= 0x0FF; ham_lastcolor |= (idx & 0xF) << 8; break;
+                               case 0x30: ham_lastcolor &= 0xF0F; ham_lastcolor |= (idx & 0xF) << 4; break;
+                               }
                        }
                }
        }
@@ -2201,17 +2217,34 @@ static void decode_ham (int pix, int stoppos, int blank)
                }
 #endif
        } else {
-               /* OCS/ECS mode HAM6 */
-               while (todraw_amiga-- > 0) {
-                       int pv = pixdata.apixels[ham_decode_pixel];
-                       switch (pv & 0x30)
-                       {
-                       case 0x00: ham_lastcolor = colors_for_drawing.color_regs_ecs[pv] & 0xfff; break;
-                       case 0x10: ham_lastcolor &= 0xFF0; ham_lastcolor |= (pv & 0xF); break;
-                       case 0x20: ham_lastcolor &= 0x0FF; ham_lastcolor |= (pv & 0xF) << 8; break;
-                       case 0x30: ham_lastcolor &= 0xF0F; ham_lastcolor |= (pv & 0xF) << 4; break;
+               if (!bpldualpf) {
+                       /* OCS/ECS mode HAM6 */
+                       while (todraw_amiga-- > 0) {
+                               int pv = pixdata.apixels[ham_decode_pixel];
+                               switch (pv & 0x30)
+                               {
+                               case 0x00: ham_lastcolor = colors_for_drawing.color_regs_ecs[pv] & 0xfff; break;
+                               case 0x10: ham_lastcolor &= 0xFF0; ham_lastcolor |= (pv & 0xF); break;
+                               case 0x20: ham_lastcolor &= 0x0FF; ham_lastcolor |= (pv & 0xF) << 8; break;
+                               case 0x30: ham_lastcolor &= 0xF0F; ham_lastcolor |= (pv & 0xF) << 4; break;
+                               }
+                               ham_linebuf[ham_decode_pixel++] = ham_lastcolor;
+                       }
+               } else {
+                       /* OCS/ECS mode HAM6 + DPF */
+                       while (todraw_amiga-- > 0) {
+                               int pv = pixdata.apixels[ham_decode_pixel];
+                               int *lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
+                               int idx = lookup[pv];
+                               switch (pv & 0x30)
+                               {
+                               case 0x00: ham_lastcolor = colors_for_drawing.color_regs_ecs[idx] & 0xfff; break;
+                               case 0x10: ham_lastcolor &= 0xFF0; ham_lastcolor |= (idx & 0xF); break;
+                               case 0x20: ham_lastcolor &= 0x0FF; ham_lastcolor |= (idx & 0xF) << 8; break;
+                               case 0x30: ham_lastcolor &= 0xF0F; ham_lastcolor |= (idx & 0xF) << 4; break;
+                               }
+                               ham_linebuf[ham_decode_pixel++] = ham_lastcolor;
                        }
-                       ham_linebuf[ham_decode_pixel++] = ham_lastcolor;
                }
        }
 }