static void out_linetoscr_do_incspix (DEPTH_T bpp, HMODE_T hmode, int aga, CMODE_T cmode, int spr) { if (hmode == HMODE_HALVE1F) { outln ( " {"); outln ( " uae_u32 tmp_val;"); outln ( " spix++;"); outln ( " tmp_val = dpix_val;"); out_linetoscr_do_srcpix (bpp, hmode, aga, cmode, spr); out_linetoscr_do_dstpix (bpp, hmode, aga, cmode, spr); outlnf ( " dpix_val = merge_2pixel%d (dpix_val, tmp_val);", bpp == 0 ? 8 : bpp == 1 ? 16 : 32); outln ( " spix++;"); outln ( " }"); } else if (hmode == HMODE_HALVE2F) { outln ( " {"); outln ( " uae_u32 tmp_val, tmp_val2, tmp_val3;"); outln ( " spix++;"); outln ( " tmp_val = dpix_val;"); out_linetoscr_do_srcpix (bpp, hmode, aga, cmode, spr); out_linetoscr_do_dstpix (bpp, hmode, aga, cmode, spr); outln ( " spix++;"); outln ( " tmp_val2 = dpix_val;"); out_linetoscr_do_srcpix (bpp, hmode, aga, cmode, spr); out_linetoscr_do_dstpix (bpp, hmode, aga, cmode, spr); outln ( " spix++;"); outln ( " tmp_val3 = dpix_val;"); out_linetoscr_do_srcpix (bpp, hmode, aga, cmode, spr); out_linetoscr_do_dstpix (bpp, hmode, aga, cmode, spr); outlnf ( " tmp_val = merge_2pixel%d (tmp_val, tmp_val2);", bpp == 0 ? 8 : bpp == 1 ? 16 : 32); outlnf ( " tmp_val2 = merge_2pixel%d (tmp_val3, dpix_val);", bpp == 0 ? 8 : bpp == 1 ? 16 : 32); outlnf ( " dpix_val = merge_2pixel%d (tmp_val, tmp_val2);", bpp == 0 ? 8 : bpp == 1 ? 16 : 32); outln ( " spix++;"); outln ( " }"); } else if (hmode == HMODE_HALVE1) { outln ( " spix += 2;"); } else if (hmode == HMODE_HALVE2) { outln ( " spix += 4;"); } else { outln ( " spix++;"); } }
static void out_linetoscr_mode (DEPTH_T bpp, HMODE_T hmode, int aga, CMODE_T cmode) { int old_indent = set_indent (8); if (aga && cmode == CMODE_DUALPF) { outln ( "int *lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;"); outln ( "int *lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;"); } else if (cmode == CMODE_DUALPF) outln ( "int *lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;"); /* TODO: add support for combining pixel writes in 8-bpp modes. */ if (bpp == DEPTH_16BPP && hmode != HMODE_DOUBLE) { outln ( "int rem;"); outln ( "if (((long)&buf[dpix]) & 2) {"); outln ( " uae_u32 spix_val;"); outln ( " uae_u32 dpix_val;"); out_linetoscr_do_srcpix (bpp, hmode, aga, cmode); out_linetoscr_do_dstpix (bpp, hmode, aga, cmode); out_linetoscr_do_incspix (bpp, hmode, aga, cmode); outln ( " buf[dpix++] = dpix_val;"); outln ( "}"); outln ( "if (dpix >= stoppos)"); outln ( " return spix;"); outln ( "rem = (((long)&buf[stoppos]) & 2);"); outln ( "if (rem)"); outln ( " stoppos--;"); } outln ( "while (dpix < stoppos) {"); outln ( " uae_u32 spix_val;"); outln ( " uae_u32 dpix_val;"); outln ( " uae_u32 out_val;"); outln ( ""); out_linetoscr_do_srcpix (bpp, hmode, aga, cmode); out_linetoscr_do_dstpix (bpp, hmode, aga, cmode); out_linetoscr_do_incspix (bpp, hmode, aga, cmode); outln ( " out_val = dpix_val;"); if (hmode != HMODE_DOUBLE && bpp == DEPTH_16BPP) { out_linetoscr_do_srcpix (bpp, hmode, aga, cmode); out_linetoscr_do_dstpix (bpp, hmode, aga, cmode); out_linetoscr_do_incspix (bpp, hmode, aga, cmode); if (do_bigendian) outln ( " out_val = (out_val << 16) | (dpix_val & 0xFFFF);"); else outln ( " out_val = (out_val & 0xFFFF) | (dpix_val << 16);"); } if (hmode == HMODE_DOUBLE) { if (bpp == DEPTH_8BPP) { outln ( " *((uae_u16 *)&buf[dpix]) = (uae_u16) out_val;"); outln ( " dpix += 2;"); } else if (bpp == DEPTH_16BPP) { outln ( " *((uae_u32 *)&buf[dpix]) = out_val;"); outln ( " dpix += 2;"); } else { outln ( " buf[dpix++] = out_val;"); outln ( " buf[dpix++] = out_val;"); } } else { if (bpp == DEPTH_16BPP) { outln ( " *((uae_u32 *)&buf[dpix]) = out_val;"); outln ( " dpix += 2;"); } else outln ( " buf[dpix++] = out_val;"); } outln ( "}"); if (bpp == DEPTH_16BPP && hmode != HMODE_DOUBLE) { outln ( "if (rem) {"); outln ( " uae_u32 spix_val;"); outln ( " uae_u32 dpix_val;"); out_linetoscr_do_srcpix (bpp, hmode, aga, cmode); out_linetoscr_do_dstpix (bpp, hmode, aga, cmode); out_linetoscr_do_incspix (bpp, hmode, aga, cmode); outln ( " buf[dpix++] = dpix_val;"); outln ( "}"); } set_indent (old_indent); return; }