rendering, fix bgr555 output mode
authorkub <derkub@gmail.com>
Sat, 5 Dec 2020 14:20:15 +0000 (15:20 +0100)
committerkub <derkub@gmail.com>
Sat, 5 Dec 2020 14:20:15 +0000 (15:20 +0100)
NB not done for ARM asm since no target uses bgr555

pico/32x/draw.c
pico/draw.c
pico/draw_arm.S
pico/mode4.c

index 8f933a0..c38f60d 100644 (file)
@@ -8,6 +8,15 @@
  */
 #include "../pico_int.h"
 
+// BGR555 to native conversion
+#if defined(USE_BGR555)
+#define PXCONV(t)   (t)
+#define PXPRIO      0x8000  // prio in MSB
+#else // RGB565 
+#define PXCONV(t)   ((((t)&m1) << 11) | (((t)&m2) << 1) | (((t)&m3) >> 10))
+#define PXPRIO      0x0020  // prio in LS green bit
+#endif
+
 int (*PicoScan32xBegin)(unsigned int num);
 int (*PicoScan32xEnd)(unsigned int num);
 int Pico32xDrawMode;
@@ -21,33 +30,21 @@ static void convert_pal555(int invert_prio)
   unsigned int *pd = (void *)Pico32xMem->pal_native;
   unsigned int m1 = 0x001f001f;
   unsigned int m2 = 0x03e003e0;
-  unsigned int m3 = 0xfc00fc00;
+  unsigned int m3 = 0xfc00fc00; // includes prio bit
   unsigned int inv = 0;
   int i;
 
   if (invert_prio)
-    inv = 0x00200020;
+    inv = 0x80008000;
 
-  // place prio to LS green bit
   for (i = 0x100/2; i > 0; i--, ps++, pd++) {
-    unsigned int t = *ps;
-#if defined(USE_BGR555)
-    *pd = t ^ inv;
-#else
-    *pd = (((t & m1) << 11) | ((t & m2) << 1) | ((t & m3) >> 10)) ^ inv;
-#endif
+    unsigned int t = *ps ^ inv;
+    *pd = PXCONV(t);
   }
 
   Pico32x.dirty_pal = 0;
 }
 
-// 555 conversion for direct color mode
-#if defined(USE_BGR555)
-#define DC555(t)       t
-#else
-#define DC555(t)       ((t&m1) << 11) | ((t&m2) << 1) | ((t&m3) >> 10)
-#endif
-
 // direct color mode
 #define do_line_dc(pd, p32x, pmd, inv, pmd_draw_code)             \
 {                                                                 \
@@ -60,12 +57,12 @@ static void convert_pal555(int invert_prio)
   while (i > 0) {                                                 \
     for (; i > 0 && (*pmd & 0x3f) == mdbg; pd++, pmd++, i--) {    \
       t = *p32x++;                                                \
-      *pd = DC555(t);                                             \
+      *pd = PXCONV(t);                                            \
     }                                                             \
     for (; i > 0 && (*pmd & 0x3f) != mdbg; pd++, pmd++, i--) {    \
-      t = *p32x++;                                                \
-      if ((t ^ inv) & 0x8000)                                     \
-        *pd = DC555(t);                                           \
+      t = *p32x++ ^ inv;                                          \
+      if (t & 0x8000)                                             \
+        *pd = PXCONV(t);                                          \
       else                                                        \
         pmd_draw_code;                                            \
     }                                                             \
@@ -84,7 +81,7 @@ static void convert_pal555(int invert_prio)
     }                                                             \
     for (; i > 0 && (*pmd & 0x3f) != mdbg; pd++, pmd++, i--) {    \
       t = pal[*(unsigned char *)((uintptr_t)(p32x++) ^ 1)];       \
-      if (t & 0x20)                                               \
+      if (t & PXPRIO)                                             \
         *pd = t;                                                  \
       else                                                        \
         pmd_draw_code;                                            \
@@ -100,7 +97,7 @@ static void convert_pal555(int invert_prio)
   for (i = 320; i > 0; p32x++) {                                  \
     t = pal[*p32x & 0xff];                                        \
     for (len = (*p32x >> 8) + 1; len > 0 && i > 0; len--, i--, pd++, pmd++) { \
-      if ((*pmd & 0x3f) == mdbg || (t & 0x20))                    \
+      if ((*pmd & 0x3f) == mdbg || (t & PXPRIO))                  \
         *pd = t;                                                  \
       else                                                        \
         pmd_draw_code;                                            \
index 1aab2bc..e8a4723 100644 (file)
@@ -65,6 +65,16 @@ unsigned int VdpSATCache[128];  // VDP sprite cache (1st 32 sprite attr bits)
 \r
 // NB don't change any defines without checking their usage in ASM\r
 \r
+#if defined(USE_BGR555)\r
+#define PXCONV(t)   ((t & 0x000e000e)<< 1) | ((t & 0x00e000e0)<<2) | ((t & 0x0e000e00)<<3)\r
+#define PXMASKL     0x04210421  // 0x0c630c63, LSB for all colours\r
+#define PXMASKH     0x39ce39ce  // 0x3def3def, all but MSB for all colours\r
+#else // RGB565\r
+#define PXCONV(t)   ((t & 0x000e000e)<<12) | ((t & 0x00e000e0)<<3) | ((t & 0x0e000e00)>>7)\r
+#define PXMASKL     0x08610861  // 0x18e318e3\r
+#define PXMASKH     0x738e738e  // 0x7bef7bef\r
+#endif\r
+\r
 #define LF_PLANE   (1 << 0) // must be = 1\r
 #define LF_SH      (1 << 1) // must be = 2\r
 //#define LF_FORCE   (1 << 2)\r
@@ -1542,14 +1552,10 @@ void PicoDoHighPal555_8bit(int sh, int line, struct PicoEState *est)
   // additional palettes stored after in-frame changes\r
   for (i = 0; i < cnt * 0x40 / 2; i++) {\r
     t = spal[i];\r
-#ifdef USE_BGR555\r
-    t = ((t & 0x000e000e)<< 1) | ((t & 0x00e000e0)<<3) | ((t & 0x0e000e00)<<4);\r
-#else\r
-    t = ((t & 0x000e000e)<<12) | ((t & 0x00e000e0)<<3) | ((t & 0x0e000e00)>>7);\r
-#endif\r
     // treat it like it was 4-bit per channel, since in s/h mode it somewhat is that.\r
     // otherwise intensity difference between this and s/h will be wrong\r
-    t |= (t >> 4) & 0x08610861; // 0x18e318e3\r
+    t = PXCONV(t);\r
+    t |= (t >> 4) & PXMASKL;\r
     dpal[i] = dpal[0xc0/2 + i] = t;\r
   }\r
 \r
@@ -1558,11 +1564,11 @@ void PicoDoHighPal555_8bit(int sh, int line, struct PicoEState *est)
   {\r
     // shadowed pixels\r
     for (i = 0; i < 0x40 / 2; i++)\r
-      dpal[0x80/2 + i] = (dpal[i] >> 1) & 0x738e738e;\r
+      dpal[0x80/2 + i] = (dpal[i] >> 1) & PXMASKH;\r
     // hilighted pixels\r
     for (i = 0; i < 0x40 / 2; i++) {\r
-      t = ((dpal[i] >> 1) & 0x738e738e) + 0x738e738e; // 0x7bef7bef;\r
-      t |= (t >> 4) & 0x08610861;\r
+      t = ((dpal[i] >> 1) & PXMASKH) + PXMASKH;\r
+      t |= (t >> 4) & PXMASKL;\r
       dpal[0x40/2 + i] = t;\r
     }\r
     // shadowed pixels in color 14 always appear normal (hw bug?)\r
@@ -1586,14 +1592,10 @@ void PicoDoHighPal555(int sh, int line, struct PicoEState *est)
 \r
   for (i = 0; i < 0x40 / 2; i++) {\r
     t = spal[i];\r
-#ifdef USE_BGR555\r
-    t = ((t & 0x0e000e00)<< 3) | ((t & 0x00e000e0)<<2) | ((t & 0x000e000e)<<1);\r
-#else\r
-    t = ((t & 0x000e000e)<<12) | ((t & 0x00e000e0)<<3) | ((t & 0x0e000e00)>>7);\r
-#endif\r
     // treat it like it was 4-bit per channel, since in s/h mode it somewhat is that.\r
     // otherwise intensity difference between this and s/h will be wrong\r
-    t |= (t >> 4) & 0x08610861; // 0x18e318e3\r
+    t = PXCONV(t);\r
+    t |= (t >> 4) & PXMASKL;\r
     dpal[i] = dpal[0xc0/2 + i] = t;\r
   }\r
 \r
@@ -1602,11 +1604,11 @@ void PicoDoHighPal555(int sh, int line, struct PicoEState *est)
   {\r
     // shadowed pixels\r
     for (i = 0; i < 0x40 / 2; i++)\r
-      dpal[0x80/2 + i] = (dpal[i] >> 1) & 0x738e738e;\r
+      dpal[0x80/2 + i] = (dpal[i] >> 1) & PXMASKH;\r
     // hilighted pixels\r
     for (i = 0; i < 0x40 / 2; i++) {\r
-      t = ((dpal[i] >> 1) & 0x738e738e) + 0x738e738e; // 0x7bef7bef;\r
-      t |= (t >> 4) & 0x08610861;\r
+      t = ((dpal[i] >> 1) & PXMASKH) + PXMASKH;\r
+      t |= (t >> 4) & PXMASKL;\r
       dpal[0x40/2 + i] = t;\r
     }\r
     // shadowed pixels in color 14 always appear normal (hw bug?)\r
index d455197..3744122 100644 (file)
@@ -7,6 +7,8 @@
  * See COPYING file in the top-level directory.\r
  *\r
  * this is highly specialized, be careful if changing related C code!\r
+ *\r
+ * NB only does RGB565 output, BGR555 isn't supported\r
  */\r
 \r
 #include "pico_int_offs.h"\r
index 6e921c8..8de41ae 100644 (file)
@@ -339,11 +339,11 @@ void PicoDoHighPal555M4(void)
     t = *spal;
 #ifdef USE_BGR555
     t = ((t & 0x00030003)<< 3) | ((t & 0x000c000c)<<6) | ((t & 0x00300030)<<9);
+    t |= (t >> 2) | ((t >> 4) & 0x04210421);
 #else
     t = ((t & 0x00030003)<<14) | ((t & 0x000c000c)<<7) | ((t & 0x00300030)>>1);
+    t |= (t >> 2) | ((t >> 4) & 0x08610861);
 #endif
-    t |= t >> 2;
-    t |= (t >> 4) & 0x08610861;
     *dpal = t;
   }
   Pico.est.HighPal[0xe0] = 0;