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