additional movie tweaking
[picodrive.git] / platform / gp2x / emu.c
index 14eadeb..6e0021b 100644 (file)
@@ -55,7 +55,6 @@ static int combo_keys = 0, combo_acts = 0;    // keys and actions which need button
 static int gp2x_old_gamma = 100;\r
 static unsigned char *movie_data = NULL;\r
 static int movie_size = 0;\r
-int frame_count = 0;\r
 unsigned char *framebuff = 0;  // temporary buffer for alt renderer\r
 int state_slot = 0;\r
 \r
@@ -96,21 +95,28 @@ static int try_rfn_ext(char *ext)
        return 0;\r
 }\r
 \r
+static void get_ext(char *ext)\r
+{\r
+       char *p;\r
+\r
+       p = romFileName + strlen(romFileName) - 4;\r
+       if (p < romFileName) p = romFileName;\r
+       strncpy(ext, p, 4);\r
+       ext[4] = 0;\r
+       strlwr(ext);\r
+}\r
+\r
 int emu_ReloadRom(void)\r
 {\r
        unsigned int rom_size = 0;\r
-       char ext[5], *p;\r
+       char ext[5];\r
        FILE *rom;\r
        int ret;\r
 \r
        printf("emu_ReloadRom(%s)\n", romFileName);\r
 \r
-       // detect wrong extensions (.srm and .mds)\r
-       p = romFileName + strlen(romFileName) - 4;\r
-       if (p < romFileName) p = romFileName;\r
-       strncpy(ext, p, 4);\r
-       ext[4] = 0;\r
-       strlwr(ext);\r
+       // detect wrong extensions\r
+       get_ext(ext);\r
 \r
        if(!strcmp(ext, ".srm") || !strcmp(ext, "s.gz") || !strcmp(ext, ".mds")) { // s.gz ~ .mds.gz\r
                sprintf(menuErrorMsg, "Not a ROM selected.");\r
@@ -156,6 +162,7 @@ int emu_ReloadRom(void)
                        sprintf(menuErrorMsg, "Could't find a ROM for movie.");\r
                        return 0;\r
                }\r
+               get_ext(ext);\r
        }\r
 \r
        rom = fopen(romFileName, "rb");\r
@@ -246,7 +253,7 @@ int emu_ReloadRom(void)
        if(currentConfig.EmuOpt & 1)\r
                emu_SaveLoadGame(1, 1);\r
 \r
-       frame_count = 0;\r
+       Pico.m.frame_count = 0;\r
 \r
        return 1;\r
 }\r
@@ -616,6 +623,8 @@ static void RunEvents(unsigned int which)
                }\r
                if (do_it) {\r
                        blit("", (which & 0x1000) ? "LOADING GAME" : "SAVING GAME");\r
+                       if(movie_data) {\r
+                       }\r
                        emu_SaveLoadGame(which & 0x1000, 0);\r
                }\r
 \r
@@ -655,6 +664,35 @@ static void RunEvents(unsigned int which)
 }\r
 \r
 \r
+static void updateMovie(void)\r
+{\r
+       int offs = Pico.m.frame_count*3 + 0x40;\r
+       if (offs+3 > movie_size) {\r
+               free(movie_data);\r
+               movie_data = 0;\r
+               strcpy(noticeMsg, "END OF MOVIE.");\r
+               printf("END OF MOVIE.\n");\r
+               gettimeofday(&noticeMsgTime, 0);\r
+       } else {\r
+               // MXYZ SACB RLDU\r
+               PicoPad[0] = ~movie_data[offs]   & 0x8f; // ! SCBA RLDU\r
+               if(!(movie_data[offs]   & 0x10)) PicoPad[0] |= 0x40; // A\r
+               if(!(movie_data[offs]   & 0x20)) PicoPad[0] |= 0x10; // B\r
+               if(!(movie_data[offs]   & 0x40)) PicoPad[0] |= 0x20; // A\r
+               PicoPad[1] = ~movie_data[offs+1] & 0x8f; // ! SCBA RLDU\r
+               if(!(movie_data[offs+1] & 0x10)) PicoPad[1] |= 0x40; // A\r
+               if(!(movie_data[offs+1] & 0x20)) PicoPad[1] |= 0x10; // B\r
+               if(!(movie_data[offs+1] & 0x40)) PicoPad[1] |= 0x20; // A\r
+               PicoPad[0] |= (~movie_data[offs+2] & 0x0A) << 8; // ! MZYX\r
+               if(!(movie_data[offs+2] & 0x01)) PicoPad[0] |= 0x0400; // X\r
+               if(!(movie_data[offs+2] & 0x04)) PicoPad[0] |= 0x0100; // Z\r
+               PicoPad[1] |= (~movie_data[offs+2] & 0xA0) << 4; // ! MZYX\r
+               if(!(movie_data[offs+2] & 0x10)) PicoPad[1] |= 0x0400; // X\r
+               if(!(movie_data[offs+2] & 0x40)) PicoPad[1] |= 0x0100; // Z\r
+       }\r
+}\r
+\r
+\r
 static void updateKeys(void)\r
 {\r
        unsigned long keys, allActions[2] = { 0, 0 }, events;\r
@@ -711,41 +749,8 @@ static void updateKeys(void)
                }\r
        }\r
 \r
-       if(movie_data)\r
-       {\r
-               int offs = frame_count*3 + 0x40;\r
-               if (offs+3 > movie_size) {\r
-                       free(movie_data);\r
-                       movie_data = 0;\r
-                       strcpy(noticeMsg, "END OF MOVIE.");\r
-                       printf("END OF MOVIE.\n");\r
-                       gettimeofday(&noticeMsgTime, 0);\r
-               } else {\r
-                       // MXYZ SACB RLDU\r
-                       PicoPad[0] = ~movie_data[offs]   & 0x8f; // ! SCBA RLDU\r
-                       if(!(movie_data[offs]   & 0x10)) PicoPad[0] |= 0x40; // A\r
-                       if(!(movie_data[offs]   & 0x20)) PicoPad[0] |= 0x10; // B\r
-                       if(!(movie_data[offs]   & 0x40)) PicoPad[0] |= 0x20; // A\r
-                       PicoPad[1] = ~movie_data[offs+1] & 0x8f; // ! SCBA RLDU\r
-                       if(!(movie_data[offs+1] & 0x10)) PicoPad[1] |= 0x40; // A\r
-                       if(!(movie_data[offs+1] & 0x20)) PicoPad[1] |= 0x10; // B\r
-                       if(!(movie_data[offs+1] & 0x40)) PicoPad[1] |= 0x20; // A\r
-                       PicoPad[0] |= (~movie_data[offs+2] & 0x0A) << 8; // ! MZYX\r
-                       if(!(movie_data[offs+2] & 0x01)) PicoPad[0] |= 0x0400; // X\r
-                       if(!(movie_data[offs+2] & 0x04)) PicoPad[0] |= 0x0100; // Z\r
-                       PicoPad[1] |= (~movie_data[offs+2] & 0xA0) << 4; // ! MZYX\r
-                       if(!(movie_data[offs+2] & 0x10)) PicoPad[1] |= 0x0400; // X\r
-                       if(!(movie_data[offs+2] & 0x40)) PicoPad[1] |= 0x0100; // Z\r
-                       if ((PicoPad[0] & 0x80) || (PicoPad[1] & 0x80))\r
-                               printf("%d: start\n", frame_count);\r
-               }\r
-       }\r
-       else\r
-       {\r
-               PicoPad[0] = (unsigned short) allActions[0];\r
-               PicoPad[1] = (unsigned short) allActions[1];\r
-       }\r
-       frame_count++;\r
+       PicoPad[0] = (unsigned short) allActions[0];\r
+       PicoPad[1] = (unsigned short) allActions[1];\r
 \r
        events = (allActions[0] | allActions[1]) >> 16;\r
 \r
@@ -765,6 +770,7 @@ static void updateKeys(void)
 \r
        events &= ~prevEvents;\r
        if (events) RunEvents(events);\r
+       if (movie_data) updateMovie();\r
 \r
        prevEvents = (allActions[0] | allActions[1]) >> 16;\r
 }\r
@@ -995,21 +1001,59 @@ void emu_Loop(void)
                updateKeys();\r
                PicoFrame();\r
 \r
+#if 0\r
+if (Pico.m.frame_count == 31563) {\r
+       FILE *f;\r
+       f = fopen("ram_p.bin", "wb");\r
+       if (!f) { printf("!f\n"); exit(1); }\r
+       fwrite(Pico.ram, 1, 0x10000, f);\r
+       fclose(f);\r
+       exit(0);\r
+}\r
+#endif\r
 #if 0\r
                // debug\r
                {\r
-                       static unsigned char oldscr[320*240*2];\r
+                       #define BYTE unsigned char\r
+                       #define WORD unsigned short\r
+                       struct\r
+                       {\r
+                               BYTE IDLength;        /* 00h  Size of Image ID field */\r
+                               BYTE ColorMapType;    /* 01h  Color map type */\r
+                               BYTE ImageType;       /* 02h  Image type code */\r
+                               WORD CMapStart;       /* 03h  Color map origin */\r
+                               WORD CMapLength;      /* 05h  Color map length */\r
+                               BYTE CMapDepth;       /* 07h  Depth of color map entries */\r
+                               WORD XOffset;         /* 08h  X origin of image */\r
+                               WORD YOffset;         /* 0Ah  Y origin of image */\r
+                               WORD Width;           /* 0Ch  Width of image */\r
+                               WORD Height;          /* 0Eh  Height of image */\r
+                               BYTE PixelDepth;      /* 10h  Image pixel size */\r
+                               BYTE ImageDescriptor; /* 11h  Image descriptor byte */\r
+                       } __attribute__((packed)) TGAHEAD;\r
+                       static unsigned short oldscr[320*240];\r
                        FILE *f; char name[128]; int i;\r
-                       for (i = 0; i < 320*240*2; i++)\r
-                               if(oldscr[i] != ((unsigned char *)gp2x_screen)[i]) break;\r
-                       if (i < 320*240*2)\r
+\r
+                       memset(&TGAHEAD, 0, sizeof(TGAHEAD));\r
+                       TGAHEAD.ImageType = 2;\r
+                       TGAHEAD.Width = 320;\r
+                       TGAHEAD.Height = 240;\r
+                       TGAHEAD.PixelDepth = 16;\r
+                       TGAHEAD.ImageDescriptor = 2<<4; // image starts at top-left\r
+\r
+                       #define CONV(X) (((X>>1)&0x7fe0)|(X&0x1f)) // 555?\r
+\r
+                       for (i = 0; i < 320*240; i++)\r
+                               if(oldscr[i] != CONV(((unsigned short *)gp2x_screen)[i])) break;\r
+                       if (i < 320*240)\r
                        {\r
-                               for (i = 0; i < 320*240*2; i++)\r
-                                       oldscr[i] = ((unsigned char *)gp2x_screen)[i];\r
-                               sprintf(name, "%05i.raw", frame_count);\r
+                               for (i = 0; i < 320*240; i++)\r
+                                       oldscr[i] = CONV(((unsigned short *)gp2x_screen)[i]);\r
+                               sprintf(name, "%05i.tga", Pico.m.frame_count);\r
                                f = fopen(name, "wb");\r
                                if (!f) { printf("!f\n"); exit(1); }\r
-                               fwrite(gp2x_screen, 1, 320*240*2, f);\r
+                               fwrite(&TGAHEAD, 1, sizeof(TGAHEAD), f);\r
+                               fwrite(oldscr, 1, 320*240*2, f);\r
                                fclose(f);\r
                        }\r
                }\r