+static void DrawSpritesFromCacheAS(int *hc, int maxwidth, int prio, int sh)\r
+{\r
+ int code, tile, sx, delta, width;\r
+ int pal, *hce, *hco;\r
+ int (*fTileFunc)(int sx,int addr,int pal);\r
+\r
+ // prio[31]:tile[30:17]:flipx[16]:sx[15:6]:pal[5:4]:delta_width[3:0]\r
+\r
+ /* walk the sprite cache backwards.. */\r
+ hco = hce = HighCacheS_ptr;\r
+ while (hce > hc)\r
+ {\r
+ code=*(--hce);\r
+ pal=(code&0x30);\r
+ delta=code&0xf;\r
+ width=delta>>2; delta&=3;\r
+ width++; delta++; // Width and height in tiles\r
+ if (code&0x10000) delta=-delta; // Flip X\r
+ delta<<=4;\r
+ tile=((unsigned int)code>>17)<<1;\r
+ sx=(code<<16)>>22; // sx can be negative (start offscreen), so sign extend\r
+\r
+ if (code & 0x80000000) // hi priority\r
+ {\r
+ if (sh && pal == 0x30)\r
+ {\r
+ if(code&0x10000) fTileFunc=TileFlipAS_noop;\r
+ else fTileFunc=TileNormAS_noop;\r
+ *(--hco) = code; /* save for later */\r
+ } else {\r
+ if(code&0x10000) fTileFunc=TileFlipAS;\r
+ else fTileFunc=TileNormAS;\r
+ }\r
+ } else {\r
+ if(code&0x10000) fTileFunc=TileFlipAS_onlymark;\r
+ else fTileFunc=TileNormAS_onlymark;\r
+ }\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) 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: loop once more and do operator colors */\r
+ while ((code=*hco++))\r
+ {\r
+ pal=(code&0x30);\r
+ if (pal != 0x30) continue;\r
+ delta=code&0xf;\r
+ width=delta>>2; delta&=3;\r
+ width++; delta++;\r
+ if (code&0x10000) delta=-delta; // Flip X\r
+ delta<<=4;\r
+ tile=((unsigned int)code>>17)<<1;\r
+ sx=(code<<16)>>22;\r
+\r
+ if (code & 0x80000000)\r
+ {\r
+ if(code&0x10000) fTileFunc=TileFlipSH;\r
+ else fTileFunc=TileNormSH;\r
+ } else {\r
+ if(code&0x10000) fTileFunc=TileFlipSH_onlyop_lp;\r
+ else fTileFunc=TileNormSH_onlyop_lp;\r
+ }\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
+\r
+\r