curr_color_changes[next_color_change].value = value;
next_color_change++;
curr_color_changes[next_color_change].regno = -1;
+ if (value & 0xff00)
+ thisline_decision.xor_seen = true;
}
static bool isehb (uae_u16 bplcon0, uae_u16 bplcon2)
thisline_decision.ehb_seen = !! isehb (bplcon0, bplcon2);
thisline_decision.ham_at_start = !! (bplcon0 & 0x800);
thisline_decision.bordersprite_seen = issprbrd (-1, bplcon0, bplcon3);
+ thisline_decision.xor_seen = (bplcon4 & 0xff00) != 0;
/* decided_res shouldn't be touched before it's initialized by decide_line(). */
thisline_decision.diwfirstword = -1;
int ddf_right = dp_for_drawing->plfright * 2 + DIW_DDF_OFFSET;
int leftborderhidden;
int native_ddf_left2;
+ bool expanded = false;
hsync_shift_hack = 0;
}
#ifdef AGA
+ // if BPLCON4 is non-zero: it will affect background color until end of DIW.
+ if (dp_for_drawing->xor_seen) {
+ if (playfield_end < linetoscr_diw_end && hblank_right_stop > playfield_end) {
+ playfield_end = linetoscr_diw_end;
+ expanded = true;
+ }
+ }
may_require_hard_way = false;
if (dp_for_drawing->bordersprite_seen && !ce_is_borderblank(colors_for_drawing.extra) && dip_for_drawing->nr_sprites) {
int min = visible_right_border, max = visible_left_border, i;
leftborderhidden += hblank_left_start - playfield_start;
src_pixel = MAX_PIXELS_PER_LINE + res_shift_from_window (leftborderhidden);
- if (dip_for_drawing->nr_sprites == 0)
+ if (dip_for_drawing->nr_sprites == 0 && !expanded)
return;
- if (aga_mode) {
+ if (dip_for_drawing->nr_sprites && aga_mode) {
int add = get_shdelay_add();
if (add) {
if (sprite_playfield_start > 0) {