platform ps2, handle audio similar to psp
[picodrive.git] / platform / linux / blit.c
index a4981d9..e10aa6b 100644 (file)
@@ -1,38 +1,48 @@
+/*
+ * PicoDrive
+ * (C) notaz, 2006,2009
+ * (C) irixxxx, 2022
+ *
+ * This work is licensed under the terms of MAME license.
+ * See COPYING file in the top-level directory.
+ */
+
+#include <string.h>
 
 // Convert 0000bbb0 ggg0rrr0 0000bbb0 ggg0rrr0
 // to      00000000 rrr00000 ggg00000 bbb00000 ...
+// TODO: rm when gp2x/emu.c is no longer used
 
-void vidConvCpyRGB32  (void *to, void *from, int pixels)
+void bgr444_to_rgb32(void *to, void *from, unsigned entries)
 {
        unsigned short *ps = from;
        unsigned int   *pd = to;
+       int pixels;
 
-       for (; pixels; pixels--, ps++, pd++)
+       for (pixels = entries; pixels; pixels--, ps++, pd++)
        {
                *pd = ((*ps<<20)&0xe00000) | ((*ps<<8)&0xe000) | ((*ps>>4)&0xe0);
                *pd |= *pd >> 3;
        }
 }
 
-void vidConvCpyRGB32sh(void *to, void *from, int pixels)
+void bgr444_to_rgb32_sh(void *to, void *from)
 {
        unsigned short *ps = from;
        unsigned int   *pd = to;
+       int pixels;
 
-       for (; pixels; pixels--, ps++, pd++)
+       pd += 0x40;
+       for (pixels = 0x40; pixels; pixels--, ps++, pd++)
        {
                *pd = ((*ps<<20)&0xe00000) | ((*ps<<8)&0xe000) | ((*ps>>4)&0xe0);
                *pd >>= 1;
                *pd |= *pd >> 3;
+               pd[0x40*2] = *pd;
        }
-}
-
-void vidConvCpyRGB32hi(void *to, void *from, int pixels)
-{
-       unsigned short *ps = from;
-       unsigned int   *pd = to;
 
-       for (; pixels; pixels--, ps++, pd++)
+       ps -= 0x40;
+       for (pixels = 0x40; pixels; pixels--, ps++, pd++)
        {
                *pd = ((*ps<<20)&0xe00000) | ((*ps<<8)&0xe000) | ((*ps>>4)&0xe0);
                continue;
@@ -45,37 +55,88 @@ void vidConvCpyRGB32hi(void *to, void *from, int pixels)
        }
 }
 
-void vidCpyM2_40col(void *dest, void *src)
+#define X (x_y >> 16)
+#define Y (x_y & 0xffff)
+#define W (w_h >> 16)
+#define H (w_h & 0xffff)
+
+// gp2x:   0-> X    wiz: Y <-0
+//         |                 |
+//         v                 v
+//
+//         Y                 X
+
+void vidcpy_8bit(void *dest, void *src, int x_y, int w_h)
 {
        unsigned char *pd = dest, *ps = src;
-       int i, u;
+       int i;
 
-       for (i = 0; i < 224; i++)
-       {
-               ps += 8;
-               for (u = 0; u < 320; u++)
-                       *pd++ = *ps++;
+       pd += X + Y*320;
+       ps += X + Y*328 + 8;
+       for (i = 0; i < H; i++) {
+               memcpy(pd, ps, W);
+               ps += 328; pd += 320;
        }
 }
 
-void vidCpyM2_32col(void *dest, void *src)
+void vidcpy_8bit_rot(void *dest, void *src, int x_y, int w_h)
 {
        unsigned char *pd = dest, *ps = src;
        int i, u;
 
-       for (i = 0; i < 224; i++)
-       {
-               ps += 8;
-               pd += 32;
-               for (u = 0; u < 256; u++)
-                       *pd++ = *ps++;
-               ps += 64;
-               pd += 32;
+       pd += Y + (319-X)*240;
+       ps += X + Y*328 + 8;
+       for (i = 0; i < H; i += 4) {
+               unsigned char *p = (void *)ps;
+               unsigned int  *q = (void *)pd;
+               for (u = 0; u < W; u++) {
+                       *q = (p[3*328]<<24) + (p[2*328]<<16) + (p[1*328]<<8) + p[0*328];
+                       p += 1;
+                       q -= 240/4;
+               }
+               ps += 4*328; pd += 4;
        }
 }
 
-void vidCpyM2_32col_nobord(void *dest, void *src)
+void rotated_blit8 (void *dst, void *linesx4, int y, int is_32col)
 {
-       vidCpyM2_32col(dest, src);
+       unsigned char *pd = dst, *ps = linesx4;
+       int x, w, u;
+
+       x = (is_32col ? 32 : 0);
+       w = (is_32col ? 256 : 320);
+       y -= 4;
+
+       pd += y + (319-x)*240;
+       ps += x;
+
+       unsigned char *p = (void *)ps;
+       unsigned int  *q = (void *)pd;
+       for (u = 0; u < w; u++) {
+               *q = (p[3*328]<<24) + (p[2*328]<<16) + (p[1*328]<<8) + p[0*328];
+               p += 1;
+               q -= 240/4;
+       }
 }
 
+void rotated_blit16(void *dst, void *linesx4, int y, int is_32col)
+{
+       unsigned short *pd = dst, *ps = linesx4;
+       int x, w, u;
+
+       x = (is_32col ? 32 : 0);
+       w = (is_32col ? 256 : 320);
+       y -= 4;
+
+       pd += y + (319-x)*240;
+       ps += x;
+
+       unsigned short *p = (void *)ps;
+       unsigned int   *q = (void *)pd;
+       for (u = 0; u < w; u++) {
+               q[0] = (p[1*328]<<16) + p[0*328];
+               q[1] = (p[3*328]<<16) + p[2*328];
+               p += 1;
+               q -= 2*240/4;
+       }
+}