platform ps2, handle audio similar to psp
[picodrive.git] / platform / linux / blit.c
CommitLineData
cff531af 1/*
2 * PicoDrive
3 * (C) notaz, 2006,2009
15cc45c0 4 * (C) irixxxx, 2022
cff531af 5 *
6 * This work is licensed under the terms of MAME license.
7 * See COPYING file in the top-level directory.
8 */
cc68a136 9
96948bdf 10#include <string.h>
11
cc68a136 12// Convert 0000bbb0 ggg0rrr0 0000bbb0 ggg0rrr0
13// to 00000000 rrr00000 ggg00000 bbb00000 ...
645ec129 14// TODO: rm when gp2x/emu.c is no longer used
cc68a136 15
ace18401 16void bgr444_to_rgb32(void *to, void *from, unsigned entries)
cc68a136 17{
18 unsigned short *ps = from;
19 unsigned int *pd = to;
19954be1 20 int pixels;
cc68a136 21
ace18401 22 for (pixels = entries; pixels; pixels--, ps++, pd++)
cc68a136 23 {
24 *pd = ((*ps<<20)&0xe00000) | ((*ps<<8)&0xe000) | ((*ps>>4)&0xe0);
25 *pd |= *pd >> 3;
26 }
27}
28
19954be1 29void bgr444_to_rgb32_sh(void *to, void *from)
cc68a136 30{
31 unsigned short *ps = from;
32 unsigned int *pd = to;
19954be1 33 int pixels;
cc68a136 34
19954be1 35 pd += 0x40;
36 for (pixels = 0x40; pixels; pixels--, ps++, pd++)
cc68a136 37 {
38 *pd = ((*ps<<20)&0xe00000) | ((*ps<<8)&0xe000) | ((*ps>>4)&0xe0);
39 *pd >>= 1;
40 *pd |= *pd >> 3;
19954be1 41 pd[0x40*2] = *pd;
cc68a136 42 }
cc68a136 43
19954be1 44 ps -= 0x40;
45 for (pixels = 0x40; pixels; pixels--, ps++, pd++)
cc68a136 46 {
47 *pd = ((*ps<<20)&0xe00000) | ((*ps<<8)&0xe000) | ((*ps>>4)&0xe0);
48 continue;
49 *pd += 0x00404040;
50 if (*pd & 0x01000000) *pd |= 0x00e00000;
51 if (*pd & 0x00010000) *pd |= 0x0000e000;
52 if (*pd & 0x00000100) *pd |= 0x000000e0;
53 *pd &= 0x00e0e0e0;
54 *pd |= *pd >> 3;
55 }
56}
57
96948bdf 58#define X (x_y >> 16)
59#define Y (x_y & 0xffff)
60#define W (w_h >> 16)
61#define H (w_h & 0xffff)
62
63// gp2x: 0-> X wiz: Y <-0
64// | |
65// v v
66//
67// Y X
68
69void vidcpy_8bit(void *dest, void *src, int x_y, int w_h)
cc68a136 70{
71 unsigned char *pd = dest, *ps = src;
96948bdf 72 int i;
cc68a136 73
96948bdf 74 pd += X + Y*320;
75 ps += X + Y*328 + 8;
76 for (i = 0; i < H; i++) {
77 memcpy(pd, ps, W);
78 ps += 328; pd += 320;
cc68a136 79 }
80}
81
96948bdf 82void vidcpy_8bit_rot(void *dest, void *src, int x_y, int w_h)
cc68a136 83{
96948bdf 84 unsigned char *pd = dest, *ps = src;
85 int i, u;
86
87 pd += Y + (319-X)*240;
88 ps += X + Y*328 + 8;
89 for (i = 0; i < H; i += 4) {
90 unsigned char *p = (void *)ps;
91 unsigned int *q = (void *)pd;
92 for (u = 0; u < W; u++) {
93 *q = (p[3*328]<<24) + (p[2*328]<<16) + (p[1*328]<<8) + p[0*328];
94 p += 1;
95 q -= 240/4;
96 }
97 ps += 4*328; pd += 4;
98 }
cc68a136 99}
100
645ec129 101void rotated_blit8 (void *dst, void *linesx4, int y, int is_32col)
cc68a136 102{
96948bdf 103 unsigned char *pd = dst, *ps = linesx4;
104 int x, w, u;
105
106 x = (is_32col ? 32 : 0);
107 w = (is_32col ? 256 : 320);
108 y -= 4;
109
110 pd += y + (319-x)*240;
111 ps += x;
112
113 unsigned char *p = (void *)ps;
114 unsigned int *q = (void *)pd;
115 for (u = 0; u < w; u++) {
116 *q = (p[3*328]<<24) + (p[2*328]<<16) + (p[1*328]<<8) + p[0*328];
117 p += 1;
118 q -= 240/4;
119 }
cc68a136 120}
121
645ec129 122void rotated_blit16(void *dst, void *linesx4, int y, int is_32col)
123{
96948bdf 124 unsigned short *pd = dst, *ps = linesx4;
125 int x, w, u;
126
127 x = (is_32col ? 32 : 0);
128 w = (is_32col ? 256 : 320);
129 y -= 4;
130
131 pd += y + (319-x)*240;
132 ps += x;
133
134 unsigned short *p = (void *)ps;
135 unsigned int *q = (void *)pd;
136 for (u = 0; u < w; u++) {
137 q[0] = (p[1*328]<<16) + p[0*328];
138 q[1] = (p[3*328]<<16) + p[2*328];
139 p += 1;
140 q -= 2*240/4;
141 }
645ec129 142}