- 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
+ if (sy < max_lines && sy + (height<<3) > DrawScanline) // sprite onscreen (y)?\r
+ {\r
+ int y = (sy >= DrawScanline) ? sy : DrawScanline;\r
+ int entry = ((pd - HighPreSpr) / 2) | ((code2>>8)&0x80);\r
+ for (; y < sy + (height<<3) && y < max_lines; y++)\r
+ {\r
+ int cnt = HighLnSpr[y][0];\r
+ if (cnt >= max_line_sprites) continue; // sprite limit?\r
+\r
+ if (HighLnSpr[y][1] >= max_line_sprites*2) { // tile limit?\r
+ HighLnSpr[y][0] |= 0x80;\r
+ continue;\r
+ }\r
+ HighLnSpr[y][1] += width;\r
+\r
+ if (sx == -0x78) {\r
+ if (cnt > 0)\r
+ HighLnSpr[y][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 && (sx <= sx_min || sx >= max_width)) continue; // offscreen x\r
+\r
+ HighLnSpr[y][2+cnt] = entry;\r
+ HighLnSpr[y][0] = cnt + 1;\r
+ if (entry & 0x80)\r
+ rendstatus |= PDRAW_HAVE_HI_SPR;\r
+ else rendstatus |= PDRAW_HAVE_LO_SPR;\r
+ }\r