release r2, update credits
[fceu.git] / drivers / gp2x / gp2x-video.c
index f7f09bd..8f50791 100644 (file)
 
 #include "../../video.h"
 
-#include "gp2x.h"
+#include "../common/main.h"
+#include "../common/settings.h"
 #include "minimal.h"
-
-extern int showfps;
+#include "../libpicofe/fonts.h"
+#include "../arm/asmutils.h"
 
 static char fps_str[32];
 static int framesEmulated, framesRendered;
 
-int scaled_display=0;
+int gp2x_palette[256];
+unsigned short gp2x_palette16[256];
+
 int paletterefresh;
 
-#define FPS_COLOR 61
+extern int eoptions;
 
+#define FPS_COLOR 1
 
-static unsigned char fontdata8x8[] =
-{
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0x3C,0x42,0x99,0xBD,0xBD,0x99,0x42,0x3C,0x3C,0x42,0x81,0x81,0x81,0x81,0x42,0x3C,
-       0xFE,0x82,0x8A,0xD2,0xA2,0x82,0xFE,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x64,0x74,0x7C,0x38,0x00,0x00,
-       0x80,0xC0,0xF0,0xFC,0xF0,0xC0,0x80,0x00,0x01,0x03,0x0F,0x3F,0x0F,0x03,0x01,0x00,
-       0x18,0x3C,0x7E,0x18,0x7E,0x3C,0x18,0x00,0xEE,0xEE,0xEE,0xCC,0x00,0xCC,0xCC,0x00,
-       0x00,0x00,0x30,0x68,0x78,0x30,0x00,0x00,0x00,0x38,0x64,0x74,0x7C,0x38,0x00,0x00,
-       0x3C,0x66,0x7A,0x7A,0x7E,0x7E,0x3C,0x00,0x0E,0x3E,0x3A,0x22,0x26,0x6E,0xE4,0x40,
-       0x18,0x3C,0x7E,0x3C,0x3C,0x3C,0x3C,0x00,0x3C,0x3C,0x3C,0x3C,0x7E,0x3C,0x18,0x00,
-       0x08,0x7C,0x7E,0x7E,0x7C,0x08,0x00,0x00,0x10,0x3E,0x7E,0x7E,0x3E,0x10,0x00,0x00,
-       0x58,0x2A,0xDC,0xC8,0xDC,0x2A,0x58,0x00,0x24,0x66,0xFF,0xFF,0x66,0x24,0x00,0x00,
-       0x00,0x10,0x10,0x38,0x38,0x7C,0xFE,0x00,0xFE,0x7C,0x38,0x38,0x10,0x10,0x00,0x00,
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x18,0x00,0x18,0x18,0x00,
-       0x6C,0x6C,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x7C,0x28,0x7C,0x28,0x00,0x00,
-       0x10,0x38,0x60,0x38,0x0C,0x78,0x10,0x00,0x40,0xA4,0x48,0x10,0x24,0x4A,0x04,0x00,
-       0x18,0x34,0x18,0x3A,0x6C,0x66,0x3A,0x00,0x18,0x18,0x20,0x00,0x00,0x00,0x00,0x00,
-       0x30,0x60,0x60,0x60,0x60,0x60,0x30,0x00,0x0C,0x06,0x06,0x06,0x06,0x06,0x0C,0x00,
-       0x10,0x54,0x38,0x7C,0x38,0x54,0x10,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00,
-       0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,
-       0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x04,0x08,0x10,0x20,0x40,0x00,0x00,
-       0x38,0x4C,0xC6,0xC6,0xC6,0x64,0x38,0x00,0x18,0x38,0x18,0x18,0x18,0x18,0x7E,0x00,
-       0x7C,0xC6,0x0E,0x3C,0x78,0xE0,0xFE,0x00,0x7E,0x0C,0x18,0x3C,0x06,0xC6,0x7C,0x00,
-       0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x0C,0x00,0xFC,0xC0,0xFC,0x06,0x06,0xC6,0x7C,0x00,
-       0x3C,0x60,0xC0,0xFC,0xC6,0xC6,0x7C,0x00,0xFE,0xC6,0x0C,0x18,0x30,0x30,0x30,0x00,
-       0x78,0xC4,0xE4,0x78,0x86,0x86,0x7C,0x00,0x7C,0xC6,0xC6,0x7E,0x06,0x0C,0x78,0x00,
-       0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x18,0x18,0x30,
-       0x1C,0x38,0x70,0xE0,0x70,0x38,0x1C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00,
-       0x70,0x38,0x1C,0x0E,0x1C,0x38,0x70,0x00,0x7C,0xC6,0xC6,0x1C,0x18,0x00,0x18,0x00,
-       0x3C,0x42,0x99,0xA1,0xA5,0x99,0x42,0x3C,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0x00,
-       0xFC,0xC6,0xC6,0xFC,0xC6,0xC6,0xFC,0x00,0x3C,0x66,0xC0,0xC0,0xC0,0x66,0x3C,0x00,
-       0xF8,0xCC,0xC6,0xC6,0xC6,0xCC,0xF8,0x00,0xFE,0xC0,0xC0,0xFC,0xC0,0xC0,0xFE,0x00,
-       0xFE,0xC0,0xC0,0xFC,0xC0,0xC0,0xC0,0x00,0x3E,0x60,0xC0,0xCE,0xC6,0x66,0x3E,0x00,
-       0xC6,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0x00,0x7E,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,
-       0x06,0x06,0x06,0x06,0xC6,0xC6,0x7C,0x00,0xC6,0xCC,0xD8,0xF0,0xF8,0xDC,0xCE,0x00,
-       0x60,0x60,0x60,0x60,0x60,0x60,0x7E,0x00,0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0x00,
-       0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,
-       0xFC,0xC6,0xC6,0xC6,0xFC,0xC0,0xC0,0x00,0x7C,0xC6,0xC6,0xC6,0xDE,0xCC,0x7A,0x00,
-       0xFC,0xC6,0xC6,0xCE,0xF8,0xDC,0xCE,0x00,0x78,0xCC,0xC0,0x7C,0x06,0xC6,0x7C,0x00,
-       0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,
-       0xC6,0xC6,0xC6,0xEE,0x7C,0x38,0x10,0x00,0xC6,0xC6,0xD6,0xFE,0xFE,0xEE,0xC6,0x00,
-       0xC6,0xEE,0x3C,0x38,0x7C,0xEE,0xC6,0x00,0x66,0x66,0x66,0x3C,0x18,0x18,0x18,0x00,
-       0xFE,0x0E,0x1C,0x38,0x70,0xE0,0xFE,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00,
-       0x60,0x60,0x30,0x18,0x0C,0x06,0x06,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00,
-       0x18,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
-       0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x06,0x3E,0x66,0x66,0x3C,0x00,
-       0x60,0x7C,0x66,0x66,0x66,0x66,0x7C,0x00,0x00,0x3C,0x66,0x60,0x60,0x66,0x3C,0x00,
-       0x06,0x3E,0x66,0x66,0x66,0x66,0x3E,0x00,0x00,0x3C,0x66,0x66,0x7E,0x60,0x3C,0x00,
-       0x1C,0x30,0x78,0x30,0x30,0x30,0x30,0x00,0x00,0x3E,0x66,0x66,0x66,0x3E,0x06,0x3C,
-       0x60,0x7C,0x76,0x66,0x66,0x66,0x66,0x00,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x00,
-       0x0C,0x00,0x1C,0x0C,0x0C,0x0C,0x0C,0x38,0x60,0x60,0x66,0x6C,0x78,0x6C,0x66,0x00,
-       0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0xEC,0xFE,0xFE,0xFE,0xD6,0xC6,0x00,
-       0x00,0x7C,0x76,0x66,0x66,0x66,0x66,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x3C,0x00,
-       0x00,0x7C,0x66,0x66,0x66,0x7C,0x60,0x60,0x00,0x3E,0x66,0x66,0x66,0x3E,0x06,0x06,
-       0x00,0x7E,0x70,0x60,0x60,0x60,0x60,0x00,0x00,0x3C,0x60,0x3C,0x06,0x66,0x3C,0x00,
-       0x30,0x78,0x30,0x30,0x30,0x30,0x1C,0x00,0x00,0x66,0x66,0x66,0x66,0x6E,0x3E,0x00,
-       0x00,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0xC6,0xD6,0xFE,0xFE,0x7C,0x6C,0x00,
-       0x00,0x66,0x3C,0x18,0x3C,0x66,0x66,0x00,0x00,0x66,0x66,0x66,0x66,0x3E,0x06,0x3C,
-       0x00,0x7E,0x0C,0x18,0x30,0x60,0x7E,0x00,0x0E,0x18,0x0C,0x38,0x0C,0x18,0x0E,0x00,
-       0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x00,0x70,0x18,0x30,0x1C,0x30,0x18,0x70,0x00,
-       0x00,0x00,0x76,0xDC,0x00,0x00,0x00,0x00,0x10,0x28,0x10,0x54,0xAA,0x44,0x00,0x00,
-};
 
 static void gp2x_text(unsigned char *screen, int x, int y, char *text, int color, int flip)
 {
@@ -115,14 +52,14 @@ static void gp2x_text(unsigned char *screen, int x, int y, char *text, int color
                for (l=0;l<8;l++)
                 {
 
-                       screen[l*320+0]=(fontdata8x8[((text[i])*8)+l]&0x80)?color:screen[l*320+0];
-                       screen[l*320+1]=(fontdata8x8[((text[i])*8)+l]&0x40)?color:screen[l*320+1];
-                       screen[l*320+2]=(fontdata8x8[((text[i])*8)+l]&0x20)?color:screen[l*320+2];
-                       screen[l*320+3]=(fontdata8x8[((text[i])*8)+l]&0x10)?color:screen[l*320+3];
-                       screen[l*320+4]=(fontdata8x8[((text[i])*8)+l]&0x08)?color:screen[l*320+4];
-                       screen[l*320+5]=(fontdata8x8[((text[i])*8)+l]&0x04)?color:screen[l*320+5];
-                       screen[l*320+6]=(fontdata8x8[((text[i])*8)+l]&0x02)?color:screen[l*320+6];
-                       screen[l*320+7]=(fontdata8x8[((text[i])*8)+l]&0x01)?color:screen[l*320+7];
+                       screen[l*320+0]=(fontdata8x8[((text[i])*8)+l]&0x80)?color:0;
+                       screen[l*320+1]=(fontdata8x8[((text[i])*8)+l]&0x40)?color:0;
+                       screen[l*320+2]=(fontdata8x8[((text[i])*8)+l]&0x20)?color:0;
+                       screen[l*320+3]=(fontdata8x8[((text[i])*8)+l]&0x10)?color:0;
+                       screen[l*320+4]=(fontdata8x8[((text[i])*8)+l]&0x08)?color:0;
+                       screen[l*320+5]=(fontdata8x8[((text[i])*8)+l]&0x04)?color:0;
+                       screen[l*320+6]=(fontdata8x8[((text[i])*8)+l]&0x02)?color:0;
+                       screen[l*320+7]=(fontdata8x8[((text[i])*8)+l]&0x01)?color:0;
 
                }
                screen+=8;
@@ -135,10 +72,10 @@ void CleanSurface(void)
        int c=4;
        while (c--)
        {
-               memset (gp2x_screen8, 0x80, 320*240);
+               memset32(gp2x_screen, 0, 320*240*2/4);
                gp2x_video_flip();
        }
-       XBuf = gp2x_screen8;
+       XBuf = gp2x_screen;
 }
 
 
@@ -157,20 +94,18 @@ int InitVideo(void)
 
        srendline=0;
        erendline=239;
-       XBuf = gp2x_screen8; // TODO: use mmuhacked upper mem
+       XBuf = gp2x_screen;
        return 1;
 }
 
 
-void ToggleFS(void)
-{
-}
-
-
+// 16: rrrr rggg gg0b bbbb
 void FCEUD_SetPalette(uint8 index, uint8 r, uint8 g, uint8 b)
 {
-       gp2x_video_color8(index, r, g, b);
-       gp2x_video_setpalette();
+       /* note: menu depends on bit5 being 0 */
+       gp2x_palette[index] = (r << 16) | (g << 8) | b;
+       gp2x_palette16[index] = ((r & 0xf8) << 8) | ((g & 0xf8) << 3) | (b >> 3);
+       gp2x_video_setpalette(gp2x_palette, index + 1);
 
        paletterefresh = 1;
 }
@@ -178,9 +113,10 @@ void FCEUD_SetPalette(uint8 index, uint8 r, uint8 g, uint8 b)
 
 void FCEUD_GetPalette(uint8 index, uint8 * r, uint8 * g, uint8 * b)
 {
-       *r = (uint8) gp2x_palette[(index << 1) + 1];
-       *g = (uint8) (gp2x_palette[(index << 1) + 0] >> 8);
-       *b = (uint8) gp2x_palette[(index << 1) + 0];
+       int pix = gp2x_palette[index];
+       *r = (uint8) (pix >> 16);
+       *g = (uint8) (pix >> 8);
+       *b = (uint8)  pix;
 }
 
 
@@ -198,53 +134,83 @@ static INLINE void printFps(uint8 *screen)
                prevsec = tv_now.tv_sec;
        }
 
-       if (!scaled_display)
+       if (!Settings.showfps || !screen) return;
+
+       if (Settings.scaling == 0)
        {
                if (needfpsflip)
                {
-                       int y, *destt = (int *) screen;
-                       for (y = 20/*240*/; y; y--)
-                       {
-                               *destt++ = 0x3F3F3F3F; *destt++ = 0x3F3F3F3F; *destt++ = 0x3F3F3F3F; *destt++ = 0x3F3F3F3F;
-                               *destt++ = 0x3F3F3F3F; *destt++ = 0x3F3F3F3F; *destt++ = 0x3F3F3F3F; *destt++ = 0x3F3F3F3F;
-                               destt += 64+8;
-
-                               //*destt++ = 0x3F3F3F3F; *destt++ = 0x3F3F3F3F; *destt++ = 0x3F3F3F3F; *destt++ = 0x3F3F3F3F;
-                               //*destt++ = 0x3F3F3F3F; *destt++ = 0x3F3F3F3F; *destt++ = 0x3F3F3F3F; *destt++ = 0x3F3F3F3F;
-                       }
-                       if (showfps)
-                       {
-                               int sep;
-                               for (sep=1; sep < 5; sep++)
-                                       if (fps_str[sep] == '/' || fps_str[sep] == 0) break;
-                               fps_str[sep] = 0;
-                               gp2x_text(screen, 0,  0, fps_str,       FPS_COLOR, 0);
-                               gp2x_text(screen, 0, 10, fps_str+sep+1, FPS_COLOR, 0);
-                       }
+                       int sep;
+                       for (sep=1; sep < 5; sep++)
+                               if (fps_str[sep] == '/' || fps_str[sep] == 0) break;
+                       fps_str[sep] = 0;
+                       gp2x_text(screen, 0,  0, fps_str,       FPS_COLOR, 0);
+                       gp2x_text(screen, 0, 10, fps_str+sep+1, FPS_COLOR, 0);
                        needfpsflip--;
                }
        }
        else
        {
-               if (showfps)
-               {
-                       gp2x_text(screen+32, 0, 0, fps_str, FPS_COLOR, 0);
-               }
+               gp2x_text(screen+32, 0, srendline, fps_str, FPS_COLOR, 0);
        }
 }
 
 
-void BlitScreen(uint8 *buf)
+void BlitPrepare(int skip)
 {
        framesEmulated++;
 
-       if (!buf) return;
+       if (skip) {
+               printFps(0);
+               return;
+       }
 
        framesRendered++;
 
-       printFps(gp2x_screen8);
-       gp2x_video_flip();
-       XBuf = gp2x_screen8;
+       if (eoptions & EO_CLIPSIDES)
+       {
+               int i, *p = (int *) ((char *)gp2x_screen + 32);
+               for (i = 240; i; i--, p += 320/4)
+               {
+                       p[0] = p[1] = p[62] = p[63] = 0;
+               }
+       }
+
+       if (Settings.accurate_mode && Settings.scaling < 2)
+       {
+               int i, *p = (int *)gp2x_screen + 32/4;
+               if (srendline > 0)
+                       for (i = srendline; i > 0; i--, p += 320/4)
+                               memset32(p, 0, 256/4);
+               if (erendline < 239)
+               {
+                       int *p = (int *)gp2x_screen + erendline*320/4 + 32/4;
+                       for (i = 239-erendline; i > 0; i--, p += 320/4)
+                               memset32(p, 0, 256/4);
+               }
+       }
+
+       printFps(gp2x_screen);
+
+       if (Settings.scaling == 3)
+       {
+               soft_scale((char *)gp2x_screen + 32, gp2x_palette16, srendline, erendline-srendline);
+               if (srendline)
+                       memset32((int *)((char *)gp2x_screen + 32), 0, srendline*320*2/4);
+       }
+
+       /* at this point we should be done with the frame */
+       gp2x_video_flush_cache();
+}
+
+
+void BlitScreen(int skip)
+{
+       if (!skip)
+       {
+               gp2x_video_flip();
+               XBuf = gp2x_screen;
+       }
 }