1 /* FCE Ultra - NES/Famicom Emulator
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.
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.
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
22 #include "../../video.h"
24 #include "../common/main.h"
25 #include "../common/settings.h"
27 #include "../libpicofe/fonts.h"
28 #include "../arm/asmutils.h"
30 static char fps_str[32];
31 static int framesEmulated, framesRendered;
33 int gp2x_palette[256];
34 unsigned short gp2x_palette16[256];
43 static void gp2x_text(unsigned char *screen, int x, int y, char *text, int color, int flip)
48 screen=screen+x+y*320;
55 screen[l*320+0]=(fontdata8x8[((text[i])*8)+l]&0x80)?color:0;
56 screen[l*320+1]=(fontdata8x8[((text[i])*8)+l]&0x40)?color:0;
57 screen[l*320+2]=(fontdata8x8[((text[i])*8)+l]&0x20)?color:0;
58 screen[l*320+3]=(fontdata8x8[((text[i])*8)+l]&0x10)?color:0;
59 screen[l*320+4]=(fontdata8x8[((text[i])*8)+l]&0x08)?color:0;
60 screen[l*320+5]=(fontdata8x8[((text[i])*8)+l]&0x04)?color:0;
61 screen[l*320+6]=(fontdata8x8[((text[i])*8)+l]&0x02)?color:0;
62 screen[l*320+7]=(fontdata8x8[((text[i])*8)+l]&0x01)?color:0;
70 void CleanSurface(void)
75 memset32(gp2x_screen, 0, 320*240*2/4);
93 puts("Initialized GP2X VIDEO via minimal");
102 // 16: rrrr rggg gg0b bbbb
103 void FCEUD_SetPalette(uint8 index, uint8 r, uint8 g, uint8 b)
105 /* note: menu depends on bit5 being 0 */
106 gp2x_palette[index] = (r << 16) | (g << 8) | b;
107 gp2x_palette16[index] = ((r & 0xf8) << 8) | ((g & 0xf8) << 3) | (b >> 3);
108 gp2x_video_setpalette(gp2x_palette, index + 1);
114 void FCEUD_GetPalette(uint8 index, uint8 * r, uint8 * g, uint8 * b)
116 int pix = gp2x_palette[index];
117 *r = (uint8) (pix >> 16);
118 *g = (uint8) (pix >> 8);
123 static INLINE void printFps(uint8 *screen)
125 struct timeval tv_now;
126 static int prevsec, needfpsflip = 0;
128 gettimeofday(&tv_now, 0);
129 if (prevsec != tv_now.tv_sec)
131 sprintf(fps_str, "%2i/%2i", framesRendered, framesEmulated);
132 framesEmulated = framesRendered = 0;
134 prevsec = tv_now.tv_sec;
137 if (!Settings.showfps || !screen) return;
139 if (Settings.scaling == 0)
144 for (sep=1; sep < 5; sep++)
145 if (fps_str[sep] == '/' || fps_str[sep] == 0) break;
147 gp2x_text(screen, 0, 0, fps_str, FPS_COLOR, 0);
148 gp2x_text(screen, 0, 10, fps_str+sep+1, FPS_COLOR, 0);
154 gp2x_text(screen+32, 0, srendline, fps_str, FPS_COLOR, 0);
159 void BlitPrepare(int skip)
170 if (eoptions & EO_CLIPSIDES)
172 int i, *p = (int *) ((char *)gp2x_screen + 32);
173 for (i = 240; i; i--, p += 320/4)
175 p[0] = p[1] = p[62] = p[63] = 0;
179 if (Settings.accurate_mode && Settings.scaling < 2)
181 int i, *p = (int *)gp2x_screen + 32/4;
183 for (i = srendline; i > 0; i--, p += 320/4)
184 memset32(p, 0, 256/4);
187 int *p = (int *)gp2x_screen + erendline*320/4 + 32/4;
188 for (i = 239-erendline; i > 0; i--, p += 320/4)
189 memset32(p, 0, 256/4);
193 printFps(gp2x_screen);
195 if (Settings.scaling == 3)
197 soft_scale((char *)gp2x_screen + 32, gp2x_palette16, srendline, erendline-srendline);
199 memset32((int *)((char *)gp2x_screen + 32), 0, srendline*320*2/4);
202 /* at this point we should be done with the frame */
203 gp2x_video_flush_cache();
207 void BlitScreen(int skip)