--- uae/src/linetoscr.c 2018/04/24 16:52:50 1.1.1.2 +++ uae/src/linetoscr.c 2018/04/24 17:12:22 1.1.1.5 @@ -1,41 +1,62 @@ -static int LNAME (int spix, int dpix, int stoppos) +static NOINLINE int LNAME (int spix, int dpix, int stoppos) { TYPE *buf = ((TYPE *)xlinebuffer); uae_u8 xor_val; - if (AGA) xor_val = (uae_u8)(dp_for_drawing->bplcon4 >> 8); - if (bplham && bplplanecnt >= 6) { + if (AGAC) xor_val = (uae_u8)(dp_for_drawing->bplcon4 >> 8); + if (dp_for_drawing->ham_seen) { /* HAM 6 / HAM 8 */ while (dpix < stoppos) { - TYPE d = AGA ? CONVERT_RGB (ham_linebuf[spix]) : xcolors[ham_linebuf[spix]]; + TYPE d = AGAC ? CONVERT_RGB (ham_linebuf[spix]) : xcolors[ham_linebuf[spix]]; spix += SRC_INC; buf[dpix++] = d; if (HDOUBLE) buf[dpix++] = d; } } else if (bpldualpf) { - /* Dual playfield (AGA broken) */ - int *lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1; - while (dpix < stoppos) { - int pixcol = pixdata.apixels[spix]; - TYPE d = colors_for_drawing.acolors[lookup[pixcol]]; - spix += SRC_INC; - buf[dpix++] = d; - if (HDOUBLE) + if (AGAC) { + /* AGA Dual playfield */ + int *lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga; + int *lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1; + while (dpix < stoppos) { + int pixcol = pixdata.apixels[spix]; + TYPE d; + if (spriteagadpfpixels[spix]) { + d = colors_for_drawing.acolors[spriteagadpfpixels[spix]]; + spriteagadpfpixels[spix]=0; + } else { + int val = lookup[pixcol]; + if (lookup_no[pixcol] == 2) val += dblpfofs[bpldualpf2of]; + /* val ^= xor; ??? */ + d = colors_for_drawing.acolors[val]; + } + spix += SRC_INC; buf[dpix++] = d; + if (HDOUBLE) + buf[dpix++] = d; + } + } else { + /* OCS/ECS Dual playfield */ + int *lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1; + while (dpix < stoppos) { + int pixcol = pixdata.apixels[spix]; + TYPE d = colors_for_drawing.acolors[lookup[pixcol]]; + spix += SRC_INC; + buf[dpix++] = d; + if (HDOUBLE) + buf[dpix++] = d; + } } } else if (bplehb) { while (dpix < stoppos) { int p = pixdata.apixels[spix]; TYPE d = colors_for_drawing.acolors[p]; spix += SRC_INC; - if (AGA) { + if (AGAC) { /* AGA EHB playfield */ - int ehbtmp = (p >= 32 - ? (colors_for_drawing.color_regs_aga[(p-32)^xor_val] >> 1) & 0x7F7F7F - : colors_for_drawing.color_regs_aga[p]); - d = CONVERT_RGB (ehbtmp); + if (p>= 32 && p < 64) /* FIXME: what about sprite colors between 32 and 64? */ + d = (colors_for_drawing.color_regs_aga[(p-32)^xor_val] >> 1) & 0x7F7F7F; } else { /* OCS/ECS EHB playfield */ if (p >= 32) @@ -47,7 +68,7 @@ static int LNAME (int spix, int dpix, in } } else { while (dpix < stoppos) { - TYPE d = (AGA ? colors_for_drawing.acolors[pixdata.apixels[spix]^xor_val] + TYPE d = (AGAC ? colors_for_drawing.acolors[pixdata.apixels[spix]^xor_val] : colors_for_drawing.acolors[pixdata.apixels[spix]]); spix += SRC_INC; buf[dpix++] = d; @@ -61,4 +82,4 @@ static int LNAME (int spix, int dpix, in #undef LNAME #undef HDOUBLE #undef SRC_INC -#undef AGA +#undef AGAC