static int gp2x_old_gamma = 100;\r
static unsigned char *movie_data = NULL;\r
static int movie_size = 0;\r
-static int frame_count = 0;\r
unsigned char *framebuff = 0; // temporary buffer for alt renderer\r
int state_slot = 0;\r
\r
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
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
if(movie_data[0x14] == '6')\r
PicoOpt |= 0x20; // 6 button pad\r
else PicoOpt &= ~0x20;\r
+ PicoOpt |= 0x40; // accurate timing\r
if(movie_data[0xF] >= 'A') {\r
- //Pico.m.pal = movie_data[0x16] >> 7;\r
+ if(movie_data[0x16] & 0x80) {\r
+ PicoRegionOverride = 8;\r
+ } else {\r
+ PicoRegionOverride = 4;\r
+ }\r
+ PicoReset(0);\r
// TODO: bits 6 & 5\r
}\r
- strcpy(noticeMsg, "MOVIE LOADED");\r
+ movie_data[0x18+30] = 0;\r
+ sprintf(noticeMsg, "MOVIE: %s", (char *) &movie_data[0x18]);\r
}\r
else\r
{\r
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
}\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
}\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(¬iceMsgTime, 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
}\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(¬iceMsgTime, 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
\r
events &= ~prevEvents;\r
if (events) RunEvents(events);\r
+ if (movie_data) updateMovie();\r
\r
prevEvents = (allActions[0] | allActions[1]) >> 16;\r
}\r
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
+ #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
+\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; 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(&TGAHEAD, 1, sizeof(TGAHEAD), f);\r
+ fwrite(oldscr, 1, 320*240*2, f);\r
+ fclose(f);\r
+ }\r
+ }\r
+#endif\r
+\r
// check time\r
gettimeofday(&tval, 0);\r
if(thissec != tval.tv_sec) tval.tv_usec+=1000000;\r