From: Toni Wilen Date: Sun, 22 Jan 2017 13:55:43 +0000 (+0200) Subject: Fix AGA BPLCON4 xor behavior in HAM6/HAM8/EHB modes. X-Git-Tag: 3500~113 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=13d09ad85c0d029c52122c6378baf82ce75e0b26;p=francis%2Fwinuae.git Fix AGA BPLCON4 xor behavior in HAM6/HAM8/EHB modes. --- diff --git a/drawing.cpp b/drawing.cpp index 2e1c9069..b275cbc3 100644 --- a/drawing.cpp +++ b/drawing.cpp @@ -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; diff --git a/genlinetoscr.cpp b/genlinetoscr.cpp index 326440ad..5ad25657 100644 --- a/genlinetoscr.cpp +++ b/genlinetoscr.cpp @@ -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];");