Ejemplo n.º 1
0
static void run_emulation(void)
{
  int sync;

  /* main emulation loop */
  while (1)
  {
    /* emulated system */
    if (system_hw == SYSTEM_MCD)
    {
      /* 16-bit hardware + CD */
      while (!ConfigRequested)
      {
        /* render frame */
        system_frame_scd(0);

        /* audio/video sync */
        sync = NO_SYNC;
        while (sync != (SYNC_VIDEO | SYNC_AUDIO))
        {
          /* update video */
          sync |= gx_video_Update();

          /* update audio */
          sync |= gx_audio_Update();
        }

        /* check interlaced mode change */
        if (bitmap.viewport.changed & 4)
        {
          /* VSYNC "original" mode */
          if (!config.render && config.vsync && (gc_pal == vdp_pal))
          {
            /* framerate has changed, reinitialize audio timings */
            audio_init(SAMPLERATE_48KHZ, get_framerate());
          }

          /* clear flag */
          bitmap.viewport.changed &= ~4;
        }
      }
    }
    else if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
    {
      /* 16-bit hardware */
      while (!ConfigRequested)
      {
        /* render frame */
        system_frame_gen(0);

        /* audio/video sync */
        sync = NO_SYNC;
        while (sync != (SYNC_VIDEO | SYNC_AUDIO))
        {
          /* update video */
          sync |= gx_video_Update();

          /* update audio */
          sync |= gx_audio_Update();
        }

        /* check interlaced mode change */
        if (bitmap.viewport.changed & 4)
        {
          /* VSYNC "original" mode */
          if (!config.render && config.vsync && (gc_pal == vdp_pal))
          {
            /* framerate has changed, reinitialize audio timings */
            audio_init(SAMPLERATE_48KHZ, get_framerate());
          }

          /* clear flag */
          bitmap.viewport.changed &= ~4;
        }
      }
    }
    else
    {
      /* 8-bit hardware */
      while (!ConfigRequested)
      {
        /* render frame */
        system_frame_sms(0);

        /* audio/video sync */
        sync = NO_SYNC;
        while (sync != (SYNC_VIDEO | SYNC_AUDIO))
        {
          /* update video */
          sync |= gx_video_Update();

          /* update audio */
          sync |= gx_audio_Update();
        }

        /* check interlaced mode change (PBC mode only) */
        if (bitmap.viewport.changed & 4)
        {
          /* "original" mode */
          if (!config.render && config.vsync && (gc_pal == vdp_pal))
          {
            /* framerate has changed, reinitialize audio timings */
            audio_init(SAMPLERATE_48KHZ, get_framerate());
          }

          /* clear flag */
          bitmap.viewport.changed &= ~4;
        }
      }
    }

    /* stop video & audio */
    gx_audio_Stop();
    gx_video_Stop();

#ifdef LOG_TIMING
    if (system_hw)
    {
      FILE *f;
      char filename[64];

      memset(filename, 0, 64);
      strcpy(filename,"timings-");
      if (!config.vsync || (config.tv_mode == !vdp_pal))
      {
        strcat(filename,"no_");
      }
      else
      {
        if (gc_pal)
        {
          strcat(filename,"50hz_");
        }
        else
        {
          strcat(filename,"60hz_");
        }
      }
      strcat(filename,"vsync-");
      if (vdp_pal)
      {
        strcat(filename,"pal-");
      }
      else
      {
        strcat(filename,"ntsc-");
      }
      if (config.render == 2)
      {
        strcat(filename,"prog.txt");
      }
      else
      {
        if (!config.render && !interlaced)
        {
          strcat(filename,"no_");
        }
        strcat(filename,"int.txt");
      }

      f = fopen(filename,"a");
      if (f != NULL)
      {
        int i;
        u32 min,max;
        double total = 0;
        double nsamples = 0;

        if (delta_time[LOGSIZE - 1] != 0)
        {
          frame_cnt = LOGSIZE;
        }

        min = max = delta_time[0];

        for (i=0; i<frame_cnt; i++)
        {
          fprintf(f,"%d ns - %d samples (%5.8f samples/sec)\n", delta_time[i], delta_samp[i], 1000000000.0*(double)delta_samp[i]/(double)delta_time[i]/4.0);
          total += delta_time[i];
          nsamples += delta_samp[i] / 4.0;
          if (min > delta_time[i]) min = delta_time[i];
          if (max < delta_time[i]) max = delta_time[i];
        }
        fprintf(f,"\n");
        fprintf(f,"min = %d ns\n", min);
        fprintf(f,"max = %d ns\n", max);
        fprintf(f,"avg = %8.5f ns (%5.8f samples/sec, %5.8f samples/frame)\n\n\n", total/(double)i, nsamples/total*1000000000.0, nsamples/(double)i);
        fclose(f);
      }
    }

    memset(delta_time,0,LOGSIZE);
    memset(delta_samp,0,LOGSIZE);
    frame_cnt = prevtime = 0;
#endif
    
    /* show menu */
    ConfigRequested = 0;
    mainmenu();

    /* restart video & audio */
    gx_video_Start();
    gx_audio_Start();
  }
}
Ejemplo n.º 2
0
int main (int argc, char *argv[])
{
#ifdef HW_RVL
  /* initialize DVDX */
  DI_Init();
#endif

  /* initialize hardware */
  gx_video_Init();
  gx_input_Init();
#ifdef HW_DOL
  DVD_Init ();
  dvd_drive_detect();
#endif

  /* initialize FAT devices */
  if (fatInitDefault())
  {
    /* check for default directories */
    DIR_ITER *dir = NULL;

    /* base directory */
    char pathname[MAXPATHLEN];
    sprintf (pathname, DEFAULT_PATH);
    dir = diropen(pathname);
    if (dir == NULL) mkdir(pathname,S_IRWXU);
    else dirclose(dir);

    /* SRAM & Savestate files directory */ 
    sprintf (pathname, "%s/saves",DEFAULT_PATH);
    dir = diropen(pathname);
    if (dir == NULL) mkdir(pathname,S_IRWXU);
    else dirclose(dir);

    /* Snapshot files directory */ 
    sprintf (pathname, "%s/snaps",DEFAULT_PATH);
    dir = diropen(pathname);
    if (dir == NULL) mkdir(pathname,S_IRWXU);
    else dirclose(dir);

    /* Cheat files directory */ 
    sprintf (pathname, "%s/cheats",DEFAULT_PATH);
    dir = diropen(pathname);
    if (dir == NULL) mkdir(pathname,S_IRWXU);
    else dirclose(dir);
  }

  /* initialize sound engine */
  gx_audio_Init();

  /* initialize core engine */
  legal();
  config_default();
  history_default();
  init_machine();

  /* run any injected rom */
  if (cart.romsize)
  {
    ARAMFetch((char *)cart.rom, (void *)0x8000, cart.romsize);
    reloadrom (cart.romsize,"INJECT.bin");
    gx_video_Start();
    gx_audio_Start();
    frameticker = 1;
  }
  else
  {
    /* Main Menu */
    ConfigRequested = 1;
  }

  /* initialize GUI engine */
  GUI_Initialize();

#ifdef HW_RVL
  /* Power button callback */
  SYS_SetPowerCallback(Power_Off);
#endif

  /* main emulation loop */
  while (1)
  {
    /* Main Menu request */
    if (ConfigRequested)
    {
      /* stop video & audio */
      gx_audio_Stop();
      gx_video_Stop();

      /* show menu */
      MainMenu ();
      ConfigRequested = 0;

      /* start video & audio */
      gx_audio_Start();
      gx_video_Start();
      frameticker = 1;
    }

    if (frameticker > 1)
    {
      /* skip frame */
      system_frame(1);
      --frameticker;
    }
    else
    {
      while (frameticker < 1)
        usleep(10);

      /* render frame */
      system_frame(0);
      --frameticker;

      /* update video */
      gx_video_Update();
    }

    /* update audio */
    gx_audio_Update();
  }

  return 0;
}