+// Index + 0 : hhhhvvvv ----hhvv yyyyyyyy yyyyyyyy // v, h: vert./horiz. size\r
+// Index + 4 : xxxxxxxx xxxxxxxx pccvhnnn nnnnnnnn // x: x coord + 8\r
+static void DrawSpritesSHi(unsigned char *sprited)\r
+{\r
+ int (*fTileFunc)(int sx,int addr,int pal);\r
+ unsigned char *p;\r
+ int cnt;\r
+\r
+ cnt = sprited[0] & 0x7f;\r
+ if (cnt == 0) return;\r
+\r
+ p = &sprited[3];\r
+\r
+ // Go through sprites backwards:\r
+ for (cnt--; cnt >= 0; cnt--)\r
+ {\r
+ int *sprite, code, pal, tile, sx, sy;\r
+ int offs, delta, width, height, row;\r
+\r
+ offs = (p[cnt] & 0x7f) * 2;\r
+ sprite = HighPreSpr + offs;\r
+ code = sprite[1];\r
+ pal = (code>>9)&0x30;\r
+\r
+ if (pal == 0x30)\r
+ {\r
+ if (code & 0x8000) // hi priority\r
+ {\r
+ if (code&0x800) fTileFunc=TileFlipSH;\r
+ else fTileFunc=TileNormSH;\r
+ } else {\r
+ if (code&0x800) fTileFunc=TileFlipSH_onlyop_lp;\r
+ else fTileFunc=TileNormSH_onlyop_lp;\r
+ }\r
+ } else {\r
+ if (!(code & 0x8000)) continue; // non-operator low sprite, already drawn\r
+ if (code&0x800) fTileFunc=TileFlip;\r
+ else fTileFunc=TileNorm;\r
+ }\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
+ 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
+#endif // !_ASM_DRAW_C\r
+\r
+static void DrawSpritesHiAS(unsigned char *sprited, int sh)\r