Exemple #1
0
// Main application routine
static inline void ProcessApplication( struct SEventStruct *evmask )
{
    core_poll( evmask );

    if ( wake_up & WUR_USR )            // wake-up from stop state by keypress
        ui_st = PM_SLEEP;

    if ( evmask->timer_tick_10ms || evmask->key_event )
    {
        ui_st = ui_poll( evmask );
    }
    sys_pwr |= ui_st;
}
Exemple #2
0
int vsync_do_vsync(struct video_canvas_s *canvas, int been_skipped)
{
    int skip_next_frame = 0;
    int frame_delay;
    int now, dopoll;

    /* this can happen in some rare cases; make sure emulation stops then */
    while (EmuPaused != 0) {
        ui_poll(1);
    }

    if (FullScreenMode != 0) {
        EmuWindowHasInputFocus = 1;
    } else {
        RO_Caret caret;

        Wimp_GetCaretPosition(&caret);

        /* This will be used by keyboard and joystick code */
        EmuWindowHasInputFocus = (canvas_for_handle(caret.WHandle) == NULL) ? 0 : 1;
    }

    now = OS_ReadMonotonicTime();

    if (warp_mode_enabled) {
        if (skip_counter < MaxSkippedFrames) {
            skip_next_frame = 1;
            skip_counter++;
        } else {
            skip_counter = 0;
        }
    } else if (refresh_rate != 0) {
        if (skip_counter < refresh_rate - 1) {
            skip_next_frame = 1;
            skip_counter++;
        } else {
            skip_counter = 0;
        }
    } else {
        /* Use NumberOfFrames+1 because this frame isn't counted yet */
        if ((VSYNC_TIME_DELTA(now, NumberOfFrames+1) < 0) && (skip_counter < MaxSkippedFrames)) {
            skip_next_frame = 1;
            skip_counter++;
        } else {
            skip_counter = 0;
        }
    }

    /* always pass the actual speed unless in reSID mode */
    frame_delay = sound_flush();

    if (frame_counter >= refresh_frequency * 2) {
        num_skipped_frames = 0;
        frame_counter = 0;
    } else {
        frame_counter++;
    }

    if (skip_next_frame == 0) {
        NumberOfRefreshes++;
    }

    vsync_hook();

    joystick();
    mousedrv_sync();

    NumberOfFrames += 1 - frame_delay;

    /* Speed limiter? Wait */
    if ((CurrentSpeedLimit != 0) && (warp_mode_enabled == 0)) {
        while (VSYNC_TIME_DELTA(now, NumberOfFrames) > 0) {
            now = OS_ReadMonotonicTime();
        }
    }
    LastFrame = now;

    if (speed_eval_suspended) {
        vsync_resync_speed();
        speed_eval_suspended = 0;
    } else {
        if ((now - LastSpeed) >= SpeedEvery) {
            int val;

            RelativeSpeed = (10000 * NumberOfFrames) / (FramesPerSecond * (now - LastSpeed));
            ui_display_speed(RelativeSpeed, (100 * NumberOfRefreshes) / (now - LastSpeed), 0);
            LastSpeed = now;
            NumberOfFrames = 0;
            NumberOfRefreshes = 0;
            resources_get_int("MachineVideoStandard", &val);
            FramesPerSecond = (val == MACHINE_SYNC_PAL) ? 50 : 60;
        }
    }

    dopoll = 0;
    if ((now - LastPoll) >= PollEvery) {
        dopoll = 1;
        LastPoll = now;
    }

    ui_poll(dopoll);

    video_full_screen_plot_status();

    kbdbuf_flush();

    return skip_next_frame;
}