⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 helper.c

📁 NES game Emulator in Linux.c and asm codes.
💻 C
📖 第 1 页 / 共 2 页
字号:
 {
  case 0:   /* VGA mode 13h - linear 320x200 */
  case 1:   /* VESA2 - linear 320x240 */
  case 2:   /* VGA mode-x - planar 320x240 */
  case 3:   /* VGA - linear 256x239 */
   screenshot_source = gbSNES_Screen8.subbitmap;

   switch (stretch_x)
   {
    case 0:
     out_size_x = 256;
     out_position_x = (ScreenX - out_size_x) / 2;
     break;
    default:
     out_size_x = 256 * stretch_x;
     out_position_x = (ScreenX - out_size_x) / 2;
     break;
    case 1:
     out_position_x = 0;
     out_size_x = ScreenX;
     break;
   }

   switch (stretch_y)
   {
    case 0:
     out_size_y = 239;
     out_position_y = (ScreenY - out_size_y) / 2;
     break;
    default:
     out_size_y = 239 * stretch_y;
     out_position_y = (ScreenY - out_size_y) / 2;
     break;
    case 1:
     out_position_y = 0;
     out_size_y = ScreenY;
     break;
   }

   if (stretch_x || stretch_y)
   {
    if (Current_Line_Render < 239 && Current_Line_Render < Last_Frame_Line)
    {
     /* fill unrendered area with black */
     rectfill(gbSNES_Screen8.subbitmap,
      0, Current_Line_Render,
      255, Last_Frame_Line - 1,
      0);
    }

    acquire_screen();

    stretch_blit(gbSNES_Screen8.subbitmap, screen,
     0, 0, 256, 239,
     out_position_x, out_position_y, out_size_x, out_size_y);

    release_screen();
   }
   else
   {
    acquire_screen();

    blit(gbSNES_Screen8.subbitmap, screen, 0, 0,
     out_position_x, out_position_y, out_size_x, Current_Line_Render);

    if (Current_Line_Render < 239 && Current_Line_Render < Last_Frame_Line)
    {
     /* fill unrendered area with black */
     rectfill(screen,
      out_position_x, out_position_y + Current_Line_Render,
      out_position_x + out_size_x - 1, out_position_y + Last_Frame_Line - 1,
      0);
    }

    release_screen();
   }

   break;

  case 4:   /* VESA 2 16-bit - 320x200 */
  case 5:   /* VESA 2 16-bit - 320x240 */
  case 6:   /* VESA 2 16-bit - 640x480 */
  case 7:   /* Windows/X windowing system 16-bit - 640x480 */
#if 0
   {
    int ox, oy;

    out_position_x = (ScreenX > 256) ? (ScreenX - 256) / 2 : 0;
    out_size_x = (ScreenX < 256) ? ScreenX : 256;
    out_position_y = (ScreenY > 239) ? (ScreenY - 239) / 2 : 0;
    out_size_y = (ScreenY < Current_Line_Render) ? ScreenY : Current_Line_Render;

    acquire_screen();

    for (oy = 0; oy < out_size_y; oy++)
    {
     unsigned char *src_line_address = gbSNES_Screen8.subbitmap->line[oy];

     for (ox = 0; ox < out_size_x; ox++)
     {
      unsigned char color = src_line_address[ox];
      unsigned short color16 =
       ((unsigned short *)HICOLOUR_Palette)[color];

      _putpixel16(screen, out_position_x + ox, out_position_y + oy, color16);
     }
    }

    if (Current_Line_Render < 239 && Current_Line_Render < Last_Frame_Line)
    {
     /* fill unrendered area with black */
     rectfill(screen,
      out_position_x, out_position_y + Current_Line_Render,
      out_position_x + out_size_x - 1, out_position_y + Last_Frame_Line - 1,
      0);
    }

    release_screen();

    break;
   }
#else
   switch (stretch_x)
   {
    case 0:
     out_size_x = 256;
     out_position_x = (ScreenX - out_size_x) / 2;
     break;
    default:
     out_size_x = 256 * stretch_x;
     out_position_x = (ScreenX - out_size_x) / 2;
     break;
    case 1:
     out_position_x = 0;
     out_size_x = ScreenX;
     break;
   }

   switch (stretch_y)
   {
    case 0:
     out_size_y = 239;
     out_position_y = (ScreenY - out_size_y) / 2;
     break;
    default:
     out_size_y = 239 * stretch_y;
     out_position_y = (ScreenY - out_size_y) / 2;
     break;
    case 1:
     out_position_y = 0;
     out_size_y = ScreenY;
     break;
   }

   if (stretch_x || stretch_y)
   {
    screenshot_source = gbSNES_Screen16.subbitmap;

    if (Current_Line_Render < 239 && Current_Line_Render < Last_Frame_Line)
    {
     /* fill unrendered area with black */
     rectfill(gbSNES_Screen8.subbitmap,
      0, Current_Line_Render,
      255, Last_Frame_Line - 1,
      0);
    }

    blit(gbSNES_Screen8.subbitmap, gbSNES_Screen16.subbitmap,
     0, 0, 0, 0, 256, 239);

    acquire_screen();

    stretch_blit(gbSNES_Screen16.subbitmap, screen,
     0, 0, 256, 239,
     out_position_x, out_position_y, out_size_x, out_size_y);

    release_screen();
   }
   else
   {
    screenshot_source = gbSNES_Screen8.subbitmap;

    acquire_screen();

    blit(gbSNES_Screen8.subbitmap, screen, 0, 0, out_position_x, out_position_y,
     out_size_x, Current_Line_Render);

    if (Current_Line_Render < 239 && Current_Line_Render < Last_Frame_Line)
    {
     /* fill unrendered area with black */
     rectfill(screen,
      out_position_x, out_position_y + Current_Line_Render,
      out_position_x + out_size_x - 1, out_position_y + Last_Frame_Line - 1,
      0);
    }

    release_screen();
   }

   break;

#endif

  default:
   screenshot_source = gbSNES_Screen8.subbitmap;

   acquire_screen();

   blit(gbSNES_Screen8.subbitmap, screen, 0, 0, 0, 0, ScreenX, ScreenY);

   release_screen();
 }
}

#if defined(UNIX) || defined(__BEOS__)
void fnmerge(char *out, const char *drive, const char *dir, const char *file,
             const char *ext)
{
 out[0] = 0;
 if (strlen (drive))
  strcat(out, drive);
 if (strlen (dir))
 {
  strcat(out, dir);
  strcat(out, "/");
 }
 if (strlen (file))
  strcat(out, file);
 if (strlen (ext))
 {
  strcat(out, ".");
  strcat(out, ext);
 }
}

static void set_dir(char *dir, const char *in, const char *inptr)
{
 if (inptr > in + 1)
 {
  if (*(inptr - 2) == '.' && *(inptr - 1) == '.') /* check for ".." */
  {
   strcpy(dir, inptr - 2);
   return;
  }
 }
 else if (inptr > in)
 {
  if (*(inptr - 1) == '.')                        /* check for "." */
  {
   strcpy(dir, inptr - 1);
   return;
  }
 }
 /* NOT else! */
 strcpy(dir, in);
}

void fnsplit(const char *in0, char *drive, char *dir, char *file, char *ext)
/* Note: We assume "in0" points to a correct filename */
{
 struct stat fstate;
 char *p1, *p2, in[FILENAME_MAX];

 strcpy(in, in0);     /* don't modify in0 parameter */

 stat(in, &fstate);

 /* We're running on Unix or BeOS, so we don't check for a drive letter */
 *drive = 0;

 if ((p1 = strchr(in, '/')))
 {
  if (S_ISDIR(fstate.st_mode))
  {
   if (p1[1] == 0)    /* single trailing slash */
    strcpy(dir, in);
   else               /* "leading" slash */
    set_dir(dir, in, p1);
   *file = 0;
  }
  else
  {
   p2 = strrchr(in, '/');
   if (p1 == p2)      /* only one slash (must be a leading one) */
   {
    *p1 = 0;
    set_dir(dir, in, p1);
    strcpy(file, p1 + 1);
   }
   else
   {
    *p2 = 0;
    set_dir(dir, in, p1);
    strcpy(file, p2 + 1);
   }
  }
 }
 else                 /* no slash */
 {
  if (S_ISDIR(fstate.st_mode))
  {
   strcpy(dir, in);
   *file = 0;
  }
  else
  {
   *dir = 0;
   strcpy(file, in);
  }
 }

 if ((p1 = strrchr(file, '.')))
 {
  if (p1 > file)
  {
   strcpy(ext, p1);   /* save period in ext */
   *p1 = 0;
  }
  else                /* file name with leading period */
   *ext = 0;
 }
 else
  *ext = 0;
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -