]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Fix mid horizontal HAM+resolution change glitch.
authorToni Wilen <twilen@winuae.net>
Sun, 3 Oct 2021 14:03:47 +0000 (17:03 +0300)
committerToni Wilen <twilen@winuae.net>
Sun, 3 Oct 2021 14:03:47 +0000 (17:03 +0300)
custom.cpp
drawing.cpp

index d59c46ed332c5e100b1220d1ceadb9164e2e1ccc..8bda5bca9f9eca404cc71e20a09e0956970487c6 100644 (file)
@@ -3877,7 +3877,7 @@ static bool issprbrd(int hpos, uae_u16 bplcon0, uae_u16 bplcon3)
 
 static void record_register_change(int hpos, int regno, uae_u16 value)
 {
-       if (regno == 0x100) { // BPLCON0
+       if (regno == 0x0100 || regno == 0x0101) { // BPLCON0
                if (value & 0x800)
                        thisline_decision.ham_seen = 1;
                thisline_decision.ehb_seen = isehb(value, bplcon2);
@@ -6659,15 +6659,15 @@ static void BPLCON0_Denise(int hpos, uae_u16 v)
                return;
        }
 
-       bplcon0d_old = -1;
        // fake unused 0x0080 bit as an EHB bit (see below)
        if (isehb(bplcon0d, bplcon2)) {
-               v |= 0x80;
+               v |= 0x0080;
        }
 
-       record_register_change(hpos, 0x100, (bplcon0d & ~(0x800 | 0x400 | 0x80 | 0x01)) | (v & (0x0800 | 0x400 | 0x80 | 0x01)));
+       record_register_change(hpos, 0x101, v);
 
-       bplcon0d = v & ~0x80;
+       bplcon0d = v & ~0x0080;
+       bplcon0d_old = -1;
 
 #ifdef ECS_DENISE
        if (ecs_denise) {
index 67a274acb94c8fdc3e1d43a28eb85844d3baebc0..8e9f46b07dc6fe0a8c33209c5dfee9ba106d06d9 100644 (file)
@@ -3108,6 +3108,12 @@ static void pfield_expand_dp_bplconx (int regno, int v, int hp, int vp)
                        dp_for_drawing->bplres = currprefs.gfx_resolution;
                extblankcheck();
                break;
+       case 0x101: // BPLCON0 partial
+               dp_for_drawing->bplcon0 &= ~(0x0800 | 0x0400 | 0x0080 | 0x0001);
+               dp_for_drawing->bplcon0 |= v & (0x0800 | 0x0400 | 0x0080 | 0x0001);
+               dp_for_drawing->ham_seen = isham(v);
+               extblankcheck();
+               break;
        case 0x104: // BPLCON2
                dp_for_drawing->bplcon2 = v;
                break;
@@ -3497,7 +3503,14 @@ static void pfield_draw_line(struct vidbuffer *vb, int lineno, int gfx_ypos, int
                                dp_for_drawing->bplcon4bm = b4bm;
                                dp_for_drawing->bplcon4bm = b4sp;
                                dp_for_drawing->fmode = fm;
+                               dp_for_drawing->bplres = GET_RES_DENISE(dp_for_drawing->bplcon0);
+                               dp_for_drawing->nr_planes = GET_PLANES(dp_for_drawing->bplcon0);
+                               dp_for_drawing->ham_seen = isham(dp_for_drawing->bplcon0);
+                               if (currprefs.chipset_hr && dp_for_drawing->bplres < currprefs.gfx_resolution) {
+                                       dp_for_drawing->bplres = currprefs.gfx_resolution;
+                               }
                                pfield_expand_dp_bplcon();
+                               set_res_shift();
                        }
                        hposblank = ohposblank;
                        ham_decode_pixel = src_pixel;