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

📄 infones_system_win.cpp

📁 游戏模拟器InfoNes的原代码。有兴趣的可以将它移植到linux下
💻 CPP
📖 第 1 页 / 共 3 页
字号:

       case IDC_BTN_FAST:
          /*-------------------------------------------------------------------*/
          /*  Fast & Slow button                                               */
          /*-------------------------------------------------------------------*/
			    // Increment Frameskip Counter
				  FrameSkip++;
				  break;

			  case IDC_BTN_SLOW:
				  // Decrement Frameskip Counter
          if (FrameSkip <= 0)
            break;
				  FrameSkip--;
          break;

        case IDC_BTN_SINGLE:
          /*-------------------------------------------------------------------*/
          /*  Screen Size x1, x2, x3 button                                    */
          /*-------------------------------------------------------------------*/
          SetWindowSize( 1 );

          // Check x1 button
          CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_SINGLE, MF_CHECKED );
          CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_DOUBLE, MF_UNCHECKED );
          CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_TRIPLE, MF_UNCHECKED );

          // Clear FrameSkip
          FrameSkip = 0;
          break;

        case IDC_BTN_DOUBLE:
          SetWindowSize( 2 );

          // Check x2 button
          CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_SINGLE, MF_UNCHECKED );
          CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_DOUBLE, MF_CHECKED );
          CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_TRIPLE, MF_UNCHECKED );

          // Clear FrameSkip
          FrameSkip = 0;
          break;

        case IDC_BTN_TRIPLE:
          SetWindowSize( 3 );

          // Check x3 button
          CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_SINGLE, MF_UNCHECKED );
          CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_DOUBLE, MF_UNCHECKED );
          CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_TRIPLE, MF_CHECKED );

          // Clear FrameSkip
          FrameSkip = 0;
          break;

        case IDC_BTN_CLIP_VERTICAL:
          /*-------------------------------------------------------------------*/
          /*  Screen Clip Up and Down button                                   */
          /*-------------------------------------------------------------------*/
          PPU_UpDown_Clip = ( PPU_UpDown_Clip ? 0 : 1 );

          // Check or Uncheck it
          if ( PPU_UpDown_Clip )
          {
            CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_CLIP_VERTICAL, MF_CHECKED );
          } else {
            CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_CLIP_VERTICAL, MF_UNCHECKED );
          }
          break;

				case IDC_BTN_FRAMESKIP:
					/*-------------------------------------------------------------------*/
          /*  Auto Frameskip button                                            */
          /*-------------------------------------------------------------------*/
          bAutoFrameskip = ( bAutoFrameskip ? 0 : 1 );

          // Check or Uncheck it
          if ( bAutoFrameskip )
          {
            CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_FRAMESKIP, MF_CHECKED );
          } else {
            CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_FRAMESKIP, MF_UNCHECKED );
          }
          break;

				case IDC_BTN_MUTE:
					/*-------------------------------------------------------------------*/
          /*  APU Mute button                                                  */
          /*-------------------------------------------------------------------*/
          APU_Mute = ( APU_Mute ? 0 : 1 );

          if (!lpSndDevice->SoundMute( APU_Mute ) )
          {
            InfoNES_MessageBox( "SoundMute() Failed." );
            exit(0);
          }

          // Check or Uncheck it
          if ( APU_Mute )
          {
            CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_MUTE, MF_CHECKED );
          } else {
            CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_MUTE, MF_UNCHECKED );
          }
          break;

				case IDC_BTN_ABOUT:
					/*-------------------------------------------------------------------*/
          /*  About button                                                     */
          /*-------------------------------------------------------------------*/
          DialogBox(wc.hInstance,
                    MAKEINTRESOURCE(IDD_DIALOG),
                    hWndMain,
                    (DLGPROC)AboutDlgProc);
          break;
      }
			break;

    default:
      return DefWindowProc(hWnd, message, wParam, lParam);
  }
  return 0;
}

/*===================================================================*/
/*                                                                   */
/*           AboutDlgProc() : The About Dialog Box Procedure         */
/*                                                                   */
/*===================================================================*/
LRESULT CALLBACK AboutDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
  switch (uMsg)
  {
    case WM_INITDIALOG:
      return TRUE;
    case WM_COMMAND:
      switch ( LOWORD(wParam) )
      {
        case IDOK:
          EndDialog(hDlg, TRUE);
          return TRUE;
      }
      break;
    }
    return FALSE;
}

/*===================================================================*/
/*                                                                   */
/*      ShowTitle() : Show Title Screen Procedure                    */
/*                                                                   */
/*===================================================================*/
void ShowTitle( HWND hWnd )
{
  HDC hDC = GetDC( hWnd );
  HDC hMemDC = CreateCompatibleDC( hDC );
  HBITMAP hTitleBmp = LoadBitmap( wc.hInstance, MAKEINTRESOURCE( IDB_BITMAP ) );

  // Blt Title Bitmap
  SelectObject( hMemDC, hTitleBmp );

  StretchBlt( hDC, 0, 0, NES_DISP_WIDTH * wScreenMagnification,
              NES_DISP_HEIGHT * wScreenMagnification, hMemDC,
              0, 0, NES_DISP_WIDTH, NES_DISP_HEIGHT, SRCCOPY );

  SelectObject( hMemDC, hTitleBmp );

  DeleteDC( hMemDC );
  ReleaseDC( hWnd, hDC );
}


/*===================================================================*/
/*                                                                   */
/*           LoadSRAM() : Load a SRAM                                */
/*                                                                   */
/*===================================================================*/
int LoadSRAM()
{
/*
 *  Load a SRAM
 *
 *  Return values
 *     0 : Normally
 *    -1 : SRAM data couldn't be read
 */

  FILE *fp;
  unsigned char pSrcBuf[ SRAM_SIZE ];
  unsigned char chData;
  unsigned char chTag;
  int nRunLen;
  int nDecoded;
  int nDecLen;
  int nIdx;

  // It doesn't need to save it
  nSRAM_SaveFlag = 0;

  // It is finished if the ROM doesn't have SRAM
  if ( !ROM_SRAM )
    return 0;

  // There is necessity to save it
  nSRAM_SaveFlag = 1;

  // The preparation of the SRAM file name
  strcpy( szSaveName, szRomName );
  strcpy( strrchr( szSaveName, '.' ) + 1, "srm" );

  /*-------------------------------------------------------------------*/
  /*  Read a SRAM data                                                 */
  /*-------------------------------------------------------------------*/

  // Open SRAM file
  fp = fopen( szSaveName, "rb" );
  if ( fp == NULL )
    return -1;

  // Read SRAM data
  fread( pSrcBuf, SRAM_SIZE, 1, fp );

  // Close SRAM file
  fclose( fp );

  /*-------------------------------------------------------------------*/
  /*  Extract a SRAM data                                              */
  /*-------------------------------------------------------------------*/

  nDecoded = 0;
  nDecLen = 0;

  chTag = pSrcBuf[ nDecoded++ ];

  while ( nDecLen < 8192 )
  {
    chData = pSrcBuf[ nDecoded++ ];

    if ( chData == chTag )
    {
      chData = pSrcBuf[ nDecoded++ ];
      nRunLen = pSrcBuf[ nDecoded++ ];
      for ( nIdx = 0; nIdx < nRunLen + 1; ++nIdx )
      {
        SRAM[ nDecLen++ ] = chData;
      }
    }
    else
    {
      SRAM[ nDecLen++ ] = chData;
    }
  }

  // Successful
  return 0;
}

/*===================================================================*/
/*                                                                   */
/*           SaveSRAM() : Save a SRAM                                */
/*                                                                   */
/*===================================================================*/
int SaveSRAM()
{
/*
 *  Save a SRAM
 *
 *  Return values
 *     0 : Normally
 *    -1 : SRAM data couldn't be written
 */

  FILE *fp;
  int nUsedTable[ 256 ];
  unsigned char chData;
  unsigned char chPrevData;
  unsigned char chTag;
  int nIdx;
  int nEncoded;
  int nEncLen;
  int nRunLen;
  unsigned char pDstBuf[ SRAM_SIZE ];

  if ( !nSRAM_SaveFlag )
    return 0;  // It doesn't need to save it

  /*-------------------------------------------------------------------*/
  /*  Compress a SRAM data                                             */
  /*-------------------------------------------------------------------*/

  memset( nUsedTable, 0, sizeof nUsedTable );

  for ( nIdx = 0; nIdx < SRAM_SIZE; ++nIdx )
  {
    ++nUsedTable[ SRAM[ nIdx++ ] ];
  }
  for ( nIdx = 1, chTag = 0; nIdx < 256; ++nIdx )
  {
    if ( nUsedTable[ nIdx ] < nUsedTable[ chTag ] )
      chTag = nIdx;
  }

  nEncoded = 0;
  nEncLen = 0;
  nRunLen = 1;

  pDstBuf[ nEncLen++ ] = chTag;

  chPrevData = SRAM[ nEncoded++ ];

  while ( nEncoded < SRAM_SIZE && nEncLen < SRAM_SIZE - 133 )
  {
    chData = SRAM[ nEncoded++ ];

    if ( chPrevData == chData && nRunLen < 256 )
      ++nRunLen;
    else
    {
      if ( nRunLen >= 4 || chPrevData == chTag )
      {
        pDstBuf[ nEncLen++ ] = chTag;
        pDstBuf[ nEncLen++ ] = chPrevData;
        pDstBuf[ nEncLen++ ] = nRunLen - 1;
      }
      else
      {
        for ( nIdx = 0; nIdx < nRunLen; ++nIdx )
          pDstBuf[ nEncLen++ ] = chPrevData;
      }

      chPrevData = chData;
      nRunLen = 1;
    }

  }
  if ( nRunLen >= 4 || chPrevData == chTag )
  {
    pDstBuf[ nEncLen++ ] = chTag;
    pDstBuf[ nEncLen++ ] = chPrevData;
    pDstBuf[ nEncLen++ ] = nRunLen - 1;
  }
  else
  {
    for ( nIdx = 0; nIdx < nRunLen; ++nIdx )
      pDstBuf[ nEncLen++ ] = chPrevData;
  }

  /*-------------------------------------------------------------------*/
  /*  Write a SRAM data                                                */
  /*-------------------------------------------------------------------*/

  // Open SRAM file
  fp = fopen( szSaveName, "wb" );
  if ( fp == NULL )
    return -1;

  // Write SRAM data
  fwrite( pDstBuf, nEncLen, 1, fp );

  // Close SRAM file
  fclose( fp );

  // Successful
  return 0;
}

/*===================================================================*/
/*                                                                   */
/*                  InfoNES_Menu() : Menu screen                     */
/*                                                                   */
/*===================================================================*/
int InfoNES_Menu()
{
/*
 *  Menu screen
 *
 *  Return values
 *     0 : Normally
 *    -1 : Exit InfoNES
 */

	// Nothing to do here
  return 0;
}

/*===================================================================*/
/*                                                                   */
/*               InfoNES_ReadRom() : Read ROM image file             */
/*                                                                   */
/*===================================================================*/
int InfoNES_ReadRom( const char *pszFileName )
{
/*
 *  Read ROM image file
 *
 *  Parameters
 *    const char *pszFileName          (Read)
 *
 *  Return values
 *     0 : Normally
 *    -1 : Error
 */

  FILE *fp;

  /* Open ROM file */
  fp = fopen( pszFileName, "rb" );
  if ( fp == NULL )
    return -1;

  /* Read ROM Header */
  fread( &NesHeader, sizeof NesHeader, 1, fp );
  if ( memcmp( NesHeader.byID, "NES\x1a", 4 ) != 0 )
  {
    /* not .nes file */
    fclose( fp );
    return -1;
  }

⌨️ 快捷键说明

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