+static void DrawSpritesHiAS(unsigned char *sprited, int sh)\r
+{\r
+ int (*fTileFunc)(int sx,int addr,int pal);\r
+ unsigned char *p;\r
+ int entry, cnt, sh_cnt = 0;\r
+\r
+ cnt = sprited[0] & 0x7f;\r
+ if (cnt == 0) return;\r
+\r
+ p = &sprited[3];\r
+\r
+ // Go through sprites:\r
+ for (entry = 0; entry < cnt; entry++)\r
+ {\r
+ int *sprite, code, pal, tile, sx, sy;\r
+ int offs, delta, width, height, row;\r
+\r
+ offs = (p[entry] & 0x7f) * 2;\r
+ sprite = HighPreSpr + offs;\r
+ code = sprite[1];\r
+ pal = (code>>9)&0x30;\r
+\r
+ if (code & 0x8000) // hi priority\r
+ {\r
+ if (sh && pal == 0x30)\r
+ {\r
+ if (code&0x800) fTileFunc=TileFlipAS_noop;\r
+ else fTileFunc=TileNormAS_noop;\r
+ } else {\r
+ if (code&0x800) fTileFunc=TileFlipAS;\r
+ else fTileFunc=TileNormAS;\r
+ }\r
+ } else {\r
+ if (code&0x800) fTileFunc=TileFlipAS_onlymark;\r
+ else fTileFunc=TileNormAS_onlymark;\r
+ }\r
+ if (sh && pal == 0x30)\r
+ p[sh_cnt++] = offs / 2; // re-save for sh/hi pass\r
+\r
+ // parse remaining sprite data\r
+ sy=sprite[0];\r
+ sx=code>>16; // X\r
+ width=sy>>28;\r
+ height=(sy>>24)&7; // Width and height in tiles\r
+ sy=(sy<<16)>>16; // Y\r
+\r
+ row=DrawScanline-sy; // Row of the sprite we are on\r
+\r
+ if (code&0x1000) row=(height<<3)-1-row; // Flip Y\r
+\r
+ tile=code + (row>>3); // Tile number increases going down\r
+ delta=height; // Delta to increase tile by going right\r
+ if (code&0x0800) { tile+=delta*(width-1); delta=-delta; } // Flip X\r
+\r
+ tile &= 0x7ff; tile<<=4; tile+=(row&7)<<1; // Tile address\r
+ delta<<=4; // Delta of address\r
+\r
+ pal |= 0x80;\r
+ for (; width; width--,sx+=8,tile+=delta)\r
+ {\r
+ if(sx<=0) continue;\r
+ if(sx>=328) break; // Offscreen\r
+\r
+ tile&=0x7fff; // Clip tile address\r
+ fTileFunc(sx,tile,pal);\r
+ }\r
+ }\r
+\r
+ if (!sh || !(sprited[1]&SPRL_MAY_HAVE_OP)) return;\r
+\r
+ /* nasty 1: remove 'sprite' flags */\r
+ {\r
+ int c = 320/4, *zb = (int *)(HighCol+8);\r
+ while (c--)\r
+ {\r
+ *zb++ &= 0x7f7f7f7f;\r
+ }\r
+ }\r
+\r
+ /* nasty 2: sh operator pass */\r
+ sprited[0] = sh_cnt;\r
+ DrawSpritesSHi(sprited);\r
+}\r
+\r