sms: improve sr a bit
[picodrive.git] / pico / mode4.c
index 1f9adff..a13c38b 100644 (file)
@@ -31,7 +31,7 @@ static int TileNormM4(int sx, int addr, int pal)
   unsigned char *pd = Pico.est.HighCol + sx;
   unsigned int pack, t;
 
-  pack = *(unsigned int *)(Pico.vram + addr); /* Get 4 bitplanes / 8 pixels */
+  pack = *(unsigned int *)(PicoMem.vram + addr); /* Get 4 bitplanes / 8 pixels */
   if (pack)
   {
     PLANAR_PIXEL(0, 0)
@@ -53,7 +53,7 @@ static int TileFlipM4(int sx,int addr,int pal)
   unsigned char *pd = Pico.est.HighCol + sx;
   unsigned int pack, t;
 
-  pack = *(unsigned int *)(Pico.vram + addr); /* Get 4 bitplanes / 8 pixels */
+  pack = *(unsigned int *)(PicoMem.vram + addr); /* Get 4 bitplanes / 8 pixels */
   if (pack)
   {
     PLANAR_PIXEL(0, 7)
@@ -83,7 +83,7 @@ static void draw_sprites(int scanline)
   if (pv->reg[0] & 8)
     xoff = 0;
 
-  sat = (unsigned char *)Pico.vram + ((pv->reg[5] & 0x7e) << 7);
+  sat = (unsigned char *)PicoMem.vram + ((pv->reg[5] & 0x7e) << 7);
   if (pv->reg[1] & 2) {
     addr_mask = 0xfe; h = 16;
   } else {
@@ -91,7 +91,7 @@ static void draw_sprites(int scanline)
   }
   sprite_base = (pv->reg[6] & 4) << (13-2-1);
 
-  for (i = s = 0; i < 64 && s < 8; i++)
+  for (i = s = 0; i < 64; i++)
   {
     int y;
     y = sat[i] + 1;
@@ -99,6 +99,10 @@ static void draw_sprites(int scanline)
       break;
     if (y + h <= scanline || scanline < y)
       continue; // not on this line
+    if (s >= 8) {
+      pv->status |= SR_SOVR;
+      break;
+    }
 
     sprites_x[s] = xoff + sat[0x80 + i*2];
     sprites_addr[s] = sprite_base + ((sat[0x80 + i*2 + 1] & addr_mask) << (5-1)) +
@@ -106,6 +110,10 @@ static void draw_sprites(int scanline)
     s++;
   }
 
+  // really half-assed but better than nothing
+  if (s > 1)
+    pv->status |= SR_C;
+
   // now draw all sprites backwards
   for (--s; s >= 0; s--)
     TileNormM4(sprites_x[s], sprites_addr[s], 0x10);
@@ -161,7 +169,7 @@ static void DrawDisplayM4(int scanline)
     line -= 224;
 
   // Find name table:
-  nametab = Pico.vram;
+  nametab = PicoMem.vram;
   nametab += (pv->reg[2] & 0x0e) << (10-1);
   nametab += (line>>3) << (6-1);
 
@@ -179,15 +187,15 @@ static void DrawDisplayM4(int scanline)
   dx += cellskip << 3;
 
   // low priority tiles
-  if (PicoDrawMask & PDRAW_LAYERB_ON)
+  if (!(pv->debug_p & PVD_KILL_B))
     draw_strip(nametab, dx, cells, tilex | 0x0000 | (ty << 16));
 
   // sprites
-  if (PicoDrawMask & PDRAW_SPRITES_LOW_ON)
+  if (!(pv->debug_p & PVD_KILL_S_LO))
     draw_sprites(scanline);
 
   // high priority tiles (use virtual layer switch just for fun)
-  if (PicoDrawMask & PDRAW_LAYERA_ON)
+  if (!(pv->debug_p & PVD_KILL_A))
     draw_strip(nametab, dx, cells, tilex | 0x1000 | (ty << 16));
 
   if (pv->reg[0] & 0x20)
@@ -248,8 +256,8 @@ void PicoLineMode4(int line)
 
 void PicoDoHighPal555M4(void)
 {
-  unsigned int *spal=(void *)Pico.cram;
-  unsigned int *dpal=(void *)HighPal;
+  unsigned int *spal=(void *)PicoMem.cram;
+  unsigned int *dpal=(void *)Pico.est.HighPal;
   unsigned int t;
   int i;
 
@@ -267,7 +275,7 @@ void PicoDoHighPal555M4(void)
     t |= (t >> 4) & 0x08610861;
     *dpal = t;
   }
-  HighPal[0xe0] = 0;
+  Pico.est.HighPal[0xe0] = 0;
 }
 
 static void FinalizeLineRGB555M4(int line)
@@ -287,7 +295,7 @@ static void FinalizeLine8bitM4(int line)
   if (!(PicoOpt & POPT_DIS_32C_BORDER))
     pd += 32;
 
-  memcpy32((int *)pd, (int *)(Pico.est.HighCol+8), 256/4);
+  memcpy(pd, Pico.est.HighCol + 8, 256);
 }
 
 void PicoDrawSetOutputMode4(pdso_t which)
@@ -300,3 +308,4 @@ void PicoDrawSetOutputMode4(pdso_t which)
   }
 }
 
+// vim:shiftwidth=2:ts=2:expandtab