]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Improved on the fly chipset change support.
authorToni Wilen <twilen@winuae.net>
Wed, 30 Oct 2019 18:06:51 +0000 (20:06 +0200)
committerToni Wilen <twilen@winuae.net>
Wed, 30 Oct 2019 18:06:51 +0000 (20:06 +0200)
custom.cpp

index 500d54cac02aef8e3c851b881fb16ebb0cc5304a..1c94297dda9c445f065ecbeff001ca05e798f141 100644 (file)
@@ -211,6 +211,7 @@ int syncbase;
 static int fmode_saved, fmode;
 uae_u16 beamcon0, new_beamcon0;
 static uae_u16 beamcon0_saved;
+static uae_u16 bplcon0_saved, bplcon1_saved, bplcon2_saved;
 static uae_u16 bplcon3_saved, bplcon4_saved;
 static bool varsync_changed;
 uae_u16 vtotal = MAXVPOS_PAL, htotal = MAXHPOS_PAL;
@@ -306,7 +307,7 @@ static int plffirstline, plflastline;
 int plffirstline_total, plflastline_total;
 static int autoscale_bordercolors;
 static int plfstrt, plfstop;
-static int sprite_minx, sprite_maxx;
+static int sprite_minx;
 static int first_bpl_vpos;
 static int last_ddf_pix_hpos;
 static int last_decide_line_hpos;
@@ -1048,18 +1049,32 @@ Thus, once we do call toscr_nbits (which happens at least every 16 bits),
 we can do more work at once.  */
 static int toscr_nbits;
 
+static void calcdiw(void);
 static void set_chipset_mode(void)
 {
-       if (currprefs.chipset_mask & CSMASK_AGA) {
-               fmode = fmode_saved;
-               bplcon3 = bplcon3_saved;
-               bplcon4 = bplcon4_saved;
-       } else {
-               bplcon3_saved = bplcon3;
-               bplcon4_saved = bplcon4;
+       fmode = fmode_saved;
+       bplcon0 = bplcon0_saved;
+       bplcon1 = bplcon1_saved;
+       bplcon2 = bplcon2_saved;
+       bplcon3 = bplcon3_saved;
+       bplcon4 = bplcon4_saved;
+       if (!(currprefs.chipset_mask & CSMASK_AGA)) {
                fmode = 0;
+               bplcon0 &= ~(0x0010 | 0x0020);
+               bplcon1 &= ~(0xff00);
+               bplcon2 &= ~(0x0100 | 0x0080);
+               bplcon3 &= 0x003f;
+               bplcon3 |= 0x0c00;
                bplcon4 = 0x0011;
-               bplcon3 = 0x0c00;
+               if (!(currprefs.chipset_mask & CSMASK_ECS_AGNUS)) {
+                       bplcon0 &= ~0x0080;
+                       diwhigh_written = 0;
+               }
+               if (!(currprefs.chipset_mask & CSMASK_ECS_DENISE)) {
+                       bplcon0 &= ~0x0001;
+                       bplcon2 &= 0x007f;
+                       bplcon3 = 0x0c00;
+               }
        }
        sprres = expand_sprres(bplcon0, bplcon3);
        sprite_width = GET_SPRITEWIDTH(fmode);
@@ -1067,6 +1082,7 @@ static void set_chipset_mode(void)
                spr[i].width = sprite_width;
        }
        shdelay_disabled = false;
+       calcdiw();
 }
 
 static void update_mirrors(void)
@@ -5099,6 +5115,10 @@ static void calcdiw (void)
 
        plfstrt = ddfstrt - DDF_OFFSET;
        plfstop = ddfstop - DDF_OFFSET;
+       if (!(currprefs.chipset_mask & CSMASK_ECS_AGNUS)) {
+               plfstrt &= 0x00fc;
+               plfstop &= 0x00fc;
+       }
 
        diw_change = 2;
 }
@@ -6031,6 +6051,7 @@ static void BPLCON0_Denise (int hpos, uae_u16 v, bool immediate)
 
 static void BPLCON0 (int hpos, uae_u16 v)
 {
+       bplcon0_saved = v;
        if (! (currprefs.chipset_mask & CSMASK_ECS_DENISE))
                v &= ~0x00F1;
        else if (! (currprefs.chipset_mask & CSMASK_AGA))
@@ -6079,6 +6100,7 @@ static void BPLCON0 (int hpos, uae_u16 v)
 
 static void BPLCON1 (int hpos, uae_u16 v)
 {
+       bplcon1_saved = v;
        if (!(currprefs.chipset_mask & CSMASK_AGA))
                v &= 0xff;
        if (bplcon1 == v)
@@ -6093,6 +6115,7 @@ static void BPLCON1 (int hpos, uae_u16 v)
 
 static void BPLCON2(int hpos, uae_u16 v)
 {
+       bplcon2_saved = v;
        if (!(currprefs.chipset_mask & CSMASK_AGA))
                v &= ~(0x100 | 0x80); // RDRAM and SOGEN
        if (!(currprefs.chipset_mask & CSMASK_ECS_DENISE))
@@ -6108,13 +6131,12 @@ static void BPLCON2(int hpos, uae_u16 v)
 #ifdef ECS_DENISE
 static void BPLCON3(int hpos, uae_u16 v)
 {
+       bplcon3_saved = v;
        if (!(currprefs.chipset_mask & CSMASK_ECS_DENISE))
                return;
        if (!(currprefs.chipset_mask & CSMASK_AGA)) {
                v &= 0x003f;
                v |= 0x0c00;
-       } else {
-               bplcon3_saved = v;
        }
 #if SPRBORDER
        v |= 2;
@@ -6131,13 +6153,13 @@ static void BPLCON3(int hpos, uae_u16 v)
 #ifdef AGA
 static void BPLCON4(int hpos, uae_u16 v)
 {
+       bplcon4_saved = v;
        if (!(currprefs.chipset_mask & CSMASK_AGA))
                return;
        if (bplcon4 == v)
                return;
        decide_line (hpos);
        bplcon4 = v;
-       bplcon4_saved = v;
        record_register_change (hpos, 0x10c, v);
 }
 #endif
@@ -7177,6 +7199,7 @@ static void update_copper (int until_hpos)
 
                case COP_strobe_delay1x:
                        // First cycle after COPJMP and Copper was waiting.
+                       // Cycle can be free and copper won't allocate it.
                        cop_state.state = COP_strobe_delay2x;
                        break;
                case COP_strobe_delay2x:
@@ -10004,8 +10027,12 @@ void custom_reset (bool hardreset, bool keyboardreset)
                bplcon0 = 0;
                bplcon4 = 0x0011; /* Get AGA chipset into ECS compatibility mode */
                bplcon3 = 0x0C00;
-               bplcon4_saved = bplcon4;
+
+               bplcon0_saved = bplcon0;
+               bplcon1_saved = bplcon1;
+               bplcon2_saved = bplcon2;
                bplcon3_saved = bplcon3;
+               bplcon4_saved = bplcon4;
 
                diwhigh = 0;
                diwhigh_written = 0;
@@ -10891,6 +10918,9 @@ uae_u8 *restore_custom (uae_u8 *src)
        fmode = RW;                             /* 1FC FMODE */
        last_custom_value1 = last_custom_value2 = RW;/* 1FE ? */
 
+       bplcon0_saved = bplcon0;
+       bplcon1_saved = bplcon1;
+       bplcon2_saved = bplcon2;
        bplcon3_saved = bplcon3;
        bplcon4_saved = bplcon4;
        fmode_saved = fmode;