]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Fix AGA BPLCON4 xor behavior in HAM6/HAM8/EHB modes.
authorToni Wilen <twilen@winuae.net>
Sun, 22 Jan 2017 13:55:43 +0000 (15:55 +0200)
committerToni Wilen <twilen@winuae.net>
Sun, 22 Jan 2017 13:55:43 +0000 (15:55 +0200)
drawing.cpp
genlinetoscr.cpp

index 2e1c90695203b254205328ad26992378c26d8c01..b275cbc3ab4f708d82829c3fedc88b799a688dad 100644 (file)
@@ -2012,22 +2012,25 @@ static void init_ham_decoding (void)
        } else if (currprefs.chipset_mask & CSMASK_AGA) {
                if (bplplanecnt >= 7) { /* AGA mode HAM8 */
                        while (unpainted_amiga-- > 0) {
-                               int pv = pixdata.apixels[ham_decode_pixel++] ^ bplxor;
+                               int pw = pixdata.apixels[ham_decode_pixel++];
+                               int pv = pw ^ bplxor;
+                               int pc = pv >> 2;
                                switch (pv & 0x3)
                                {
-                               case 0x0: ham_lastcolor = colors_for_drawing.color_regs_aga[pv >> 2] & 0xffffff; break;
-                               case 0x1: ham_lastcolor &= 0xFFFF03; ham_lastcolor |= (pv & 0xFC); break;
-                               case 0x2: ham_lastcolor &= 0x03FFFF; ham_lastcolor |= (pv & 0xFC) << 16; break;
-                               case 0x3: ham_lastcolor &= 0xFF03FF; ham_lastcolor |= (pv & 0xFC) << 8; break;
+                               case 0x0: ham_lastcolor = colors_for_drawing.color_regs_aga[pc] & 0xffffff; break;
+                               case 0x1: ham_lastcolor &= 0xFFFF03; ham_lastcolor |= (pw & 0xFC); break;
+                               case 0x2: ham_lastcolor &= 0x03FFFF; ham_lastcolor |= (pw & 0xFC) << 16; break;
+                               case 0x3: ham_lastcolor &= 0xFF03FF; ham_lastcolor |= (pw & 0xFC) << 8; break;
                                }
                        }
                } else { /* AGA mode HAM6 */
                        while (unpainted_amiga-- > 0) {
-                               int pv = pixdata.apixels[ham_decode_pixel++] ^ bplxor;
-                               uae_u32 pc = ((pv & 0xf) << 0) | ((pv & 0xf) << 4);
+                               int pw = pixdata.apixels[ham_decode_pixel++];
+                               int pv = pw ^ bplxor;
+                               uae_u32 pc = ((pw & 0xf) << 0) | ((pw & 0xf) << 4);
                                switch (pv & 0x30)
                                {
-                               case 0x00: ham_lastcolor = colors_for_drawing.color_regs_aga[pv] & 0xffffff; break;
+                               case 0x00: ham_lastcolor = colors_for_drawing.color_regs_aga[pv & 0x0f] & 0xffffff; break;
                                case 0x10: ham_lastcolor &= 0xFFFF00; ham_lastcolor |= pc << 0; break;
                                case 0x20: ham_lastcolor &= 0x00FFFF; ham_lastcolor |= pc << 16; break;
                                case 0x30: ham_lastcolor &= 0xFF00FF; ham_lastcolor |= pc << 8; break;
@@ -2071,23 +2074,26 @@ static void decode_ham (int pix, int stoppos, bool blank)
        } else if (currprefs.chipset_mask & CSMASK_AGA) {
                if (bplplanecnt >= 7) { /* AGA mode HAM8 */
                        while (todraw_amiga-- > 0) {
-                               int pv = pixdata.apixels[ham_decode_pixel] ^ bplxor;
+                               int pw = pixdata.apixels[ham_decode_pixel];
+                               int pv = pw ^ bplxor;
+                               int pc = pv >> 2;
                                switch (pv & 0x3)
                                {
-                               case 0x0: ham_lastcolor = colors_for_drawing.color_regs_aga[pv >> 2] & 0xffffff; break;
-                               case 0x1: ham_lastcolor &= 0xFFFF03; ham_lastcolor |= (pv & 0xFC); break;
-                               case 0x2: ham_lastcolor &= 0x03FFFF; ham_lastcolor |= (pv & 0xFC) << 16; break;
-                               case 0x3: ham_lastcolor &= 0xFF03FF; ham_lastcolor |= (pv & 0xFC) << 8; break;
+                               case 0x0: ham_lastcolor = colors_for_drawing.color_regs_aga[pc] & 0xffffff; break;
+                               case 0x1: ham_lastcolor &= 0xFFFF03; ham_lastcolor |= (pw & 0xFC); break;
+                               case 0x2: ham_lastcolor &= 0x03FFFF; ham_lastcolor |= (pw & 0xFC) << 16; break;
+                               case 0x3: ham_lastcolor &= 0xFF03FF; ham_lastcolor |= (pw & 0xFC) << 8; break;
                                }
                                ham_linebuf[ham_decode_pixel++] = ham_lastcolor;
                        }
                } else { /* AGA mode HAM6 */
                        while (todraw_amiga-- > 0) {
-                               int pv = pixdata.apixels[ham_decode_pixel] ^ bplxor;
-                               uae_u32 pc = ((pv & 0xf) << 0) | ((pv & 0xf) << 4);
+                               int pw = pixdata.apixels[ham_decode_pixel];
+                               int pv = pw ^ bplxor;
+                               uae_u32 pc = ((pw & 0xf) << 0) | ((pw & 0xf) << 4);
                                switch (pv & 0x30)
                                {
-                               case 0x00: ham_lastcolor = colors_for_drawing.color_regs_aga[pv] & 0xffffff; break;
+                               case 0x00: ham_lastcolor = colors_for_drawing.color_regs_aga[pv & 0x0f] & 0xffffff; break;
                                case 0x10: ham_lastcolor &= 0xFFFF00; ham_lastcolor |= pc << 0; break;
                                case 0x20: ham_lastcolor &= 0x00FFFF; ham_lastcolor |= pc << 16; break;
                                case 0x30: ham_lastcolor &= 0xFF00FF; ham_lastcolor |= pc << 8; break;
index 326440ade57858bc55679deb167902bbe8b7767e..5ad25657daa97a5da67926007e137c317efe0149 100644 (file)
@@ -142,7 +142,8 @@ static void out_linetoscr_do_srcpix (DEPTH_T bpp, HMODE_T hmode, int aga, CMODE_
                if (aga && cmode != CMODE_DUALPF) {
                        if (spr)
                                outln (     "    sprpix_val = pixdata.apixels[spix];");
-                       outln (         "    spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;");
+                       if (cmode != CMODE_HAM)
+                               outln (         "    spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;");
                } else if (cmode != CMODE_HAM) {
                        outln (         "    spix_val = pixdata.apixels[spix];");
                        if (spr)
@@ -174,8 +175,8 @@ static void out_linetoscr_do_dstpix (DEPTH_T bpp, HMODE_T hmode, int aga, CMODE_
        } else if (cmode == CMODE_DUALPF) {
                outln (         "    dpix_val = p_acolors[lookup[spix_val]];");
        } else if (aga && cmode == CMODE_EXTRAHB) {
-               outln (         "    if (spix_val >= 32 && spix_val < 64) {");
-               outln (         "        unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F;");
+               outln (         "    if (pixdata.apixels[spix] & 0x20) {");
+               outln (         "        unsigned int c = (colors_for_drawing.color_regs_aga[spix_val & 0x1f] >> 1) & 0x7F7F7F;");
                outln (         "        dpix_val = CONVERT_RGB (c);");
                outln (         "    } else");
                outln (         "        dpix_val = p_acolors[spix_val];");