- sx_min = 8-(width<<3);\r
-\r
- if ((sx <= sx_min && sx >= -0x76) || sx >= 328) skip|=1<<23; // offscreen x\r
- else if (sx > sx_min && !skip) {\r
- int sbl = (2<<height)-1;\r
- int shi = sy>>3;\r
- if(shi < 0) shi=0; // negative sy\r
- sblocks |= sbl<<shi;\r
+\r
+ if (sy < max_lines && sy + (height<<3) > DrawScanline) // sprite onscreen (y)?\r
+ {\r
+ int entry, y, sx_min, onscr_x, maybe_op = 0;\r
+\r
+ sx_min = 8-(width<<3);\r
+ onscr_x = sx_min < sx && sx < max_width;\r
+ if (sh && (code2 & 0x6000) == 0x6000)\r
+ maybe_op = SPRL_MAY_HAVE_OP;\r
+\r
+ entry = ((pd - HighPreSpr) / 2) | ((code2>>8)&0x80);\r
+ y = (sy >= DrawScanline) ? sy : DrawScanline;\r
+ for (; y < sy + (height<<3) && y < max_lines; y++)\r
+ {\r
+ unsigned char *p = &HighLnSpr[y][0];\r
+ int cnt = p[0];\r
+ if (cnt >= max_line_sprites) continue; // sprite limit?\r
+\r
+ if (p[2] >= max_line_sprites*2) { // tile limit?\r
+ p[0] |= 0x80;\r
+ continue;\r
+ }\r
+ p[2] += width;\r
+\r
+ if (sx == -0x78) {\r
+ if (cnt > 0)\r
+ p[0] |= 0x80; // masked, no more sprites for this line\r
+ continue;\r
+ }\r
+ // must keep the first sprite even if it's offscreen, for masking\r
+ if (cnt > 0 && !onscr_x) continue; // offscreen x\r
+\r
+ p[3+cnt] = entry;\r
+ p[0] = cnt + 1;\r
+ p[1] |= (entry & 0x80) ? SPRL_HAVE_HI : SPRL_HAVE_LO;\r
+ p[1] |= maybe_op; // there might be op sprites on this line\r
+ if (cnt > 0 && (code2 & 0x8000) && !(p[3+cnt-1]&0x80))\r
+ p[1] |= SPRL_LO_ABOVE_HI;\r
+ }\r