]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Check horizontal scanline max.
authorToni Wilen <twilen@winuae.net>
Sun, 1 Dec 2019 16:10:47 +0000 (18:10 +0200)
committerToni Wilen <twilen@winuae.net>
Sun, 1 Dec 2019 16:10:47 +0000 (18:10 +0200)
custom.cpp

index 628f46c465b98eee80349600d452802dfdcc5ef3..6ec64208399b05cd4ab8d8e7cbd6d297ffd4eb54 100644 (file)
@@ -2048,18 +2048,20 @@ static void toscr_1 (int nbits, int fm)
 
        out_nbits += nbits;
        if (out_nbits == 32) {
-               int i;
-               uae_u8 *dataptr = line_data[next_lineno] + out_offs * 4;
-               for (i = 0; i < thisline_decision.nr_planes; i++) {
-                       uae_u32 *dataptr32 = (uae_u32 *)dataptr;
-                       if (*dataptr32 != outword[i]) {
-                               thisline_changed = 1;
-                               *dataptr32 = outword[i];
+               if (out_offs < MAX_WORDS_PER_LINE / 4) {
+                       int i;
+                       uae_u8 *dataptr = line_data[next_lineno] + out_offs * 4;
+                       for (i = 0; i < thisline_decision.nr_planes; i++) {
+                               uae_u32 *dataptr32 = (uae_u32 *)dataptr;
+                               if (*dataptr32 != outword[i]) {
+                                       thisline_changed = 1;
+                                       *dataptr32 = outword[i];
+                               }
+                               outword[i] = 0;
+                               dataptr += MAX_WORDS_PER_LINE * 2;
                        }
-                       outword[i] = 0;
-                       dataptr += MAX_WORDS_PER_LINE * 2;
+                       out_offs++;
                }
-               out_offs++;
                out_nbits = 0;
        }
 }
@@ -2079,18 +2081,20 @@ static void toscr_1_hr(int nbits, int fm)
 
        out_nbits += nbits;
        if (out_nbits == 64) {
-               uae_u8 *dataptr = line_data[next_lineno] + out_offs * 4;
-               for (int i = 0; i < thisline_decision.nr_planes; i++) {
-                       uae_u64 *dataptr64 = (uae_u64 *)dataptr;
-                       uae_u64 v = (outword64[i] >> 32) | (outword64[i] << 32);
-                       if (*dataptr64 != v) {
-                               thisline_changed = 1;
-                               *dataptr64 = v;
+               if (out_offs < MAX_WORDS_PER_LINE / 4 - 1) {
+                       uae_u8 *dataptr = line_data[next_lineno] + out_offs * 4;
+                       for (int i = 0; i < thisline_decision.nr_planes; i++) {
+                               uae_u64 *dataptr64 = (uae_u64 *)dataptr;
+                               uae_u64 v = (outword64[i] >> 32) | (outword64[i] << 32);
+                               if (*dataptr64 != v) {
+                                       thisline_changed = 1;
+                                       *dataptr64 = v;
+                               }
+                               outword64[i] = 0;
+                               dataptr += MAX_WORDS_PER_LINE * 2;
                        }
-                       outword64[i] = 0;
-                       dataptr += MAX_WORDS_PER_LINE * 2;
+                       out_offs += 2;
                }
-               out_offs += 2;
                out_nbits = 0;
        }
 }
@@ -2183,15 +2187,9 @@ static int flush_plane_data_n(int fm)
                toscr_1(32 - out_nbits, fm);
        }
 
-       i += 32;
-       toscr_1(16, fm);
-       toscr_1(16, fm);
-
-       if (fm == 2) {
-               /* flush AGA full 64-bit shift register + possible data in todisplay */
-               i += 32;
-               toscr_1(16, fm);
-               toscr_1(16, fm);
+       for (int j = 0; j < (fmode == 2 ? 3 : 1); j++) {
+               if (out_offs >= MAX_WORDS_PER_LINE / 4 - 1)
+                       break;
                i += 32;
                toscr_1(16, fm);
                toscr_1(16, fm);
@@ -2214,10 +2212,12 @@ static int flush_plane_data_hr(int fm)
                toscr_1_hr(64 - out_nbits, fm);
        }
 
-       toscr_1_hr(32, fm);
-       i += 32;
-       toscr_1_hr(32, fm);
-       i += 32;
+       for (int j = 0; j < 4; j++) {
+               if (out_offs >= MAX_WORDS_PER_LINE / 4 - 1)
+                       break;
+               toscr_1_hr(32, fm);
+               i += 32;
+       }
 
        int toshift = 32 << fm;
        while (i < toshift) {