vdp rendering, fix crash for sprites with negative x/y
authorkub <derkub@gmail.com>
Thu, 4 Mar 2021 23:29:09 +0000 (00:29 +0100)
committerkub <derkub@gmail.com>
Thu, 4 Mar 2021 23:29:52 +0000 (00:29 +0100)
pico/draw.c

index a2e82c0..7e279db 100644 (file)
@@ -59,7 +59,7 @@ int DrawLineDestIncrement;
 \r
 static u32 HighCacheA[41*2+1]; // caches for high layers\r
 static u32 HighCacheB[41*2+1];\r
-static u32 HighPreSpr[80*2+1]; // slightly preprocessed sprites\r
+static s32 HighPreSpr[80*2+1]; // slightly preprocessed sprites\r
 \r
 u32 VdpSATCache[128];  // VDP sprite cache (1st 32 sprite attr bits)\r
 \r
@@ -799,13 +799,13 @@ last_cut_tile:
 // Index + 0  :    hhhhvvvv ab--hhvv yyyyyyyy yyyyyyyy // a: offscreen h, b: offs. v, h: horiz. size\r
 // Index + 4  :    xxxxxxxx xxxxxxxx pccvhnnn nnnnnnnn // x: x coord + 8\r
 \r
-static void DrawSprite(u32 *sprite, int sh, int w)\r
+static void DrawSprite(s32 *sprite, int sh, int w)\r
 {\r
   void (*fTileFunc)(unsigned char *pd, unsigned int pack, unsigned char pal);\r
   unsigned char *pd = Pico.est.HighCol;\r
   int width=0,height=0;\r
   int row=0;\r
-  u32 code=0;\r
+  s32 code=0;\r
   int pal;\r
   int tile=0,delta=0;\r
   int sx, sy;\r
@@ -982,7 +982,7 @@ static void DrawSpritesSHi(unsigned char *sprited, const struct PicoEState *est)
   w = p[cnt]; // possibly clipped width of last sprite\r
   for (cnt--; cnt >= 0; cnt--, w = 0)\r
   {\r
-    u32 *sprite, code;\r
+    s32 *sprite, code;\r
     int pal, tile, sx, sy;\r
     int offs, delta, width, height, row;\r
 \r
@@ -1051,7 +1051,7 @@ static void DrawSpritesHiAS(unsigned char *sprited, int sh)
   // Go through sprites:\r
   for (entry = 0; entry < cnt; entry++)\r
   {\r
-    u32 *sprite, code;\r
+    s32 *sprite, code;\r
     int pal, tile, sx, sy;\r
     int offs, delta, width, height, row;\r
 \r
@@ -1328,7 +1328,7 @@ static void DrawSpritesForced(unsigned char *sprited)
   // Go through sprites:\r
   for (entry = 0; entry < cnt; entry++)\r
   {\r
-    u32 *sprite, code;\r
+    s32 *sprite, code;\r
     int pal, tile, sx, sy;\r
     int offs, delta, width, height, row;\r
 \r
@@ -1401,7 +1401,7 @@ static NOINLINE void PrepareSprites(int max_lines)
   const struct PicoEState *est=&Pico.est;\r
   int u,link=0,sh;\r
   int table=0;\r
-  u32 *pd = HighPreSpr;\r
+  s32 *pd = HighPreSpr;\r
   int max_sprites = 80, max_width = 328;\r
   int max_line_sprites = 20; // 20 sprites, 40 tiles\r
 \r
@@ -1501,7 +1501,7 @@ static NOINLINE void PrepareSprites(int max_lines)
     printf("c%03i: f %x c %2i/%2i w %2i: ", u, HighLnSpr[u][1],\r
            HighLnSpr[u][0], HighLnSpr[u][3], HighLnSpr[u][2]);\r
     for (y = 0; y < HighLnSpr[u][0]; y++) {\r
-      int *sp = HighPreSpr + (HighLnSpr[u][y+4]&0x7f) * 2;\r
+      s32 *sp = HighPreSpr + (HighLnSpr[u][y+4]&0x7f) * 2;\r
       printf(" %i(%x/%x)", HighLnSpr[u][y+4],sp[0],sp[1]);\r
     }\r
     printf("\n");\r
@@ -1527,7 +1527,7 @@ static void DrawAllSprites(unsigned char *sprited, int prio, int sh,
   w = p[cnt]; // possibly clipped width of last sprite\r
   for (cnt--; cnt >= 0; cnt--, w = 0)\r
   {\r
-    u32 *sp = HighPreSpr + (p[cnt]&0x7f) * 2;\r
+    s32 *sp = HighPreSpr + (p[cnt]&0x7f) * 2;\r
     if ((p[cnt] >> 7) != prio) continue;\r
     DrawSprite(sp, sh, w);\r
   }\r