infoprint, FDS moviefix, alignment bugfixing
[fceu.git] / drivers / gp2x / gp2x-video.c
CommitLineData
35868d35 1/* FCE Ultra - NES/Famicom Emulator
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 */
17
18#include <stdio.h>
19#include <string.h>
20#include <sys/time.h>
21
937bf65b 22#include "../../video.h"
23
b2b95d2e 24#include "main.h"
22f08d95 25#include "gp2x.h"
35868d35 26#include "minimal.h"
b2b95d2e 27#include "fonts.h"
989672f4 28#include "asmutils.h"
35868d35 29
35868d35 30static char fps_str[32];
31static int framesEmulated, framesRendered;
32
b2b95d2e 33int gp2x_palette[256];
989672f4 34unsigned short gp2x_palette16[256];
b2b95d2e 35
35868d35 36int paletterefresh;
37
6587f346 38#define FPS_COLOR 1
35868d35 39
40
35868d35 41static void gp2x_text(unsigned char *screen, int x, int y, char *text, int color, int flip)
42{
43 int i,l,slen;
44 slen=strlen(text);
45
46 screen=screen+x+y*320;
47
48 for (i=0;i<slen;i++)
49 {
50 for (l=0;l<8;l++)
51 {
52
53 screen[l*320+0]=(fontdata8x8[((text[i])*8)+l]&0x80)?color:screen[l*320+0];
54 screen[l*320+1]=(fontdata8x8[((text[i])*8)+l]&0x40)?color:screen[l*320+1];
55 screen[l*320+2]=(fontdata8x8[((text[i])*8)+l]&0x20)?color:screen[l*320+2];
56 screen[l*320+3]=(fontdata8x8[((text[i])*8)+l]&0x10)?color:screen[l*320+3];
57 screen[l*320+4]=(fontdata8x8[((text[i])*8)+l]&0x08)?color:screen[l*320+4];
58 screen[l*320+5]=(fontdata8x8[((text[i])*8)+l]&0x04)?color:screen[l*320+5];
59 screen[l*320+6]=(fontdata8x8[((text[i])*8)+l]&0x02)?color:screen[l*320+6];
60 screen[l*320+7]=(fontdata8x8[((text[i])*8)+l]&0x01)?color:screen[l*320+7];
61
62 }
63 screen+=8;
64 }
65}
66
67
68void CleanSurface(void)
69{
70 int c=4;
71 while (c--)
72 {
b2b95d2e 73 memset(gp2x_screen, 0, 320*240);
35868d35 74 gp2x_video_flip();
75 }
b2b95d2e 76 XBuf = gp2x_screen;
35868d35 77}
78
79
80void KillVideo(void)
81{
82}
83
84
85int InitVideo(void)
86{
87 fps_str[0]=0;
88
89 CleanSurface();
90
91 puts("Initialized GP2X VIDEO via minimal");
92
93 srendline=0;
94 erendline=239;
b2b95d2e 95 XBuf = gp2x_screen;
35868d35 96 return 1;
97}
98
99
100void ToggleFS(void)
101{
102}
103
104
989672f4 105// 16: rrrr rggg gggb bbbb
35868d35 106void FCEUD_SetPalette(uint8 index, uint8 r, uint8 g, uint8 b)
107{
b2b95d2e 108 gp2x_palette[index] = (r << 16) | (g << 8) | b;
989672f4 109 gp2x_palette16[index] = ((r & 0xf8) << 8) | ((g & 0xfc) << 3) | (b >> 3);
b2b95d2e 110 gp2x_video_setpalette(gp2x_palette, index + 1);
35868d35 111
112 paletterefresh = 1;
113}
114
115
116void FCEUD_GetPalette(uint8 index, uint8 * r, uint8 * g, uint8 * b)
117{
b2b95d2e 118 int pix = gp2x_palette[index];
119 *r = (uint8) (pix >> 16);
120 *g = (uint8) (pix >> 8);
121 *b = (uint8) pix;
35868d35 122}
123
124
125static INLINE void printFps(uint8 *screen)
126{
127 struct timeval tv_now;
128 static int prevsec, needfpsflip = 0;
129
130 gettimeofday(&tv_now, 0);
131 if (prevsec != tv_now.tv_sec)
132 {
22f08d95 133 sprintf(fps_str, "%2i/%2i", framesRendered, framesEmulated);
35868d35 134 framesEmulated = framesRendered = 0;
135 needfpsflip = 4;
136 prevsec = tv_now.tv_sec;
137 }
138
989672f4 139 if (Settings.scaling == 0)
35868d35 140 {
141 if (needfpsflip)
142 {
143 int y, *destt = (int *) screen;
937bf65b 144 for (y = 20/*240*/; y; y--)
35868d35 145 {
6587f346 146 *destt++ = 0; *destt++ = 0; *destt++ = 0; *destt++ = 0;
147 *destt++ = 0; *destt++ = 0; *destt++ = 0; *destt++ = 0;
937bf65b 148 destt += 64+8;
35868d35 149
937bf65b 150 //*destt++ = 0x3F3F3F3F; *destt++ = 0x3F3F3F3F; *destt++ = 0x3F3F3F3F; *destt++ = 0x3F3F3F3F;
151 //*destt++ = 0x3F3F3F3F; *destt++ = 0x3F3F3F3F; *destt++ = 0x3F3F3F3F; *destt++ = 0x3F3F3F3F;
35868d35 152 }
b547bda7 153 if (Settings.showfps)
35868d35 154 {
92e249b1 155 int sep;
156 for (sep=1; sep < 5; sep++)
157 if (fps_str[sep] == '/' || fps_str[sep] == 0) break;
158 fps_str[sep] = 0;
159 gp2x_text(screen, 0, 0, fps_str, FPS_COLOR, 0);
160 gp2x_text(screen, 0, 10, fps_str+sep+1, FPS_COLOR, 0);
35868d35 161 }
162 needfpsflip--;
163 }
164 }
165 else
166 {
b547bda7 167 if (Settings.showfps)
35868d35 168 {
989672f4 169 gp2x_text(screen+32, 0, 0, fps_str, FPS_COLOR, 0); // TODO: firstline
35868d35 170 }
171 }
172}
173
174
937bf65b 175void BlitScreen(uint8 *buf)
35868d35 176{
35868d35 177 framesEmulated++;
178
937bf65b 179 if (!buf) return;
35868d35 180
181 framesRendered++;
182
b2b95d2e 183 printFps(gp2x_screen);
989672f4 184
185 if (Settings.scaling == 3)
186 soft_scale((char *)gp2x_screen + 32, gp2x_palette16, 0, 240);
187
35868d35 188 gp2x_video_flip();
b2b95d2e 189 XBuf = gp2x_screen;
35868d35 190}
191
192