refactoring for Wiz port; random cleanups
[libpicofe.git] / gp2x / plat.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <stdarg.h>
5
6 #include "gp2x.h"
7 #include "soc.h"
8 #include "../common/plat.h"
9 #include "../common/readpng.h"
10 #include "../common/menu.h"
11 #include "../common/emu.h"
12 #include "../linux/sndout_oss.h"
13
14 /* GP2X local */
15 void *gp2x_screens[4];
16
17 void gp2x_video_changemode(int bpp)
18 {
19         gp2x_video_changemode_ll(bpp);
20
21         gp2x_memset_all_buffers(0, 0, 320*240*2);
22         gp2x_video_flip();
23 }
24
25 static void gp2x_memcpy_buffers(int buffers, void *data, int offset, int len)
26 {
27         char *dst;
28         if (buffers & (1<<0)) { dst = (char *)gp2x_screens[0] + offset; if (dst != data) memcpy(dst, data, len); }
29         if (buffers & (1<<1)) { dst = (char *)gp2x_screens[1] + offset; if (dst != data) memcpy(dst, data, len); }
30         if (buffers & (1<<2)) { dst = (char *)gp2x_screens[2] + offset; if (dst != data) memcpy(dst, data, len); }
31         if (buffers & (1<<3)) { dst = (char *)gp2x_screens[3] + offset; if (dst != data) memcpy(dst, data, len); }
32 }
33
34 void gp2x_memcpy_all_buffers(void *data, int offset, int len)
35 {
36         gp2x_memcpy_buffers(0xf, data, offset, len);
37 }
38
39 void gp2x_memset_all_buffers(int offset, int byte, int len)
40 {
41         memset((char *)gp2x_screens[0] + offset, byte, len);
42         memset((char *)gp2x_screens[1] + offset, byte, len);
43         memset((char *)gp2x_screens[2] + offset, byte, len);
44         memset((char *)gp2x_screens[3] + offset, byte, len);
45 }
46
47 /* common */
48 char cpu_clk_name[16] = "GP2X CPU clocks";
49
50 void plat_video_menu_enter(int is_rom_loaded)
51 {
52         if (is_rom_loaded)
53         {
54                 // darken the active framebuffer
55                 memset(g_screen_ptr, 0, 320*8*2);
56                 menu_darken_bg((char *)g_screen_ptr + 320*8*2, 320*224, 1);
57                 memset((char *)g_screen_ptr + 320*232*2, 0, 320*8*2);
58         }
59         else
60         {
61                 // should really only happen once, on startup..
62                 readpng(g_screen_ptr, "skin/background.png", READPNG_BG);
63         }
64
65         // copy to buffer2
66         gp2x_memcpy_buffers((1<<2), g_screen_ptr, 0, 320*240*2);
67
68         // switch to 16bpp
69         gp2x_video_changemode_ll(16);
70         gp2x_video_RGB_setscaling(0, 320, 240);
71         gp2x_video_flip2();
72 }
73
74 void plat_video_menu_begin(void)
75 {
76         memcpy(g_screen_ptr, gp2x_screens[2], 320*240*2);
77 }
78
79 void plat_video_menu_end(void)
80 {
81         // FIXME
82         // gp2x_video_flush_cache();
83         gp2x_video_flip2();
84 }
85
86 void plat_init(void)
87 {
88         gp2x_soc_t soc;
89
90         soc = soc_detect();
91         switch (soc)
92         {
93         case SOCID_MMSP2:
94                 mmsp2_init();
95                 break;
96         case SOCID_POLLUX:
97                 pollux_init();
98                 strcpy(cpu_clk_name, "Wiz CPU clock");
99                 break;
100         default:
101                 fprintf(stderr, "could not recognize SoC, bailing out.\n");
102                 exit(1);
103         }
104
105         gp2x_memset_all_buffers(0, 0, 320*240*2);
106
107         // snd
108         sndout_oss_init();
109 }
110
111 void plat_finish(void)
112 {
113         switch (gp2x_soc)
114         {
115         case SOCID_MMSP2:
116                 mmsp2_finish();
117                 break;
118         case SOCID_POLLUX:
119                 pollux_finish();
120                 break;
121         }
122
123         gp2x_video_changemode(16);
124         sndout_oss_exit();
125 }
126
127 void lprintf(const char *fmt, ...)
128 {
129         va_list vl;
130
131         va_start(vl, fmt);
132         vprintf(fmt, vl);
133         va_end(vl);
134 }
135