static int can_use_lores = 0, frame_res, frame_res_lace;
static int resolution_count[RES_MAX + 1], lines_count;
static bool center_reset;
+static bool need_genlock_data, init_genlock_data;
/* Lookup tables for dual playfields. The dblpf_*1 versions are for the case
that playfield 1 has the priority, dbplpf_*2 are used if playfield 2 has
static uae_u8 all_ones[MAX_PIXELS_PER_LINE];
static uae_u8 all_zeros[MAX_PIXELS_PER_LINE];
-uae_u8 *xlinebuffer;
+uae_u8 *xlinebuffer, *xlinebuffer_genlock;
static int *amiga2aspect_line_map, *native2amiga_line_map;
static uae_u8 **row_map;
+static uae_u8 *row_map_genlock_buffer;
static uae_u8 row_tmp[MAX_PIXELS_PER_LINE * 32 / 8];
static int max_drawn_amiga_line;
+uae_u8 **row_map_genlock;
/* line_draw_funcs: pfield_do_linetoscr, pfield_do_fill_line, decode_ham */
typedef void (*line_draw_func)(int, int, bool);
/* same for hblank */
static int hblank_left_start, hblank_right_stop;
-static int linetoscr_x_adjust_bytes;
+static int linetoscr_x_adjust_pixbytes, linetoscr_x_adjust_pixels;
static int thisframe_y_adjust;
static int thisframe_y_adjust_real, max_ypos_thisframe, min_ypos_for_screen;
int thisframe_first_drawn_line, thisframe_last_drawn_line;
for (i = start; i < stop; i++)
b[i] = col;
}
+
static void pfield_do_fill_line (int start, int stop, bool blank)
{
switch (gfxvidinfo.drawbuffer.pixbytes) {
case 2: fill_line_16 (xlinebuffer, start, stop, blank); break;
case 4: fill_line_32 (xlinebuffer, start, stop, blank); break;
}
+ if (need_genlock_data) {
+ memset(xlinebuffer_genlock + start, 0, stop - start);
+ }
}
static void fill_line2 (int startpos, int len)
int b = hposblank;
hposblank = 3;
fill_line2(lastpos, gfxvidinfo.drawbuffer.inwidth);
+ if (need_genlock_data) {
+ memset(xlinebuffer_genlock + lastpos, 0, gfxvidinfo.drawbuffer.inwidth);
+ }
hposblank = b;
return;
}
if (hposblank) {
hposblank = 3;
fill_line2(lastpos, gfxvidinfo.drawbuffer.inwidth);
+ if (need_genlock_data) {
+ memset(xlinebuffer_genlock + lastpos, 0, gfxvidinfo.drawbuffer.inwidth);
+ }
return;
}
// hblank not visible
if (hblank_left_start <= lastpos && hblank_right_stop >= endpos) {
fill_line2(lastpos, gfxvidinfo.drawbuffer.inwidth);
+ if (need_genlock_data) {
+ memset(xlinebuffer_genlock + lastpos, 0, gfxvidinfo.drawbuffer.inwidth);
+ }
return;
}
xlinecheck(start, stop);
#ifdef AGA
if (issprites && (currprefs.chipset_mask & CSMASK_AGA)) {
- if (res_shift == 0) {
- switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_aga_spr (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_aga_spr (LTPARMS); break;
- }
- } else if (res_shift == 2) {
- switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_stretch2_aga_spr (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_stretch2_aga_spr (LTPARMS); break;
- }
- } else if (res_shift == 1) {
- switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_stretch1_aga_spr (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_stretch1_aga_spr (LTPARMS); break;
- }
- } else if (res_shift == -1) {
- if (currprefs.gfx_lores_mode) {
+ if (need_genlock_data) {
+ if (res_shift == 0) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_shrink1f_aga_spr (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_shrink1f_aga_spr (LTPARMS); break;
+ case 2: src_pixel = linetoscr_16_aga_spr_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_aga_spr_genlock(LTPARMS); break;
}
- } else {
+ } else if (res_shift == 2) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_shrink1_aga_spr (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_shrink1_aga_spr (LTPARMS); break;
+ case 2: src_pixel = linetoscr_16_stretch2_aga_spr_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_stretch2_aga_spr_genlock(LTPARMS); break;
}
- }
- } else if (res_shift == -2) {
- if (currprefs.gfx_lores_mode) {
+ } else if (res_shift == 1) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_shrink2f_aga_spr (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_shrink2f_aga_spr (LTPARMS); break;
+ case 2: src_pixel = linetoscr_16_stretch1_aga_spr_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_stretch1_aga_spr_genlock(LTPARMS); break;
}
- } else {
- switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_shrink2_aga_spr (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_shrink2_aga_spr (LTPARMS); break;
+ } else if (res_shift == -1) {
+ if (currprefs.gfx_lores_mode) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_shrink1f_aga_spr_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink1f_aga_spr_genlock(LTPARMS); break;
+ }
+ } else {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_shrink1_aga_spr_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink1_aga_spr_genlock(LTPARMS); break;
+ }
+ }
+ } else if (res_shift == -2) {
+ if (currprefs.gfx_lores_mode) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_shrink2f_aga_spr_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink2f_aga_spr_genlock(LTPARMS); break;
+ }
+ } else {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_shrink2_aga_spr_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink2_aga_spr_genlock(LTPARMS); break;
+ }
}
}
- }
- } else
- if (currprefs.chipset_mask & CSMASK_AGA) {
+ } else {
if (res_shift == 0) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_aga (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_aga (LTPARMS); break;
+ case 2: src_pixel = linetoscr_16_aga_spr(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_aga_spr(LTPARMS); break;
}
} else if (res_shift == 2) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_stretch2_aga (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_stretch2_aga (LTPARMS); break;
+ case 2: src_pixel = linetoscr_16_stretch2_aga_spr(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_stretch2_aga_spr(LTPARMS); break;
}
} else if (res_shift == 1) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_stretch1_aga (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_stretch1_aga (LTPARMS); break;
+ case 2: src_pixel = linetoscr_16_stretch1_aga_spr(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_stretch1_aga_spr(LTPARMS); break;
}
} else if (res_shift == -1) {
if (currprefs.gfx_lores_mode) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_shrink1f_aga (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_shrink1f_aga (LTPARMS); break;
+ case 2: src_pixel = linetoscr_16_shrink1f_aga_spr(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink1f_aga_spr(LTPARMS); break;
}
} else {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_shrink1_aga (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_shrink1_aga (LTPARMS); break;
+ case 2: src_pixel = linetoscr_16_shrink1_aga_spr(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink1_aga_spr(LTPARMS); break;
}
}
} else if (res_shift == -2) {
if (currprefs.gfx_lores_mode) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_shrink2f_aga (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_shrink2f_aga (LTPARMS); break;
+ case 2: src_pixel = linetoscr_16_shrink2f_aga_spr(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink2f_aga_spr(LTPARMS); break;
}
} else {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_shrink2_aga (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_shrink2_aga (LTPARMS); break;
+ case 2: src_pixel = linetoscr_16_shrink2_aga_spr(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink2_aga_spr(LTPARMS); break;
}
}
}
- } else
-#endif
-#ifdef ECS_DENISE
- if (ecsshres) {
+ }
+ } else {
+ if (currprefs.chipset_mask & CSMASK_AGA) {
+ if (need_genlock_data) {
if (res_shift == 0) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_sh (LTPARMS, issprites); break;
- case 4: src_pixel = linetoscr_32_sh (LTPARMS, issprites); break;
+ case 2: src_pixel = linetoscr_16_aga_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_aga_genlock(LTPARMS); break;
+ }
+ } else if (res_shift == 2) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_stretch2_aga_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_stretch2_aga_genlock(LTPARMS); break;
+ }
+ } else if (res_shift == 1) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_stretch1_aga_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_stretch1_aga_genlock(LTPARMS); break;
}
} else if (res_shift == -1) {
if (currprefs.gfx_lores_mode) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_shrink1f_sh (LTPARMS, issprites); break;
- case 4: src_pixel = linetoscr_32_shrink1f_sh (LTPARMS, issprites); break;
+ case 2: src_pixel = linetoscr_16_shrink1f_aga_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink1f_aga_genlock(LTPARMS); break;
}
} else {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_shrink1_sh (LTPARMS, issprites); break;
- case 4: src_pixel = linetoscr_32_shrink1_sh (LTPARMS, issprites); break;
+ case 2: src_pixel = linetoscr_16_shrink1_aga_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink1_aga_genlock(LTPARMS); break;
}
}
} else if (res_shift == -2) {
if (currprefs.gfx_lores_mode) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_shrink2f_sh (LTPARMS, issprites); break;
- case 4: src_pixel = linetoscr_32_shrink2f_sh (LTPARMS, issprites); break;
+ case 2: src_pixel = linetoscr_16_shrink2f_aga_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink2f_aga_genlock(LTPARMS); break;
}
} else {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_shrink2_sh (LTPARMS, issprites); break;
- case 4: src_pixel = linetoscr_32_shrink2_sh (LTPARMS, issprites); break;
+ case 2: src_pixel = linetoscr_16_shrink2_aga_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink2_aga_genlock(LTPARMS); break;
}
}
}
- } else
+ } else {
+ if (res_shift == 0) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_aga(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_aga(LTPARMS); break;
+ }
+ } else if (res_shift == 2) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_stretch2_aga(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_stretch2_aga(LTPARMS); break;
+ }
+ } else if (res_shift == 1) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_stretch1_aga(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_stretch1_aga(LTPARMS); break;
+ }
+ } else if (res_shift == -1) {
+ if (currprefs.gfx_lores_mode) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_shrink1f_aga(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink1f_aga(LTPARMS); break;
+ }
+ } else {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_shrink1_aga(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink1_aga(LTPARMS); break;
+ }
+ }
+ } else if (res_shift == -2) {
+ if (currprefs.gfx_lores_mode) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_shrink2f_aga(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink2f_aga(LTPARMS); break;
+ }
+ } else {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_shrink2_aga(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink2_aga(LTPARMS); break;
+ }
+ }
+ }
+ }
+ } else
#endif
- if (issprites) {
- if (res_shift == 0) {
+#ifdef ECS_DENISE
+ if (ecsshres) {
+ if (res_shift == 0) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_sh(LTPARMS, issprites); break;
+ case 4: src_pixel = linetoscr_32_sh(LTPARMS, issprites); break;
+ }
+ } else if (res_shift == -1) {
+ if (currprefs.gfx_lores_mode) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_spr (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_spr (LTPARMS); break;
+ case 2: src_pixel = linetoscr_16_shrink1f_sh(LTPARMS, issprites); break;
+ case 4: src_pixel = linetoscr_32_shrink1f_sh(LTPARMS, issprites); break;
}
- } else if (res_shift == 2) {
+ } else {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_stretch2_spr (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_stretch2_spr (LTPARMS); break;
+ case 2: src_pixel = linetoscr_16_shrink1_sh(LTPARMS, issprites); break;
+ case 4: src_pixel = linetoscr_32_shrink1_sh(LTPARMS, issprites); break;
}
- } else if (res_shift == 1) {
+ }
+ } else if (res_shift == -2) {
+ if (currprefs.gfx_lores_mode) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_shrink2f_sh(LTPARMS, issprites); break;
+ case 4: src_pixel = linetoscr_32_shrink2f_sh(LTPARMS, issprites); break;
+ }
+ } else {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_stretch1_spr (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_stretch1_spr (LTPARMS); break;
+ case 2: src_pixel = linetoscr_16_shrink2_sh(LTPARMS, issprites); break;
+ case 4: src_pixel = linetoscr_32_shrink2_sh(LTPARMS, issprites); break;
}
- } else if (res_shift == -1) {
- if (currprefs.gfx_lores_mode) {
+ }
+ }
+ } else {
+#endif
+ if (issprites) {
+ if (need_genlock_data) {
+ if (res_shift == 0) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_spr_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_spr_genlock(LTPARMS); break;
+ }
+ } else if (res_shift == 2) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_stretch2_spr_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_stretch2_spr_genlock(LTPARMS); break;
+ }
+ } else if (res_shift == 1) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_stretch1_spr_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_stretch1_spr_genlock(LTPARMS); break;
+ }
+ } else if (res_shift == -1) {
+ if (currprefs.gfx_lores_mode) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_shrink1f_spr_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink1f_spr_genlock(LTPARMS); break;
+ }
+ } else {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_shrink1_spr_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink1_spr_genlock(LTPARMS); break;
+ }
+ }
+ }
+ } else {
+ if (res_shift == 0) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_spr(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_spr(LTPARMS); break;
+ }
+ } else if (res_shift == 2) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_shrink1f_spr (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_shrink1f_spr (LTPARMS); break;
+ case 2: src_pixel = linetoscr_16_stretch2_spr(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_stretch2_spr(LTPARMS); break;
}
- } else {
+ } else if (res_shift == 1) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_shrink1_spr (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_shrink1_spr (LTPARMS); break;
+ case 2: src_pixel = linetoscr_16_stretch1_spr(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_stretch1_spr(LTPARMS); break;
+ }
+ } else if (res_shift == -1) {
+ if (currprefs.gfx_lores_mode) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_shrink1f_spr(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink1f_spr(LTPARMS); break;
+ }
+ } else {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_shrink1_spr(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink1_spr(LTPARMS); break;
+ }
}
}
}
} else {
- if (res_shift == 0) {
- switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16 (LTPARMS); break;
- case 4: src_pixel = linetoscr_32 (LTPARMS); break;
- }
- } else if (res_shift == 2) {
- switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_stretch2 (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_stretch2 (LTPARMS); break;
- }
- } else if (res_shift == 1) {
- switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_stretch1 (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_stretch1 (LTPARMS); break;
+ if (need_genlock_data) {
+ if (res_shift == 0) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_genlock(LTPARMS); break;
+ }
+ } else if (res_shift == 2) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_stretch2_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_stretch2_genlock(LTPARMS); break;
+ }
+ } else if (res_shift == 1) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_stretch1_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_stretch1_genlock(LTPARMS); break;
+ }
+ } else if (res_shift == -1) {
+ if (currprefs.gfx_lores_mode) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_shrink1f_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink1f_genlock(LTPARMS); break;
+ }
+ } else {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_shrink1_genlock(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink1_genlock(LTPARMS); break;
+ }
+ }
}
- } else if (res_shift == -1) {
- if (currprefs.gfx_lores_mode) {
+ } else {
+ if (res_shift == 0) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_shrink1f (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_shrink1f (LTPARMS); break;
+ case 2: src_pixel = linetoscr_16(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32(LTPARMS); break;
}
- } else {
+ } else if (res_shift == 2) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
- case 2: src_pixel = linetoscr_16_shrink1 (LTPARMS); break;
- case 4: src_pixel = linetoscr_32_shrink1 (LTPARMS); break;
+ case 2: src_pixel = linetoscr_16_stretch2(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_stretch2(LTPARMS); break;
+ }
+ } else if (res_shift == 1) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_stretch1(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_stretch1(LTPARMS); break;
+ }
+ } else if (res_shift == -1) {
+ if (currprefs.gfx_lores_mode) {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_shrink1f(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink1f(LTPARMS); break;
+ }
+ } else {
+ switch (gfxvidinfo.drawbuffer.pixbytes) {
+ case 2: src_pixel = linetoscr_16_shrink1(LTPARMS); break;
+ case 4: src_pixel = linetoscr_32_shrink1(LTPARMS); break;
+ }
}
}
}
}
-
+ }
+ }
}
// left or right AGA border sprite
{
static uae_u8 *oldbufmem;
static int oldheight, oldpitch;
+ static bool oldgenlock;
int i, j;
if (gfxvidinfo.drawbuffer.height_allocated > max_uae_height) {
write_log (_T("Resolution too high, aborting\n"));
abort ();
}
- if (!row_map)
- row_map = xmalloc (uae_u8*, max_uae_height + 1);
+ if (!row_map) {
+ row_map = xmalloc(uae_u8*, max_uae_height + 1);
+ row_map_genlock = xmalloc(uae_u8*, max_uae_height + 1);
+ }
if (oldbufmem && oldbufmem == gfxvidinfo.drawbuffer.bufmem &&
oldheight == gfxvidinfo.drawbuffer.height_allocated &&
- oldpitch == gfxvidinfo.drawbuffer.rowbytes)
+ oldpitch == gfxvidinfo.drawbuffer.rowbytes &&
+ oldgenlock == init_genlock_data)
return;
+ xfree(row_map_genlock_buffer);
+ row_map_genlock_buffer = NULL;
+ if (init_genlock_data) {
+ row_map_genlock_buffer = xcalloc(uae_u8, gfxvidinfo.drawbuffer.width_allocated * (gfxvidinfo.drawbuffer.height_allocated + 2));
+ }
j = oldheight == 0 ? max_uae_height : oldheight;
- for (i = gfxvidinfo.drawbuffer.height_allocated; i < max_uae_height + 1 && i < j + 1; i++)
+ for (i = gfxvidinfo.drawbuffer.height_allocated; i < max_uae_height + 1 && i < j + 1; i++) {
row_map[i] = row_tmp;
- for (i = 0, j = 0; i < gfxvidinfo.drawbuffer.height_allocated; i++, j += gfxvidinfo.drawbuffer.rowbytes)
+ row_map_genlock[i] = row_tmp;
+ }
+ for (i = 0, j = 0; i < gfxvidinfo.drawbuffer.height_allocated; i++, j += gfxvidinfo.drawbuffer.rowbytes) {
row_map[i] = gfxvidinfo.drawbuffer.bufmem + j;
+ if (init_genlock_data) {
+ row_map_genlock[i] = row_map_genlock_buffer + gfxvidinfo.drawbuffer.width_allocated * (i + 1);
+ } else {
+ row_map_genlock[i] = NULL;
+ }
+ }
oldbufmem = gfxvidinfo.drawbuffer.bufmem;
oldheight = gfxvidinfo.drawbuffer.height_allocated;
oldpitch = gfxvidinfo.drawbuffer.rowbytes;
+ oldgenlock = init_genlock_data;
}
void init_aspect_maps (void)
}
if (max_drawn_amiga_line < 0)
max_drawn_amiga_line = maxl - min_ypos_for_screen;
- if (max_drawn_amiga_line > gfxvidinfo.drawbuffer.inheight)
- max_drawn_amiga_line = gfxvidinfo.drawbuffer.inheight;
- max_drawn_amiga_line >>= linedbl;
for (i = 0; i < h; i++)
native2amiga_line_map[i] = -1;
xlinebuffer = gfxvidinfo.drawbuffer.emergmem, dh = dh_emerg;
if (xlinebuffer == 0)
xlinebuffer = row_map[gfx_ypos], dh = dh_buf;
- xlinebuffer -= linetoscr_x_adjust_bytes;
+ xlinebuffer -= linetoscr_x_adjust_pixbytes;
+ xlinebuffer_genlock = row_map_genlock[gfx_ypos] - linetoscr_x_adjust_pixels;
if (border == 0) {
do_color_changes (pfield_do_fill_line, pfield_do_linetoscr, lineno);
if (dh == dh_emerg)
- memcpy (row_map[gfx_ypos], xlinebuffer + linetoscr_x_adjust_bytes, gfxvidinfo.drawbuffer.pixbytes * gfxvidinfo.drawbuffer.inwidth);
+ memcpy (row_map[gfx_ypos], xlinebuffer + linetoscr_x_adjust_pixbytes, gfxvidinfo.drawbuffer.pixbytes * gfxvidinfo.drawbuffer.inwidth);
do_flush_line (vb, gfx_ypos);
if (do_double) {
if (dh == dh_emerg)
- memcpy (row_map[follow_ypos], xlinebuffer + linetoscr_x_adjust_bytes, gfxvidinfo.drawbuffer.pixbytes * gfxvidinfo.drawbuffer.inwidth);
+ memcpy (row_map[follow_ypos], xlinebuffer + linetoscr_x_adjust_pixbytes, gfxvidinfo.drawbuffer.pixbytes * gfxvidinfo.drawbuffer.inwidth);
else if (dh == dh_buf)
memcpy (row_map[follow_ypos], row_map[gfx_ypos], gfxvidinfo.drawbuffer.pixbytes * gfxvidinfo.drawbuffer.inwidth);
+ if (need_genlock_data)
+ memcpy(row_map_genlock[follow_ypos], row_map_genlock[gfx_ypos], gfxvidinfo.drawbuffer.inwidth);
do_flush_line (vb, follow_ypos);
}
do_flush_line (vb, gfx_ypos);
if (do_double) {
if (dh == dh_buf) {
- xlinebuffer = row_map[follow_ypos] - linetoscr_x_adjust_bytes;
+ xlinebuffer = row_map[follow_ypos] - linetoscr_x_adjust_pixbytes;
+ xlinebuffer_genlock = row_map_genlock[follow_ypos] - linetoscr_x_adjust_pixels;
fill_line_border(lineno);
}
/* If dh == dh_line, do_flush_line will re-use the rendered line
}
if (dh == dh_emerg)
- memcpy (row_map[gfx_ypos], xlinebuffer + linetoscr_x_adjust_bytes, gfxvidinfo.drawbuffer.pixbytes * gfxvidinfo.drawbuffer.inwidth);
+ memcpy (row_map[gfx_ypos], xlinebuffer + linetoscr_x_adjust_pixbytes, gfxvidinfo.drawbuffer.pixbytes * gfxvidinfo.drawbuffer.inwidth);
do_flush_line (vb, gfx_ypos);
if (do_double) {
if (dh == dh_emerg)
- memcpy (row_map[follow_ypos], xlinebuffer + linetoscr_x_adjust_bytes, gfxvidinfo.drawbuffer.pixbytes * gfxvidinfo.drawbuffer.inwidth);
+ memcpy (row_map[follow_ypos], xlinebuffer + linetoscr_x_adjust_pixbytes, gfxvidinfo.drawbuffer.pixbytes * gfxvidinfo.drawbuffer.inwidth);
else if (dh == dh_buf)
memcpy (row_map[follow_ypos], row_map[gfx_ypos], gfxvidinfo.drawbuffer.pixbytes * gfxvidinfo.drawbuffer.inwidth);
- do_flush_line (vb, follow_ypos);
+ if (need_genlock_data)
+ memcpy(row_map_genlock[follow_ypos], row_map_genlock[gfx_ypos], gfxvidinfo.drawbuffer.inwidth);
+ do_flush_line(vb, follow_ypos);
}
} else {
//write_log (_T("%d %d %d %d %d\n"), max_diwlastword, gfxvidinfo.drawbuffer.width, lores_shift, currprefs.gfx_resolution, visible_left_border);
- linetoscr_x_adjust_bytes = visible_left_border * gfxvidinfo.drawbuffer.pixbytes;
+ linetoscr_x_adjust_pixels = visible_left_border;
+ linetoscr_x_adjust_pixbytes = linetoscr_x_adjust_pixels * gfxvidinfo.drawbuffer.pixbytes;
visible_right_border = visible_left_border + w;
if (visible_right_border > max_diwlastword)
visible_right_border = max_diwlastword;
+ int max_drawn_amiga_line_tmp = max_drawn_amiga_line;
+ if (max_drawn_amiga_line_tmp > gfxvidinfo.drawbuffer.inheight)
+ max_drawn_amiga_line_tmp = gfxvidinfo.drawbuffer.inheight;
+ max_drawn_amiga_line_tmp >>= linedbl;
+
thisframe_y_adjust = minfirstline;
if (currprefs.gfx_ycenter && thisframe_first_drawn_line >= 0 && !currprefs.gf[0].gfx_filter_autoscale) {
- if (thisframe_last_drawn_line - thisframe_first_drawn_line < max_drawn_amiga_line && currprefs.gfx_ycenter == 2)
- thisframe_y_adjust = (thisframe_last_drawn_line - thisframe_first_drawn_line - max_drawn_amiga_line) / 2 + thisframe_first_drawn_line;
+ if (thisframe_last_drawn_line - thisframe_first_drawn_line < max_drawn_amiga_line_tmp && currprefs.gfx_ycenter == 2)
+ thisframe_y_adjust = (thisframe_last_drawn_line - thisframe_first_drawn_line - max_drawn_amiga_line_tmp) / 2 + thisframe_first_drawn_line;
else
thisframe_y_adjust = thisframe_first_drawn_line;
#if 1
/* Would the old value be good enough? If so, leave it as it is if we want to be clever. */
if (!center_reset && !horizontal_changed) {
if (currprefs.gfx_ycenter == 2 && thisframe_y_adjust != prev_y_adjust) {
- if (prev_y_adjust <= thisframe_first_drawn_line && prev_y_adjust + max_drawn_amiga_line > thisframe_last_drawn_line)
+ if (prev_y_adjust <= thisframe_first_drawn_line && prev_y_adjust + max_drawn_amiga_line_tmp > thisframe_last_drawn_line)
thisframe_y_adjust = prev_y_adjust;
}
}
}
/* Make sure the value makes sense */
- if (thisframe_y_adjust + max_drawn_amiga_line > maxvpos + maxvpos / 2)
- thisframe_y_adjust = maxvpos + maxvpos / 2 - max_drawn_amiga_line;
+ if (thisframe_y_adjust + max_drawn_amiga_line_tmp > maxvpos + maxvpos / 2)
+ thisframe_y_adjust = maxvpos + maxvpos / 2 - max_drawn_amiga_line_tmp;
if (thisframe_y_adjust < 0)
thisframe_y_adjust = 0;
int i, maxline;
static int frame_res_old;
- if (currprefs.gfx_resolution != changed_prefs.gfx_resolution)
- return;
-
- if (lines_count > 0) {
+ if (currprefs.gfx_resolution == changed_prefs.gfx_resolution && lines_count > 0) {
int largest_count = 0;
int largest_count_res = 0;
int largest_res = 0;
xlinebuffer = gfxvidinfo.drawbuffer.linemem;
if (xlinebuffer == 0)
xlinebuffer = row_map[line];
+ xlinebuffer_genlock = row_map_genlock[line];
return xlinebuffer;
}
xlinebuffer = gfxvidinfo.drawbuffer.linemem;
if (xlinebuffer == 0)
xlinebuffer = row_map[line];
- debug_draw_cycles (xlinebuffer, gfxvidinfo.drawbuffer.pixbytes, line, gfxvidinfo.drawbuffer.outwidth, gfxvidinfo.drawbuffer.outheight, xredcolors, xgreencolors, xbluecolors);
+ xlinebuffer_genlock = row_map_genlock[line];
+ debug_draw_cycles(xlinebuffer, gfxvidinfo.drawbuffer.pixbytes, line, gfxvidinfo.drawbuffer.outwidth, gfxvidinfo.drawbuffer.outheight, xredcolors, xgreencolors, xbluecolors);
}
#define LIGHTPEN_HEIGHT 12
xlinebuffer = gfxvidinfo.drawbuffer.linemem;
if (xlinebuffer == 0)
xlinebuffer = row_map[line];
+ xlinebuffer_genlock = row_map_genlock[line];
p = lightpen_cursor + y * LIGHTPEN_WIDTH;
for (i = 0; i < LIGHTPEN_WIDTH; i++) {
}
#if LARGEST_LINE_DEBUG
- //write_log (_T("%d\n"), largest);
+ write_log (_T("%d\n"), largest);
#endif
}
if (currprefs.monitoremu && gfxvidinfo.tempbuffer.bufmem_allocated) {
setspecialmonitorpos(&gfxvidinfo.tempbuffer);
+ if (init_genlock_data != specialmonitor_need_genlock()) {
+ init_genlock_data = specialmonitor_need_genlock();
+ init_row_map();
+ }
if (emulate_specialmonitors (vb, &gfxvidinfo.tempbuffer)) {
vb = gfxvidinfo.outbuffer = &gfxvidinfo.tempbuffer;
if (vb->nativepositioning)
setnativeposition(vb);
gfxvidinfo.drawbuffer.tempbufferinuse = true;
- if (!specialmonitoron)
- compute_framesync ();
+ need_genlock_data = specialmonitor_need_genlock();
+ if (!specialmonitoron) {
+ compute_framesync();
+ }
specialmonitoron = true;
do_flush_screen (vb, 0, vb->outheight);
didflush = true;
} else {
- gfxvidinfo.drawbuffer.tempbufferinuse = false;
- if (specialmonitoron)
- compute_framesync ();
- specialmonitoron = false;
+ need_genlock_data = false;
+ if (specialmonitoron || gfxvidinfo.drawbuffer.tempbufferinuse) {
+ gfxvidinfo.drawbuffer.tempbufferinuse = false;
+ specialmonitoron = false;
+ compute_framesync();
+ }
}
}
}
#endif
xlinebuffer = gfxvidinfo.drawbuffer.bufmem;
+ xlinebuffer_genlock = NULL;
inhibit_frame = 0;
fputc ('\n', outfile);
}
-static void out_linetoscr_decl (DEPTH_T bpp, HMODE_T hmode, int aga, int spr)
+static void out_linetoscr_decl (DEPTH_T bpp, HMODE_T hmode, int aga, int spr, int genlock)
{
- outlnf ("static int NOINLINE linetoscr_%s%s%s%s (int spix, int dpix, int dpix_end)",
+ outlnf ("static int NOINLINE linetoscr_%s%s%s%s%s(int spix, int dpix, int dpix_end)",
get_depth_str (bpp),
- get_hmode_str (hmode), aga ? "_aga" : "", spr > 0 ? "_spr" : (spr < 0 ? "_spronly" : ""));
+ get_hmode_str (hmode), aga ? "_aga" : "", spr > 0 ? "_spr" : (spr < 0 ? "_spronly" : ""), genlock ? "_genlock" : "");
}
static void out_linetoscr_do_srcpix (DEPTH_T bpp, HMODE_T hmode, int aga, CMODE_T cmode, int spr)
}
-static void put_dpix (const char *var)
+static void put_dpix (const char *var, int genlock, const char *var2)
{
- outlnf (" buf[dpix++] = %s;", var);
+ if (genlock) {
+ outlnf(" genlock_buf[dpix] = %s;", var2 ? var2 : "spix_val");
+ }
+ outlnf(" buf[dpix++] = %s;", var);
}
-static void out_sprite (DEPTH_T bpp, HMODE_T hmode, CMODE_T cmode, int aga, int cnt, int spr)
+static void out_sprite (DEPTH_T bpp, HMODE_T hmode, CMODE_T cmode, int aga, int cnt, int spr, int genlock)
{
if (aga) {
if (cnt == 1) {
outlnf ( " if (spritepixels[dpix].data) {");
outlnf ( " sprcol = render_sprites (dpix + 0, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga);
- outlnf ( " if (sprcol)");
+ outlnf(" if (sprcol) {");
outlnf ( " out_val = colors_for_drawing.acolors[sprcol];");
- outlnf ( " }");
- put_dpix ("out_val");
+ if (genlock)
+ outlnf(" spix_val = sprcol;");
+ outlnf(" }");
+ outlnf(" }");
+ put_dpix("out_val", genlock, NULL);
} else if (cnt == 2) {
outlnf ( " {");
outlnf ( " uae_u32 out_val1 = out_val;");
outlnf ( " uae_u32 out_val2 = out_val;");
- outlnf ( " if (spritepixels[dpix + 0].data) {");
+ if (genlock) {
+ outlnf(" uae_u32 spix_val1 = spix_val;");
+ outlnf(" uae_u32 spix_val2 = spix_val;");
+ }
+ outlnf(" if (spritepixels[dpix + 0].data) {");
outlnf ( " sprcol = render_sprites (dpix + 0, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga);
- outlnf ( " if (sprcol)");
+ outlnf ( " if (sprcol) {");
outlnf ( " out_val1 = colors_for_drawing.acolors[sprcol];");
- outlnf ( " }");
+ if (genlock)
+ outlnf(" spix_val1 = sprcol;");
+ outlnf(" }");
+ outlnf(" }");
outlnf ( " if (spritepixels[dpix + 1].data) {");
outlnf ( " sprcol = render_sprites (dpix + 1, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga);
- outlnf ( " if (sprcol)");
+ outlnf ( " if (sprcol) {");
outlnf ( " out_val2 = colors_for_drawing.acolors[sprcol];");
- outlnf ( " }");
- put_dpix ("out_val1");
- put_dpix ("out_val2");
+ if (genlock)
+ outlnf(" spix_val2 = sprcol;");
+ outlnf(" }");
+ outlnf(" }");
+ put_dpix("out_val1", genlock, "spix_val1");
+ put_dpix("out_val2", genlock, "spix_val2");
outlnf ( " }");
} else if (cnt == 4) {
outlnf ( " {");
outlnf ( " uae_u32 out_val2 = out_val;");
outlnf ( " uae_u32 out_val3 = out_val;");
outlnf ( " uae_u32 out_val4 = out_val;");
- outlnf ( " if (spritepixels[dpix + 0].data) {");
+ if (genlock) {
+ outlnf(" uae_u32 spix_val1 = spix_val;");
+ outlnf(" uae_u32 spix_val2 = spix_val;");
+ outlnf(" uae_u32 spix_val3 = spix_val;");
+ outlnf(" uae_u32 spix_val4 = spix_val;");
+ }
+ outlnf(" if (spritepixels[dpix + 0].data) {");
outlnf ( " sprcol = render_sprites (dpix + 0, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga);
- outlnf ( " if (sprcol)");
+ outlnf ( " if (sprcol) {");
outlnf ( " out_val1 = colors_for_drawing.acolors[sprcol];");
- outlnf ( " }");
+ if (genlock)
+ outlnf(" spix_val1 = sprcol;");
+ outlnf(" }");
+ outlnf(" }");
outlnf ( " if (spritepixels[dpix + 1].data) {");
outlnf ( " sprcol = render_sprites (dpix + 1, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga);
- outlnf ( " if (sprcol)");
+ outlnf ( " if (sprcol) {");
outlnf ( " out_val2 = colors_for_drawing.acolors[sprcol];");
- outlnf ( " }");
+ if (genlock)
+ outlnf(" spix_val2 = sprcol;");
+ outlnf(" }");
+ outlnf(" }");
outlnf ( " if (spritepixels[dpix + 2].data) {");
outlnf ( " sprcol = render_sprites (dpix + 2, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga);
- outlnf ( " if (sprcol)");
+ outlnf ( " if (sprcol) {");
outlnf ( " out_val3 = colors_for_drawing.acolors[sprcol];");
- outlnf ( " }");
+ if (genlock)
+ outlnf(" spix_val3 = sprcol;");
+ outlnf(" }");
+ outlnf(" }");
outlnf ( " if (spritepixels[dpix + 3].data) {");
outlnf ( " sprcol = render_sprites (dpix + 3, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga);
- outlnf ( " if (sprcol)");
+ outlnf ( " if (sprcol) {");
outlnf ( " out_val4 = colors_for_drawing.acolors[sprcol];");
- outlnf ( " }");
- put_dpix ("out_val1");
- put_dpix ("out_val2");
- put_dpix ("out_val3");
- put_dpix ("out_val4");
+ if (genlock)
+ outlnf(" spix_val4 = sprcol;");
+ outlnf(" }");
+ outlnf(" }");
+ put_dpix("out_val1", genlock, "spix_val1");
+ put_dpix("out_val2", genlock, "spix_val2");
+ put_dpix("out_val3", genlock, "spix_val3");
+ put_dpix("out_val4", genlock, "spix_val4");
outlnf ( " }");
}
} else {
outlnf ( " if (spritepixels[dpix].data) {");
outlnf ( " sprcol = render_sprites (dpix, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga);
- outlnf ( " if (sprcol) {");
+ if (genlock)
+ outlnf(" spix_val = sprcol;");
+ outlnf(" if (sprcol) {");
outlnf ( " uae_u32 spcol = colors_for_drawing.acolors[sprcol];");
outlnf ( " out_val = spcol;");
outlnf ( " }");
outlnf ( " }");
while (cnt-- > 0)
- put_dpix ("out_val");
+ put_dpix("out_val", genlock, NULL);
}
}
-static void out_linetoscr_mode (DEPTH_T bpp, HMODE_T hmode, int aga, int spr, CMODE_T cmode)
+static void out_linetoscr_mode (DEPTH_T bpp, HMODE_T hmode, int aga, int spr, CMODE_T cmode, int genlock)
{
int old_indent = set_indent (8);
} 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 && hmode != HMODE_DOUBLE2X && spr == 0) {
outln ( "int rem;");
outln ( "if (((long)&buf[dpix]) & 2) {");
out_linetoscr_do_dstpix (bpp, hmode, aga, cmode, spr);
out_linetoscr_do_incspix (bpp, hmode, aga, cmode, spr);
- put_dpix ("dpix_val");
+ put_dpix("dpix_val", genlock, NULL);
outln ( "}");
outln ( "if (dpix >= dpix_end)");
outln ( " return spix;");
outln ( " dpix_end--;");
}
-
outln ( "while (dpix < dpix_end) {");
if (spr)
outln ( " uae_u32 sprpix_val;");
outln ( " dpix += 2;");
} else if (bpp == DEPTH_16BPP) {
if (spr) {
- out_sprite (bpp, hmode, cmode, aga, 2, spr);
+ out_sprite(bpp, hmode, cmode, aga, 2, spr, genlock);
} else {
outln ( " *((uae_u32 *)&buf[dpix]) = out_val;");
outln ( " dpix += 2;");
}
} else {
if (spr) {
- out_sprite (bpp, hmode, cmode, aga, 2, spr);
+ out_sprite(bpp, hmode, cmode, aga, 2, spr, genlock);
} else {
- put_dpix ("out_val");
- put_dpix ("out_val");
+ put_dpix("out_val", genlock, NULL);
+ put_dpix("out_val", genlock, NULL);
}
}
} else if (hmode == HMODE_DOUBLE2X) {
outln ( " dpix += 4;");
} else if (bpp == DEPTH_16BPP) {
if (spr) {
- out_sprite (bpp, hmode, cmode, aga, 4, spr);
+ out_sprite(bpp, hmode, cmode, aga, 4, spr, genlock);
} else {
outln ( " *((uae_u32 *)&buf[dpix]) = out_val;");
outln ( " dpix += 2;");
}
} else {
if (spr) {
- out_sprite (bpp, hmode, cmode, aga, 4, spr);
+ out_sprite(bpp, hmode, cmode, aga, 4, spr, genlock);
} else {
- put_dpix ("out_val");
- put_dpix ("out_val");
- put_dpix ("out_val");
- put_dpix ("out_val");
+ put_dpix("out_val", genlock, NULL);
+ put_dpix("out_val", genlock, NULL);
+ put_dpix("out_val", genlock, NULL);
+ put_dpix("out_val", genlock, NULL);
}
}
} else {
if (bpp == DEPTH_16BPP) {
if (spr) {
- out_sprite (bpp, hmode, cmode, aga, 1, spr);
+ out_sprite(bpp, hmode, cmode, aga, 1, spr, genlock);
} else {
outln ( " *((uae_u32 *)&buf[dpix]) = out_val;");
outln ( " dpix += 2;");
}
} else {
if (spr) {
- out_sprite (bpp, hmode, cmode, aga, 1, spr);
+ out_sprite(bpp, hmode, cmode, aga, 1, spr, genlock);
} else {
- put_dpix ("out_val");
+ put_dpix("out_val", genlock, NULL);
}
}
}
out_linetoscr_do_dstpix (bpp, hmode, aga, cmode, spr);
out_linetoscr_do_incspix (bpp, hmode, aga, cmode, spr);
- put_dpix ("dpix_val");
+ put_dpix("dpix_val", genlock, NULL);
outln ( "}");
}
return;
}
-static void out_linetoscr (DEPTH_T bpp, HMODE_T hmode, int aga, int spr)
+static void out_linetoscr (DEPTH_T bpp, HMODE_T hmode, int aga, int spr, int genlock)
{
if (aga)
outln ("#ifdef AGA");
- out_linetoscr_decl (bpp, hmode, aga, spr);
+ out_linetoscr_decl (bpp, hmode, aga, spr, genlock);
outln ( "{");
outlnf ( " %s *buf = (%s *) xlinebuffer;", get_depth_type_str (bpp), get_depth_type_str (bpp));
+ if (genlock)
+ outlnf(" uae_u8 *genlock_buf = xlinebuffer_genlock;");
if (spr)
outln ( " uae_u8 sprcol;");
if (aga && spr >= 0)
if (spr >= 0) {
outln ( " if (bplham) {");
- out_linetoscr_mode (bpp, hmode, aga, spr, CMODE_HAM);
+ out_linetoscr_mode(bpp, hmode, aga, spr, CMODE_HAM, genlock);
outln ( " } else if (bpldualpf) {");
- out_linetoscr_mode (bpp, hmode, aga, spr, CMODE_DUALPF);
+ out_linetoscr_mode(bpp, hmode, aga, spr, CMODE_DUALPF, genlock);
outln ( " } else if (bplehb) {");
- out_linetoscr_mode (bpp, hmode, aga, spr, CMODE_EXTRAHB);
+ out_linetoscr_mode(bpp, hmode, aga, spr, CMODE_EXTRAHB, genlock);
outln ( " } else {");
- out_linetoscr_mode (bpp, hmode, aga, spr, CMODE_NORMAL);
+ out_linetoscr_mode(bpp, hmode, aga, spr, CMODE_NORMAL, genlock);
} else {
outln ( " if (1) {");
- out_linetoscr_mode (bpp, hmode, aga, spr, CMODE_NORMAL);
+ out_linetoscr_mode(bpp, hmode, aga, spr, CMODE_NORMAL, genlock);
}
outln ( " }\n");
for (spr = -1; spr <= 1; spr++) {
if (!aga && spr < 0)
continue;
- for (hmode = HMODE_NORMAL; hmode <= HMODE_MAX; hmode++)
- out_linetoscr (bpp, hmode, aga, spr);
+ for (hmode = HMODE_NORMAL; hmode <= HMODE_MAX; hmode++) {
+ out_linetoscr(bpp, hmode, aga, spr, 0);
+ if (spr >= 0)
+ out_linetoscr(bpp, hmode, aga, spr, 1);
+ }
}
}
}