32x: mode2 draw, debug, poll detection
[picodrive.git] / pico / 32x / draw.c
index 1e2f57c..7e0911e 100644 (file)
@@ -27,7 +27,8 @@ void FinalizeLine32xRGB555(int sh, int line)
   unsigned short *pd = DrawLineDest;
   unsigned short *pal = Pico32xMem->pal_native;
   unsigned char *pb = HighCol + 8;
-  unsigned short cram0;
+  unsigned short *dram, *ps, cram0;
+  int i;
 
   // this is a bit hackish:
   // we swap cram color 0 with color that is used for background,
@@ -44,14 +45,30 @@ void FinalizeLine32xRGB555(int sh, int line)
   if (!(PicoDrawMask & PDRAW_32X_ON))
     return;
 
+  dram = (void *)Pico32xMem->dram[Pico32x.vdp_regs[0x0a/2] & P32XV_FS];
+  ps = dram + dram[line];
+
+  if ((Pico32x.vdp_regs[0] & P32XV_Mx) == 2) { // Direct Color Mode
+    int inv = (Pico32x.vdp_regs[0] & P32XV_PRI) ? 0x8000 : 0;
+    unsigned int m1 = 0x001f001f;
+    unsigned int m2 = 0x03e003e0;
+    unsigned int m3 = 0xfc00fc00;
+
+    for (i = 320; i > 0; i--, ps++, pd++, pb++) {
+      unsigned short t = *ps;
+      if (*pb != 0 && !((t ^ inv) & 0x8000))
+        continue;
+
+      *pd = ((t & m1) << 11) | ((t & m2) << 1) | ((t & m3) >> 10);
+    }
+    return;
+  }
+
   if (Pico32x.dirty_pal)
     convert_pal555(Pico32x.vdp_regs[0] & P32XV_PRI);
 
-  if ((Pico32x.vdp_regs[0] & P32XV_Mx) == 1) {
-    unsigned short *dram = (void *)Pico32xMem->dram[Pico32x.vdp_regs[0x0a/2] & P32XV_FS];
-    unsigned short *ps = dram + dram[line];
+  if ((Pico32x.vdp_regs[0] & P32XV_Mx) == 1) { // Packed Pixel Mode
     unsigned short t;
-    int i;
     for (i = 320/2; i > 0; i--, ps++, pd += 2, pb += 2) {
       t = pal[*ps >> 8];
       if (pb[0] == 0 || (t & 0x20))
@@ -61,5 +78,8 @@ void FinalizeLine32xRGB555(int sh, int line)
         pd[1] = t;
     }
   }
+  else { // Run Length Mode
+
+  }
 }