X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=gp2x%2Femu.c;h=92a18315fd2cc42dc1333040f866053b696b563d;hb=84e21f25e41b90d9729088dba5991a84330964ea;hp=bd4253d3455443d918ac4d5569a2c3896a956cc7;hpb=0ae25549b5066ea8b42216ec875f5c3c5d5bd8d6;p=libpicofe.git diff --git a/gp2x/emu.c b/gp2x/emu.c index bd4253d..92a1831 100644 --- a/gp2x/emu.c +++ b/gp2x/emu.c @@ -48,12 +48,15 @@ extern int crashed_940; static short __attribute__((aligned(4))) sndBuffer[2*44100/50]; static struct timeval noticeMsgTime = { 0, 0 }; // when started showing static int osd_fps_x; -static int combo_keys = 0, combo_acts = 0; // keys and actions which need button combos static int gp2x_old_gamma = 100; char noticeMsg[64]; // notice msg to draw unsigned char *PicoDraw2FB = NULL; // temporary buffer for alt renderer int reset_timing = 0; +#define PICO_PEN_ADJUST_X 4 +#define PICO_PEN_ADJUST_Y 2 +static int pico_pen_x = 320/2, pico_pen_y = 240/2, pico_inp_mode = 0; + static void emu_msg_cb(const char *msg); static void emu_msg_tray_open(void); @@ -98,48 +101,6 @@ void emu_Init(void) } -static void find_combos(void) -{ - int act, u; - - // find out which keys and actions are combos - combo_keys = combo_acts = 0; - for (act = 0; act < 32; act++) - { - int keyc = 0, keyc2 = 0; - if (act == 16 || act == 17) continue; // player2 flag - if (act > 17) - { - for (u = 0; u < 32; u++) - if (currentConfig.KeyBinds[u] & (1 << act)) keyc++; - } - else - { - for (u = 0; u < 32; u++) - if ((currentConfig.KeyBinds[u] & 0x30000) == 0 && // pl. 1 - (currentConfig.KeyBinds[u] & (1 << act))) keyc++; - for (u = 0; u < 32; u++) - if ((currentConfig.KeyBinds[u] & 0x30000) == 1 && // pl. 2 - (currentConfig.KeyBinds[u] & (1 << act))) keyc2++; - if (keyc2 > keyc) keyc = keyc2; - } - if (keyc > 1) - { - // loop again and mark those keys and actions as combo - for (u = 0; u < 32; u++) - { - if (currentConfig.KeyBinds[u] & (1 << act)) { - combo_keys |= 1 << u; - combo_acts |= 1 << act; - } - } - } - } - - // printf("combo keys/acts: %08x %08x\n", combo_keys, combo_acts); -} - - static void scaling_update(void) { PicoOpt &= ~0x4100; @@ -179,13 +140,12 @@ void emu_Deinit(void) void emu_prepareDefaultConfig(void) { memset(&defaultConfig, 0, sizeof(defaultConfig)); - defaultConfig.lastRomFile[0] = 0; - defaultConfig.EmuOpt = 0x1f | 0x600; // | confirm_save, cd_leds - defaultConfig.s_PicoOpt = 0x0f | 0xe00; // | use_940, cd_pcm, cd_cdda + defaultConfig.EmuOpt = 0x1d | 0x00700; // | <- ram_tmng, confirm_save, cd_leds + defaultConfig.s_PicoOpt = 0x0f | POPT_EXT_FM|POPT_EN_MCD_PCM|POPT_EN_MCD_CDDA|POPT_EN_SVP_DRC|POPT_ACC_SPRITES; defaultConfig.s_PsndRate = 44100; defaultConfig.s_PicoRegion = 0; // auto defaultConfig.s_PicoAutoRgnOrder = 0x184; // US, EU, JP - defaultConfig.s_PicoCDBuffers = 64; + defaultConfig.s_PicoCDBuffers = 0; defaultConfig.Frameskip = -1; // auto defaultConfig.CPUclock = 200; defaultConfig.volume = 50; @@ -241,7 +201,7 @@ void osd_text(int x, int y, const char *text) } } -static void cd_leds(void) +static void draw_cd_leds(void) { // static int old_reg; @@ -269,18 +229,37 @@ static void cd_leds(void) } } -static int EmuScan16(unsigned int num, void *sdata) +static void draw_pico_ptr(void) +{ + unsigned short *p = (unsigned short *)gp2x_screen; + + // only if pen enabled and for 16bit modes + if (pico_inp_mode == 0 || (PicoOpt&0x10) || !(currentConfig.EmuOpt&0x80)) return; + + if (!(Pico.video.reg[12]&1) && !(PicoOpt&POPT_DIS_32C_BORDER)) + p += 32; + + p += 320 * (pico_pen_y + PICO_PEN_ADJUST_Y); + p += pico_pen_x + PICO_PEN_ADJUST_X; + p[0] ^= 0xffff; + p[319] ^= 0xffff; + p[320] ^= 0xffff; + p[321] ^= 0xffff; + p[640] ^= 0xffff; +} + +static int EmuScanBegin16(unsigned int num) { if (!(Pico.video.reg[1]&8)) num += 8; - DrawLineDest = (unsigned short *) gp2x_screen + 320*(num+1); + DrawLineDest = (unsigned short *) gp2x_screen + 320 * num; return 0; } -static int EmuScan8(unsigned int num, void *sdata) +static int EmuScanBegin8(unsigned int num) { if (!(Pico.video.reg[1]&8)) num += 8; - DrawLineDest = (unsigned char *) gp2x_screen + 320*(num+1); + DrawLineDest = (unsigned char *) gp2x_screen + 320 * num; return 0; } @@ -310,27 +289,41 @@ static void blit(const char *fps, const char *notice) else if (!(emu_opt&0x80)) { // 8bit accurate renderer - if (Pico.m.dirtyPal) { + if (Pico.m.dirtyPal) + { + int pallen = 0x40; Pico.m.dirtyPal = 0; - if(Pico.video.reg[0xC]&8) { // shadow/hilight mode + if (Pico.video.reg[0xC]&8) // shadow/hilight mode + { vidConvCpyRGB32(localPal, Pico.cram, 0x40); vidConvCpyRGB32sh(localPal+0x40, Pico.cram, 0x40); vidConvCpyRGB32hi(localPal+0x80, Pico.cram, 0x40); - blockcpy(localPal+0xc0, localPal+0x40, 0x40*4); - localPal[0xc0] = 0x0000c000; - localPal[0xd0] = 0x00c00000; - localPal[0xe0] = 0x00000000; // reserved pixels for OSD - localPal[0xf0] = 0x00ffffff; - gp2x_video_setpalette(localPal, 0x100); - } else if (rendstatus & 0x20) { // mid-frame palette changes + memcpy32(localPal+0xc0, localPal+0x40, 0x40); + pallen = 0x100; + } + else if (rendstatus & PDRAW_ACC_SPRITES) { + vidConvCpyRGB32(localPal, Pico.cram, 0x40); + memcpy32(localPal+0x40, localPal, 0x40); + memcpy32(localPal+0x80, localPal, 0x40); + memcpy32(localPal+0xc0, localPal, 0x40); + pallen = 0x100; + } + else if (rendstatus & PDRAW_SONIC_MODE) { // mid-frame palette changes vidConvCpyRGB32(localPal, Pico.cram, 0x40); vidConvCpyRGB32(localPal+0x40, HighPal, 0x40); vidConvCpyRGB32(localPal+0x80, HighPal+0x40, 0x40); - gp2x_video_setpalette(localPal, 0xc0); - } else { + pallen = 0xc0; + } + else { vidConvCpyRGB32(localPal, Pico.cram, 0x40); - gp2x_video_setpalette(localPal, 0x40); } + if (pallen > 0xc0) { + localPal[0xc0] = 0x0000c000; + localPal[0xd0] = 0x00c00000; + localPal[0xe0] = 0x00000000; // reserved pixels for OSD + localPal[0xf0] = 0x00ffffff; + } + gp2x_video_setpalette(localPal, pallen); } } @@ -341,8 +334,10 @@ static void blit(const char *fps, const char *notice) if (emu_opt & 2) osd_text(osd_fps_x, h, fps); } - if ((emu_opt & 0x400) && (PicoMCD & 1)) - cd_leds(); + if ((emu_opt & 0x400) && (PicoAHW & PAHW_MCD)) + draw_cd_leds(); + if (PicoAHW & PAHW_PICO) + draw_pico_ptr(); //gp2x_video_wait_vsync(); gp2x_video_flip(); @@ -383,13 +378,11 @@ static void vidResetMode(void) } else if (currentConfig.EmuOpt&0x80) { gp2x_video_changemode(16); PicoDrawSetColorFormat(1); - PicoScan = EmuScan16; - PicoScan(0, 0); + PicoScanBegin = EmuScanBegin16; } else { gp2x_video_changemode(8); PicoDrawSetColorFormat(2); - PicoScan = EmuScan8; - PicoScan(0, 0); + PicoScanBegin = EmuScanBegin8; } if ((PicoOpt&0x10)||!(currentConfig.EmuOpt&0x80)) { // setup pal for 8-bit modes @@ -441,6 +434,50 @@ static void emu_msg_tray_open(void) gettimeofday(¬iceMsgTime, 0); } +static void RunEventsPico(unsigned int events, unsigned int gp2x_keys) +{ + if (events & (1 << 3)) { + pico_inp_mode++; + if (pico_inp_mode > 2) pico_inp_mode = 0; + switch (pico_inp_mode) { + case 2: strcpy(noticeMsg, "Input: Pen on Pad "); break; + case 1: strcpy(noticeMsg, "Input: Pen on Storyware"); break; + case 0: strcpy(noticeMsg, "Input: Joytick "); + PicoPicohw.pen_pos[0] = PicoPicohw.pen_pos[1] = 0x8000; + break; + } + gettimeofday(¬iceMsgTime, 0); + } + if (events & (1 << 4)) { + PicoPicohw.page--; + if (PicoPicohw.page < 0) PicoPicohw.page = 0; + sprintf(noticeMsg, "Page %i ", PicoPicohw.page); + gettimeofday(¬iceMsgTime, 0); + } + if (events & (1 << 5)) { + PicoPicohw.page++; + if (PicoPicohw.page > 6) PicoPicohw.page = 6; + sprintf(noticeMsg, "Page %i ", PicoPicohw.page); + gettimeofday(¬iceMsgTime, 0); + } + if (pico_inp_mode != 0) { + PicoPad[0] &= ~0x0f; // release UDLR + if (gp2x_keys & GP2X_UP) { pico_pen_y--; if (pico_pen_y < 0) pico_pen_y = 0; } + if (gp2x_keys & GP2X_DOWN) { pico_pen_y++; if (pico_pen_y > 239-PICO_PEN_ADJUST_Y) pico_pen_y = 239-PICO_PEN_ADJUST_Y; } + if (gp2x_keys & GP2X_LEFT) { pico_pen_x--; if (pico_pen_x < 0) pico_pen_x = 0; } + if (gp2x_keys & GP2X_RIGHT) { + int lim = (Pico.video.reg[12]&1) ? 319 : 255; + pico_pen_x++; + if (pico_pen_x > lim-PICO_PEN_ADJUST_X) + pico_pen_x = lim-PICO_PEN_ADJUST_X; + } + PicoPicohw.pen_pos[0] = pico_pen_x; + if (!(Pico.video.reg[12]&1)) PicoPicohw.pen_pos[0] += pico_pen_x/4; + PicoPicohw.pen_pos[0] += 0x3c; + PicoPicohw.pen_pos[1] = pico_inp_mode == 1 ? (0x2f8 + pico_pen_y) : (0x1fc + pico_pen_y); + } +} + static void update_volume(int has_changed, int is_up) { static int prev_frame = 0, wait_frames = 0; @@ -510,9 +547,11 @@ static void RunEvents(unsigned int which) (!(which & 0x1000) && (currentConfig.EmuOpt & 0x200))) ) { // save unsigned long keys; blit("", (which & 0x1000) ? "LOAD STATE? (Y=yes, X=no)" : "OVERWRITE SAVE? (Y=yes, X=no)"); - while( !((keys = gp2x_joystick_read(1)) & (GP2X_X|GP2X_Y)) ) + while ( !((keys = gp2x_joystick_read(1)) & (GP2X_X|GP2X_Y)) ) usleep(50*1024); if (keys & GP2X_X) do_it = 0; + while ( gp2x_joystick_read(1) & (GP2X_X|GP2X_Y) ) // wait for release + usleep(50*1024); clearArea(0); } if (do_it) { @@ -560,11 +599,10 @@ static void RunEvents(unsigned int which) } } - static void updateKeys(void) { - unsigned long keys, allActions[2] = { 0, 0 }, events; - static unsigned long prevEvents = 0; + unsigned int keys, keys2, allActions[2] = { 0, 0 }, events; + static unsigned int prevEvents = 0; int joy, i; keys = gp2x_joystick_read(0); @@ -575,26 +613,30 @@ static void updateKeys(void) } keys &= CONFIGURABLE_KEYS; + keys2 = keys; for (i = 0; i < 32; i++) { - if (keys & (1 << i)) { + if (keys2 & (1 << i)) + { int pl, acts = currentConfig.KeyBinds[i]; if (!acts) continue; pl = (acts >> 16) & 1; - if (combo_keys & (1 << i)) { - int u = i+1, acts_c = acts & combo_acts; + if (kb_combo_keys & (1 << i)) + { + int u = i+1, acts_c = acts & kb_combo_acts; // let's try to find the other one - if (acts_c) + if (acts_c) { for (; u < 32; u++) - if ( (currentConfig.KeyBinds[u] & acts_c) && (keys & (1 << u)) ) { - allActions[pl] |= acts_c; - keys &= ~((1 << i) | (1 << u)); + if ( (keys2 & (1 << u)) && (currentConfig.KeyBinds[u] & acts_c) ) { + allActions[pl] |= acts_c & currentConfig.KeyBinds[u]; + keys2 &= ~((1 << i) | (1 << u)); break; } + } // add non-combo actions if combo ones were not found if (!acts_c || u == 32) - allActions[pl] |= acts & ~combo_acts; + allActions[pl] |= acts & ~kb_combo_acts; } else { allActions[pl] |= acts; } @@ -606,9 +648,9 @@ static void updateKeys(void) { gp2x_usbjoy_update(); for (joy = 0; joy < num_of_joys; joy++) { - int keys = gp2x_usbjoy_check2(joy); + int btns = gp2x_usbjoy_check2(joy); for (i = 0; i < 32; i++) { - if (keys & (1 << i)) { + if (btns & (1 << i)) { int acts = currentConfig.JoyBinds[joy][i]; int pl = (acts >> 16) & 1; allActions[pl] |= acts; @@ -630,6 +672,10 @@ static void updateKeys(void) change_fast_forward(events & 0x40); events &= ~prevEvents; + + if (PicoAHW == PAHW_PICO) + RunEventsPico(events, keys); + if (events) RunEvents(events); if (movie_data) emu_updateMovie(); @@ -655,19 +701,18 @@ static void SkipFrame(int do_audio) } -void emu_forcedFrame(void) +void emu_forcedFrame(int opts) { int po_old = PicoOpt; int eo_old = currentConfig.EmuOpt; - PicoOpt &= ~0x0010; - PicoOpt |= 0x4080; // soft_scale | acc_sprites + PicoOpt &= ~0x10; + PicoOpt |= opts|POPT_ACC_SPRITES; // acc_sprites currentConfig.EmuOpt |= 0x80; //vidResetMode(); PicoDrawSetColorFormat(1); - PicoScan = EmuScan16; - PicoScan(0, 0); + PicoScanBegin = EmuScanBegin16; Pico.m.dirtyPal = 1; PicoFrameDrawOnly(); @@ -691,25 +736,75 @@ static void simpleWait(int thissec, int lim_time) spend_cycles(1024); gettimeofday(&tval, 0); - if(thissec != tval.tv_sec) tval.tv_usec+=1000000; + if (thissec != tval.tv_sec) tval.tv_usec+=1000000; - while(tval.tv_usec < lim_time) + while (tval.tv_usec < lim_time) { spend_cycles(1024); gettimeofday(&tval, 0); - if(thissec != tval.tv_sec) tval.tv_usec+=1000000; + if (thissec != tval.tv_sec) tval.tv_usec+=1000000; } } +#if 0 +static void tga_dump(void) +{ +#define BYTE unsigned char +#define WORD unsigned short + struct + { + BYTE IDLength; /* 00h Size of Image ID field */ + BYTE ColorMapType; /* 01h Color map type */ + BYTE ImageType; /* 02h Image type code */ + WORD CMapStart; /* 03h Color map origin */ + WORD CMapLength; /* 05h Color map length */ + BYTE CMapDepth; /* 07h Depth of color map entries */ + WORD XOffset; /* 08h X origin of image */ + WORD YOffset; /* 0Ah Y origin of image */ + WORD Width; /* 0Ch Width of image */ + WORD Height; /* 0Eh Height of image */ + BYTE PixelDepth; /* 10h Image pixel size */ + BYTE ImageDescriptor; /* 11h Image descriptor byte */ + } __attribute__((packed)) TGAHEAD; + static unsigned short oldscr[320*240]; + FILE *f; char name[128]; int i; + + memset(&TGAHEAD, 0, sizeof(TGAHEAD)); + TGAHEAD.ImageType = 2; + TGAHEAD.Width = 320; + TGAHEAD.Height = 240; + TGAHEAD.PixelDepth = 16; + TGAHEAD.ImageDescriptor = 2<<4; // image starts at top-left + +#define CONV(X) (((X>>1)&0x7fe0)|(X&0x1f)) // 555? + + for (i = 0; i < 320*240; i++) + if(oldscr[i] != CONV(((unsigned short *)gp2x_screen)[i])) break; + if (i < 320*240) + { + for (i = 0; i < 320*240; i++) + oldscr[i] = CONV(((unsigned short *)gp2x_screen)[i]); + sprintf(name, "%05i.tga", Pico.m.frame_count); + f = fopen(name, "wb"); + if (!f) { printf("!f\n"); exit(1); } + fwrite(&TGAHEAD, 1, sizeof(TGAHEAD), f); + fwrite(oldscr, 1, 320*240*2, f); + fclose(f); + } +} +#endif + + void emu_Loop(void) { static int gp2x_old_clock = 200; static int PsndRate_old = 0, PicoOpt_old = 0, EmuOpt_old = 0, pal_old = 0; char fpsbuff[24]; // fps count c string struct timeval tval; // timing - int thissec = 0, frames_done = 0, frames_shown = 0, oldmodes = 0; - int target_fps, target_frametime, lim_time, vsync_offset, i; + int pframes_done, pframes_shown, pthissec; // "period" frames, used for sync + int frames_done, frames_shown, thissec; // actual frames + int oldmodes = 0, target_fps, target_frametime, lim_time, vsync_offset, i; char *notice = 0; printf("entered emu_Loop()\n"); @@ -741,7 +836,7 @@ void emu_Loop(void) scaling_update(); Pico.m.dirtyPal = 1; oldmodes = ((Pico.video.reg[12]&1)<<2) ^ 0xc; - find_combos(); + emu_findKeyBindCombos(); // pal/ntsc might have changed, reset related stuff target_fps = Pico.m.pal ? 50 : 60; @@ -773,7 +868,7 @@ void emu_Loop(void) } // prepare CD buffer - if (PicoMCD & 1) PicoCDBufferInit(); + if (PicoAHW & PAHW_MCD) PicoCDBufferInit(); // calc vsync offset to sync timing code with vsync if (currentConfig.EmuOpt&0x2000) { @@ -788,7 +883,10 @@ void emu_Loop(void) } else vsync_offset = 0; - // loop? + frames_done = frames_shown = thissec = + pframes_done = pframes_shown = pthissec = 0; + + // loop while (engineState == PGS_Running) { int modes; @@ -796,8 +894,8 @@ void emu_Loop(void) gettimeofday(&tval, 0); if (reset_timing) { reset_timing = 0; - thissec = tval.tv_sec; - frames_shown = frames_done = tval.tv_usec/target_frametime; + pthissec = tval.tv_sec; + pframes_shown = pframes_done = tval.tv_usec/target_frametime; } // show notice message? @@ -853,46 +951,55 @@ void emu_Loop(void) bench_fps += frames_shown; sprintf(fpsbuff, "%02i/%02i/%02i", frames_shown, bench_fps_s, (bf[0]+bf[1]+bf[2]+bf[3])>>2); #else - if (currentConfig.EmuOpt & 2) + if (currentConfig.EmuOpt & 2) { sprintf(fpsbuff, "%02i/%02i", frames_shown, frames_done); - if (fpsbuff[5] == 0) { fpsbuff[5] = fpsbuff[6] = ' '; fpsbuff[7] = 0; } + if (fpsbuff[5] == 0) { fpsbuff[5] = fpsbuff[6] = ' '; fpsbuff[7] = 0; } + } #endif + frames_shown = frames_done = 0; thissec = tval.tv_sec; + } +#ifdef PFRAMES + sprintf(fpsbuff, "%i", Pico.m.frame_count); +#endif + if (pthissec != tval.tv_sec) + { if (PsndOut == 0 && currentConfig.Frameskip >= 0) { - frames_done = frames_shown = 0; + pframes_done = pframes_shown = 0; } else { // it is quite common for this implementation to leave 1 fame unfinished // when second changes, but we don't want buffer to starve. - if(PsndOut && frames_done < target_fps && frames_done > target_fps-5) { + if(PsndOut && pframes_done < target_fps && pframes_done > target_fps-5) { updateKeys(); - SkipFrame(1); frames_done++; + SkipFrame(1); pframes_done++; } - frames_done -= target_fps; if (frames_done < 0) frames_done = 0; - frames_shown -= target_fps; if (frames_shown < 0) frames_shown = 0; - if (frames_shown > frames_done) frames_shown = frames_done; + pframes_done -= target_fps; if (pframes_done < 0) pframes_done = 0; + pframes_shown -= target_fps; if (pframes_shown < 0) pframes_shown = 0; + if (pframes_shown > pframes_done) pframes_shown = pframes_done; } + pthissec = tval.tv_sec; } -#ifdef PFRAMES - sprintf(fpsbuff, "%i", Pico.m.frame_count); -#endif - lim_time = (frames_done+1) * target_frametime + vsync_offset; - if(currentConfig.Frameskip >= 0) { // frameskip enabled + lim_time = (pframes_done+1) * target_frametime + vsync_offset; + if (currentConfig.Frameskip >= 0) // frameskip enabled + { for(i = 0; i < currentConfig.Frameskip; i++) { updateKeys(); - SkipFrame(1); frames_done++; + SkipFrame(1); pframes_done++; frames_done++; if (PsndOut && !reset_timing) { // do framelimitting if sound is enabled gettimeofday(&tval, 0); - if(thissec != tval.tv_sec) tval.tv_usec+=1000000; - if(tval.tv_usec < lim_time) { // we are too fast - simpleWait(thissec, lim_time); + if (pthissec != tval.tv_sec) tval.tv_usec+=1000000; + if (tval.tv_usec < lim_time) { // we are too fast + simpleWait(pthissec, lim_time); } } lim_time += target_frametime; } - } else if(tval.tv_usec > lim_time) { // auto frameskip + } + else if (tval.tv_usec > lim_time) // auto frameskip + { // no time left for this frame - skip if (tval.tv_usec - lim_time >= 300000) { /* something caused a slowdown for us (disk access? cache flush?) @@ -901,74 +1008,16 @@ void emu_Loop(void) continue; } updateKeys(); - SkipFrame(tval.tv_usec < lim_time+target_frametime*2); frames_done++; + SkipFrame(tval.tv_usec < lim_time+target_frametime*2); pframes_done++; frames_done++; continue; } updateKeys(); PicoFrame(); -#if 0 -if (Pico.m.frame_count == 31563) { - FILE *f; - f = fopen("ram_p.bin", "wb"); - if (!f) { printf("!f\n"); exit(1); } - fwrite(Pico.ram, 1, 0x10000, f); - fclose(f); - exit(0); -} -#endif -#if 0 - // debug - { - #define BYTE unsigned char - #define WORD unsigned short - struct - { - BYTE IDLength; /* 00h Size of Image ID field */ - BYTE ColorMapType; /* 01h Color map type */ - BYTE ImageType; /* 02h Image type code */ - WORD CMapStart; /* 03h Color map origin */ - WORD CMapLength; /* 05h Color map length */ - BYTE CMapDepth; /* 07h Depth of color map entries */ - WORD XOffset; /* 08h X origin of image */ - WORD YOffset; /* 0Ah Y origin of image */ - WORD Width; /* 0Ch Width of image */ - WORD Height; /* 0Eh Height of image */ - BYTE PixelDepth; /* 10h Image pixel size */ - BYTE ImageDescriptor; /* 11h Image descriptor byte */ - } __attribute__((packed)) TGAHEAD; - static unsigned short oldscr[320*240]; - FILE *f; char name[128]; int i; - - memset(&TGAHEAD, 0, sizeof(TGAHEAD)); - TGAHEAD.ImageType = 2; - TGAHEAD.Width = 320; - TGAHEAD.Height = 240; - TGAHEAD.PixelDepth = 16; - TGAHEAD.ImageDescriptor = 2<<4; // image starts at top-left - - #define CONV(X) (((X>>1)&0x7fe0)|(X&0x1f)) // 555? - - for (i = 0; i < 320*240; i++) - if(oldscr[i] != CONV(((unsigned short *)gp2x_screen)[i])) break; - if (i < 320*240) - { - for (i = 0; i < 320*240; i++) - oldscr[i] = CONV(((unsigned short *)gp2x_screen)[i]); - sprintf(name, "%05i.tga", Pico.m.frame_count); - f = fopen(name, "wb"); - if (!f) { printf("!f\n"); exit(1); } - fwrite(&TGAHEAD, 1, sizeof(TGAHEAD), f); - fwrite(oldscr, 1, 320*240*2, f); - fclose(f); - } - } -#endif - // check time gettimeofday(&tval, 0); - if (thissec != tval.tv_sec) tval.tv_usec+=1000000; + if (pthissec != tval.tv_sec) tval.tv_usec+=1000000; if (currentConfig.Frameskip < 0 && tval.tv_usec - lim_time >= 300000) // slowdown detection reset_timing = 1; @@ -981,22 +1030,23 @@ if (Pico.m.frame_count == 31563) { // we are too fast if (vsync_offset) { if (lim_time - tval.tv_usec > target_frametime/2) - simpleWait(thissec, lim_time - target_frametime/4); + simpleWait(pthissec, lim_time - target_frametime/4); gp2x_video_wait_vsync(); } else { - simpleWait(thissec, lim_time); + simpleWait(pthissec, lim_time); } } } blit(fpsbuff, notice); - frames_done++; frames_shown++; + pframes_done++; pframes_shown++; + frames_done++; frames_shown++; } change_fast_forward(0); - if (PicoMCD & 1) PicoCDBufferFree(); + if (PicoAHW & PAHW_MCD) PicoCDBufferFree(); // save SRAM if((currentConfig.EmuOpt & 1) && SRam.changed) { @@ -1007,14 +1057,13 @@ if (Pico.m.frame_count == 31563) { // if in 8bit mode, generate 16bit image for menu background if ((PicoOpt&0x10) || !(currentConfig.EmuOpt&0x80)) - emu_forcedFrame(); + emu_forcedFrame(POPT_EN_SOFTSCALE); } void emu_ResetGame(void) { - PicoReset(0); + PicoReset(); reset_timing = 1; } -